技术天地

在低成本工控主板上开发Java图形应用程序作者:黄志超    发布时间:2017-12-5 10:22:14    被阅览数:

  随着互联网技术的快速发展,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实现的界面如下图:


在低成本工控主板上开发Java图形应用程序.gif


  本篇文章只对界面的实现进行了简单的介绍,关于对于串口的操作,英创公司将提供访问硬件所需的名为libemtronixhardware.so的动态库和相关接口Java类源文件给客户。libemtronixhardware.so完全符合JNI规范,用户加载之后,即可通过英创公司提供的java类,访问硬件接口。


  如果需要完整代码,可与英创公司的工程师联系索取。

Go Top