2019年4月10日 星期三

在樹莓派上編譯執行 Java 程式

最近安裝新版樹莓派 Raspbian Stretch (2018-11-13) 後注意到 Raspbian 除了內建 Python2 與 Python3 外, 也內建了 JDK 8, 版本是 1.8.0_65 :

pi@raspberrypi:~ $ java -version   
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) Client VM (build 25.65-b01, mixed mode)
pi@raspberrypi:~ $ javac -version 
javac 1.8.0_65

我自 2014 年後就沒有再碰 Java 了 (記得那年六月陪姊姊去南二中參加美術班術科考試時我正忙著測試 Java Swing 的 Data Grid 呢), 因為後來都在用 Javascript 與 Python, 五年多沒用 Java 真的變生疏了. 原本想說就此與 Java 說掰掰分道揚鑣, 但後來覺得藝不嫌多, 已經有的又何必丟掉呢?

既然樹莓派必載 Java, 那麼今天就來複習一下 Java 吧!

首先用 nano 編輯一個 HelloWorld.java 如下 :

pi@raspberrypi:~ $ nano HelloWorld.java 
pi@raspberrypi:~ $ cat HelloWorld.java 
public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, world!");
    }
  }

然後馬上用 javac 編譯為 HelloWorld.class, 再用 java 執行它 :

pi@raspberrypi:~ $ javac HelloWorld.java 
pi@raspberrypi:~ $ java HelloWorld   
Hello, world! 

參考 :

葉難: Raspberry Pi與Java 8:Hello World

下面測試 Swing 功能, 參考之前的文章 :

# Java Swing 測試 : JOptionPane 對話框

開啟 nano 貼入範例程式 JOptionPane7.java :

