隨著互聯網技術的快速發展,Java語言以其簡單可靠,安全性高,可移植性強等特點得到極大普及,長期占據編程語言排行榜第一的位置,特別是在嵌入式領域得到了越來越多的應用。為了滿足客戶在嵌入式主板上運行Java程序的需求,英創公司在ESM335x、ESM6800等主流產品型號中移植了針對嵌入式Linux的JRE(Java Runtime Environment),以支持常規的Java通訊、控制類程序的運行。JRE的運行需要占用的內存超過100MB,英創公司的低成本嵌入式主板ESM6800H和ESM6800V即可滿足Java虛擬機對硬件環境的要求。進一步,ESM6800H和ESM6800V這二款型號的主板還可以支持X11圖形系統。在X11圖形系統的環境中,就可以直接通過Java的圖形用戶接口實現圖形界面的開發,其開發過程類似于WinCE+C#,這樣就彌補了ESM6800沒有WinCE系統,從而不能使用C#開發界面的遺憾。
Java的圖形用戶接口可以讓用戶構建一個通用的界面,使其在所有平臺上都能正常顯示,Java構建界面要使用抽象窗口工具包AWT(Abstract Window Toolkit)和Swing。Swing可以看作是AWT的改良版,而不是代替AWT,是對AWT的提高和擴展。所以,在實現界面的程序中,Swing和AWT都要用到,它們共存于Java基礎類(Java Foundation Class,JFC)中。用戶通過英創公司提供的eclipse軟件就能夠完成圖形界面程序的開發。環境搭建的詳細方法可以參考文章:《英創主板JAVA應用開發簡介》。本文主要簡要介紹何如使用Java實現圖形界面。
Java的圖形接口組件按其作用可分為基本組件(Component)和容器(Container)兩大類:基本組件,不能容納其他組件,如按鈕、文本框等圖形界面元素。容器可以用來容納其他的組件,如窗口、對話框等,下面是常用組件的列表。
組件名稱 | 組件簡介 |
JTextField | 單行文本框,為用戶處理輸入信息 |
JTextArea | 多行文本框,為用戶處理輸入信息 |
JButton | 按鈕類,為用戶提供具有文本和圖標的按鈕 |
JLabel | 標簽,為用戶提供包含說明性文本和圖標 |
JCheckBox | 復選框,為用戶提供多項選擇 |
JRadioButton | 單選按鈕,為用戶提供單項選擇 |
JComboBox | 組合框,為用戶提供下拉菜單 |
JPasswordField | 密碼框,允許輸入單行密碼,密碼框默認回顯字符是“*” |
圖形窗口一般是上述各個組件的承載體,處于非常重要的位置,在JAVA中常用的窗體包括JFrame和JDialog這兩種形式。
窗體名稱 | 簡介 |
JFrame | 框架窗口,它支持窗口周邊的框架、標題欄,以及最小化、最大化和關閉按鈕 |
JDialog | 對話框基類,為用戶提供構造并管理通用對話框 |
我們以串口通訊為例,通過Java實現一個簡單的串口測試界面。
窗口是圖形界面的基礎,所有用戶設計的可視組件都是放在窗口中的,所以首先我們需要構建一個窗口,下面我們就使用框架窗口(JFrame)來構建一個窗口對象:
public class MainGui extends JFrame {
public MainGui() {
setSize(800, 480);
setTitle("串口測試程序");
setLocationRelativeTo(null);
setDefaultCloseOperation(MainGui.EXIT_ON_CLOSE);
setVisible(true);
}
}
我們給窗口取名為“串口測試程序”,接下來我們在串口上增加提供打開串口操作、關閉串口操作和發送數據的按鈕,按鈕(JButton)在界面中用于觸發動作事件,按鈕上可以顯示文本,當按鈕動作時,能觸發動作事件,按鈕動作事件的相關接口類是ActionListener, 構建按鈕的部分代碼如下:
class RightPanel extends JPanel {
public RightPanel() {
this.setLayout(new GridLayout(13, 1, 0, 5));
JButton button_open = new JButton("打開串口");
JButton button_write = new JButton("發送");
JButton button_close = new JButton("關閉串口");
button_open.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mes = tty + ":" + baud + "-8-1-0";
exitflag = true;
if(Serial_Port.openport(mes.toString()) == -1)
JOptionPane.showMessageDialog(null,"open fail!","消息框",JOptionPane.YES_OPTION);
button_open.setEnabled(false);
button_write.setEnabled(true);
button_close.setEnabled(true);
}
});
button_write.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String strs = textPane.getText();
String send_buf = ToolsFunc.formatHexString(strs);
System.out.print(send_buf.length());
if(send_buf.length() > 1)
{
System.out.println(send_buf);
Serial_Port.writeport(strs);
}
}
});
button_close.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Serial_Port.closeport();
button_open.setEnabled(true);
button_write.setEnabled(false);
button_close.setEnabled(false);
}
});
add(button_open);
add(button_write);
add(button_close);
button_open.setEnabled(true);
button_write.setEnabled(false);
button_close.setEnabled(false);
}
}
接下來我們為串口的接受和發送的數據添加兩個顯示區域,可以選擇文本框(JTextField)和文本區(JTextArea)來實現,文本框與文本區的主要區別是文本區可存放多行文本。在這里我們選用文本區來實現,并用GridBagLayout進行兩個文本區的布局管理,構建文本區的部分代碼如下:
class CenterPanel extends JPanel {
public CenterPanel() {
GridBagLayout layout = new GridBagLayout();
GridBagConstraints s= new GridBagConstraints();
this.setLayout(layout);
textField = new JTextArea(20, 50);
textField.setTabSize(4);
textField.setLineWrap(true);
textField.setEditable(false);
JScrollPane jscrollPane = new JScrollPane(textField);
textPane = new JTextArea(1, 50);
textPane.setCursor(new Cursor(Cursor.TEXT_CURSOR));
JScrollPane jscrollPane_1 = new JScrollPane(textPane);
textPane.setLineWrap(true);
this.add(jscrollPane);
this.add(jscrollPane_1);
s.gridwidth=0;
s.weightx = 0.5;
s.ipady = 320;
s.ipadx = 640;
s.weighty=0.8;
layout.setConstraints(jscrollPane, s);
s.gridwidth=0;
s.weightx = 0.5;
s.ipady = 10;
s.weighty=0.1;
layout.setConstraints(jscrollPane_1, s);
}
}
通過Java實現的界面如下圖:
本篇文章只對界面的實現進行了簡單的介紹,關于對于串口的操作,英創公司將提供訪問硬件所需的名為libemtronixhardware.so的動態庫和相關接口Java類源文件給客戶。libemtronixhardware.so完全符合JNI規范,用戶加載之后,即可通過英創公司提供的java類,訪問硬件接口。
如果需要完整代碼,可與英創公司的工程師聯系索取。
成都英創信息技術有限公司 028-8618 0660