随着互联网技术的快速发展,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);
}
}
全部0条评论
快来发表一下你的评论吧 !