pi@raspberrypi:~ $ nano JOptionPane7.java
pi@raspberrypi:~ $ cat JOptionPane7.java 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class JOptionPane7 implements ActionListener {
  JFrame f;
  JMenuBar mb;
  JMenu jop,messages,options;
  JMenuItem[] dialog;
  JRadioButtonMenuItem[] mType;
  JRadioButtonMenuItem[] oType;
  public static void main(String argv[]) {
    new JOptionPane7();
    }
  public JOptionPane7() {
    //Setup JFrame
    JFrame.setDefaultLookAndFeelDecorated(true);
    JDialog.setDefaultLookAndFeelDecorated(true);
    f=new JFrame("JOptionPane Test");
    f.setSize(400,300);
    f.setLocationRelativeTo(null);
    Container cp=f.getContentPane();
    cp.setLayout(null);
    f.setVisible(true);

    //Build Elements
    mb=new JMenuBar();
    jop=new JMenu("JOptionPane");
    messages=new JMenu("Message Type");
    options=new JMenu("Option Type");
    dialog=new JMenuItem[4];
    dialog[0]=new JMenuItem("setMessageDialog()");
    dialog[1]=new JMenuItem("setConfirmDialog()");
    dialog[2]=new JMenuItem("setInputDialog()");
    dialog[3]=new JMenuItem("setOptionDialog()");
    mType=new JRadioButtonMenuItem[5];
    mType[0]=new JRadioButtonMenuItem("ERROR_MESSAGE");
    mType[1]=new JRadioButtonMenuItem("INFORMATION_MESSAGE");
    mType[2]=new JRadioButtonMenuItem("WARNING_MESSAGE");
    mType[3]=new JRadioButtonMenuItem("QUESTION_MESSAGE");
    mType[4]=new JRadioButtonMenuItem("PLAIN_MESSAGE");
    oType=new JRadioButtonMenuItem[4];
    oType[0]=new JRadioButtonMenuItem("DEFAULT_OPTION");
    oType[1]=new JRadioButtonMenuItem("YES_NO_OPTION");
    oType[2]=new JRadioButtonMenuItem("YES_NO_CANCEL_OPTION");
    oType[3]=new JRadioButtonMenuItem("OK_CANCEL_OPTION");
    for (int i=0; i<dialog.length; i++) {
      jop.add(dialog[i]);
      dialog[i].addActionListener(this);
      }
    jop.addSeparator();
    ButtonGroup mgroup=new ButtonGroup();
    for (int i=0; i<mType.length; i++) {
      messages.add(mType[i]);
      mgroup.add(mType[i]);
      mType[i].addActionListener(this);
      if (i==0) {mType[i].setSelected(true);}
      }
    ButtonGroup ogroup=new ButtonGroup();
    for (int i=0; i<oType.length; i++) {
      options.add(oType[i]);
      ogroup.add(oType[i]);
      oType[i].addActionListener(this);
      if (i==0) {oType[i].setSelected(true);}
      }
    jop.add(messages);
    jop.add(options);
    mb.add(jop);
    f.setJMenuBar(mb);
 
    //Close JFrame     
    f.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
    f.addWindowListener(new WindowHandler(f));
    }
  public void actionPerformed(ActionEvent e) {
    String cmd=e.getActionCommand();
    if (cmd.equals("setMessageDialog()")) {
      int mtype=getMessageType();
      JOptionPane.showMessageDialog(f,"Hello World! 您好","資訊",mtype);
      }
    if (cmd.equals("setConfirmDialog()")) {
      int mtype=getMessageType();
      int otype=getOptionType();
      int opt=JOptionPane.showConfirmDialog(f,cmd,"確認",otype,mtype);
      showSelectedOption(opt);
      }
    if (cmd.equals("setInputDialog()")) {
      int mtype=getMessageType();
      String input=JOptionPane.showInputDialog(f,cmd,"輸入",mtype);
      JOptionPane.showMessageDialog(f,"您輸入的是 : " + input);
      }
    if (cmd.equals("setOptionDialog()")) {
      String[] options={"接受","不接受","取消"};
      int mtype=getMessageType();
      int otype=getOptionType();
      int opt=JOptionPane.showOptionDialog(f,cmd,"請選擇",otype,mtype,null,
                                           options,"接受");
      showSelectedOption(opt);
      }
    }
  public int getMessageType() {
    int type=1;
    for (int i=0; i<mType.length; i++) {
      if (mType[i].isSelected()) {
        switch (mType[i].getText()) {
          case "ERROR_MESSAGE" : type=0;break;
          case "INFORMATION_MESSAGE" : type=1;break;
          case "WARNING_MESSAGE" : type=2;break;
          case "QUESTION_MESSAGE" : type=3;break;
          case "PLAIN_MESSAGE" : type=-1;break;
          }
        }
      }
    return type;
    }
  public int getOptionType() {
    int type=1;
    for (int i=0; i<oType.length; i++) {
      if (oType[i].isSelected()) {
        switch (oType[i].getText()) {
          case "DEFAULT_OPTION" : type=-1;break;
          case "YES_NO_OPTION" : type=0;break;
          case "YES_NO_CANCEL_OPTION" : type=1;break;
          case "OK_CANCEL_OPTION" : type=2;break;
          }
        }
      }
    return type;
    }
  public void showSelectedOption(int opt) {
    if (opt==JOptionPane.YES_OPTION) {
      JOptionPane.showMessageDialog(f,"您按了 YES (是) " + opt);
      }
    else if (opt==JOptionPane.NO_OPTION) {
      JOptionPane.showMessageDialog(f,"您按了 NO (否) " + opt);
      }
    else if (opt==JOptionPane.CANCEL_OPTION) {
      JOptionPane.showMessageDialog(f,"您按了 CANCEL (取消) " + opt);
      }
    else if (opt==JOptionPane.CLOSED_OPTION) {
      JOptionPane.showMessageDialog(f,"您按了 CLOSE (關閉) " + opt);
      }
    else if (opt==JOptionPane.OK_OPTION) {
      JOptionPane.showMessageDialog(f,"您按了 OK (確定) " + opt);
      }
    }
  }
class WindowHandler extends WindowAdapter {
  JFrame f;
  public WindowHandler(JFrame f) {this.f=f;}
  public void windowClosing(WindowEvent e) {
    int result=JOptionPane.showConfirmDialog(f,
               "確定要結束程式嗎?",
               "確認訊息",
               JOptionPane.YES_NO_OPTION,
               JOptionPane.WARNING_MESSAGE);
    if (result==JOptionPane.YES_OPTION) {System.exit(0);}
    } 
  }
pi@raspberrypi:~ $ javac JOptionPane7.java 
pi@raspberrypi:~ $ java JOptionPane7 




Swing 發展已經非常成熟, 我那時是在 Java 6 上寫的測試程式, 過這麼久了在 Java 8 也是沒問題的.

沒有留言 :