使用PJEE 請撰寫底下程式碼 -------------------- Main.java import java.awt.*; public class Main { public static void main(String args[]) { Frame f = new Frame("視窗") ; f.setSize(200,200) ; f.add(new Button("按下我")) ; f.addWindowListener(new MyAdapter()) ; f.show() ; } } -------------- MyHandler.java import java.awt.event.*; public class MyHandler implements ActionListener { public void actionPerformed(ActionEvent e) { System.exit(0) ; } } -------------- MyAdapter.java import java.awt.event.*; public class MyAdapter extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0) ; } } ------------------------ 完成之後,請使用下列指令進行編譯 -------------------- javac -bootclasspath d:\pjee3.1\lib\classes.zip -target 1.1 Main.java ------------------------ 編譯完成之後,請使用下指令執行程式: -------------------- d:\pjee3.1\bin\pjava Main ------------------------ 設定字型檔 由於自行設定的問題,所以中文無法出現,請建立一個名為font.properties.zh_TW的文字檔,並將他複製至\lib底下,重新執行即可。 -------------------- font.properties.zh_TW # @(#)font.properties.zh_TW 1.8 98/01/26 # # AWT Font default Properties for Traditional Chinese Windows # dialog.0=Arial,ANSI_CHARSET dialog.1=\u7d30\u660e\u9ad4,CHINESEBIG5_CHARSET,NEED_CONVERTED dialog.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED dialog.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED dialoginput.0=Courier New,ANSI_CHARSET dialoginput.1=\u7d30\u660e\u9ad4,CHINESEBIG5_CHARSET,NEED_CONVERTED dialoginput.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED dialoginput.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED serif.0=Times New Roman,ANSI_CHARSET serif.1=\u7d30\u660e\u9ad4,CHINESEBIG5_CHARSET,NEED_CONVERTED serif.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED serif.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED sansserif.0=Arial,ANSI_CHARSET sansserif.1=\u7d30\u660e\u9ad4,CHINESEBIG5_CHARSET,NEED_CONVERTED sansserif.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED sansserif.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED monospaced.0=\u7d30\u660e\u9ad4,CHINESEBIG5_CHARSET,NEED_CONVERTED monospaced.1=\u7d30\u660e\u9ad4,CHINESEBIG5_CHARSET,NEED_CONVERTED monospaced.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED monospaced.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED # name aliases # # alias.timesroman=serif # alias.helvetica=sansserif # alias.courier=monospaced # for backword compatibility timesroman.0=Times New Roman,ANSI_CHARSET helvetica.0=Arial,ANSI_CHARSET courier.0=Courier New,ANSI_CHARSET zapfdingbats.0=WingDings,SYMBOL_CHARSET # Default font definition # default.char=2751 # Static FontCharset info. # fontcharset.dialog.1=sun.io.CharToByteMS950 fontcharset.dialog.2=sun.awt.windows.CharToByteWingDings fontcharset.dialog.3=sun.awt.CharToByteSymbol fontcharset.dialoginput.1=sun.io.CharToByteMS950 fontcharset.dialoginput.2=sun.awt.windows.CharToByteWingDings fontcharset.dialoginput.3=sun.awt.CharToByteSymbol fontcharset.serif.1=sun.io.CharToByteMS950 fontcharset.serif.2=sun.awt.windows.CharToByteWingDings fontcharset.serif.3=sun.awt.CharToByteSymbol fontcharset.sansserif.1=sun.io.CharToByteMS950 fontcharset.sansserif.2=sun.awt.windows.CharToByteWingDings fontcharset.sansserif.3=sun.awt.CharToByteSymbol fontcharset.monospaced.1=sun.io.CharToByteMS950 fontcharset.monospaced.2=sun.awt.windows.CharToByteWingDings fontcharset.monospaced.3=sun.awt.CharToByteSymbol # Exclusion Range info. # exclusion.dialog.0=0100-f8ff exclusion.dialoginput.0=0100-f8ff exclusion.serif.0=0100-f8ff exclusion.sansserif.0=0100-f8ff exclusion.monospaced.0=0100-f8ff # charset for text input # inputtextcharset=CHINESEBIG5_CHARSET ------------------------ 如果想了解font.properties的設定內容,我們可以到\jre\lib目錄下,執行下面指令 -------------------- native2ascii -reverse -encoding MS950 font.properties.zh_TW a.txt ------------------------ 如果修改完成之後,一定要使用 -------------------- native2ascii -encoding MS950 a.txt font.properties.zh_TW ------------------------ 將內容還原成ASCII型態的Unicode。 使用擴充函式庫(Swing) Swing 1.1.1版是針對JDK 1.1.x而設計,所以也能夠架設在Personal Java之上,請解開Swing 1.1.1,我們需要的只有swingall.jar。 ----------程---------- Main.java import javax.swing.*; public class Main { public static void main(String args[]) { JFrame f = new JFrame("視窗") ; f.setSize(200,200) ; f.addWindowListener(new MyAdapter()) ; JButton btn = new JButton("按下我") ; btn.addActionListener(new MyHandler()) ; f.getContentPane().add(btn) ; f.show() ; } } ------------------------ 使用底下指令進行編譯 -------------------- javac -bootclasspath d:\pjee3.1\lib\classes.zip -classpath swingall. jar;. -target 1.1 Main.java ------------------------ 執行指令 -------------------- javac -deprecation -bootclasspath d:\pjee3.1\lib\classes.zip -classpath swingall.jar;. -target 1.1 –d . SwingUtilities.java ------------------------ 執行指令 -------------------- jar uvf swingall.jar javax\swing\SwingUtilities.class ------------------------ 即可修正此Bug。 ●BorderLayout的使用 -------------------- BorderLayoutTest.java import java.awt.*; public class BorderLayoutTest { public static void main(String args[]) { Frame f = new Frame("視窗") ; f.setSize(200,200) ; f.add(new Button("中")) ; f.add(new Button("東"),"East") ; f.add(new Button("西"),"West") ; f.add(new Button("南"),"South") ; f.add(new Button("北"),"North") ; f.show() ; } } ------------------------ ●FlowLayout的使用 -------------------- FlowLayoutTest.java import java.awt.*; public class FlowLayoutTest { public static void main(String args[]) { Frame f = new Frame("視窗") ; f.setSize(200,200) ; Panel p = new Panel() ; p.add(new Button("按鈕1")) ; p.add(new Button("按鈕2")) ; p.add(new Button("按鈕3")) ; f.add(p); f.show() ; } } ------------------------ ●GridLayout的使用 -------------------- GridLayoutTest.java import java.awt.*; public class GridLayoutTest { public static void main(String args[]) { Frame f = new Frame("視窗") ; f.setSize(200,200) ; Panel p = new Panel() ; p.setLayout(new GridLayout(2,3)) ; p.add(new Button("按鈕1")) ; p.add(new Button("按鈕2")) ; p.add(new Button("按鈕3")) ; p.add(new Button("按鈕4")) ; p.add(new Button("按鈕5")) ; p.add(new Button("按鈕6")) ; f.add(p); f.show() ; } } ------------------------ ●CardLayout的使用 ----------程---------- CardLayoutTest.java import java.awt.*; import java.awt.event.*; public class CardLayoutTest implements ActionListener { CardLayout cl = new CardLayout() ; Frame f = new Frame("視窗") ; Panel p = new Panel() ; public static void main(String args[]) { new CardLayoutTest() ; } public CardLayoutTest() { f.setSize(200,200) ; p.setLayout(cl) ; Button b1 = new Button("按鈕1") ; b1.addActionListener(this) ; Button b2 = new Button("按鈕2") ; b2.addActionListener(this) ; Button b3 = new Button("按鈕3") ; b3.addActionListener(this) ; p.add(b1,"1") ; p.add(b2,"2") ; p.add(b3,"3") ; f.add(p); f.show() ; } public void actionPerformed(ActionEvent e) { cl.next(p) ; } } ------------------------ 繪圖 如果要做圖形處理,最好的方法就是繼承java.applet.Applet類別,並實作其paint()方法。 ----------程---------- GraphicTest.java import java.awt.*; import java.applet.*; public class GraphicTest extends Applet { public static void main(String args[]) { Frame f = new Frame("視窗") ; f.setSize(200,200) ; f.add(new GraphicTest()) ; f.show() ; } public void paint(Graphics g) { g.drawString("哈囉",20,20) ; g.drawOval(50,50,50,50) ; } } ------------------------ Mouse事件(MouseListener與MouseEvent) 在實際機器上,滑鼠事件通常是由觸控筆或虛擬游標產生。 ----------程---------- MouseTest.java import java.awt.*; import java.awt.event.*; import java.applet.*; public class MouseTest extends Applet implements MouseListener { String message = "開始" ; int x = 0 ; int y = 0 ; public static void main(String args[]) { Frame f = new Frame("視窗") ; f.setSize(200,200) ; MouseTest mt = new MouseTest() ; mt.addMouseListener(mt) ; f.add(mt) ; f.show() ; } public void paint(Graphics g) { g.drawString("目前狀態: "+message,10,30) ; g.drawString("X座標: "+x,10,50) ; g.drawString("y座標: "+y,10,70) ; } public void mouseClicked(MouseEvent e) { message = "滑鼠被按一下" ; x = e.getX() ; y = e.getY() ; repaint(); } public void mousePressed(MouseEvent e) { message = "滑鼠被按下" ; x = e.getX() ; y = e.getY() ; repaint(); } public void mouseReleased(MouseEvent e) { message = "滑鼠被放開" ; x = e.getX() ; y = e.getY() ; repaint(); } public void mouseEntered(MouseEvent e) { message = "滑鼠進入範圍" ; x = e.getX() ; y = e.getY() ; repaint(); } public void mouseExited(MouseEvent e) { message = "滑鼠離開範圍" ; x = e.getX() ; y = e.getY() ; repaint(); } } ------------------------ Mouse移動事件(MouseMotionListener與MouseEvent) 在實際機器上,如果我們使用觸控筆按住觸控螢幕再行拖曳,就會產生Mouse移動事件。 ----------程---------- MouseMotionTest.java import java.awt.*; import java.awt.event.*; import java.applet.*; public class MouseMotionTest extends Applet implements MouseListener,MouseMotionListener { int sx = 0 ; int sy = 0 ; int dx = 0 ; int dy = 0 ; public static void main(String args[]) { Frame f = new Frame("視窗") ; f.setSize(200,200) ; MouseMotionTest mt = new MouseMotionTest() ; mt.addMouseListener(mt) ; mt.addMouseMotionListener(mt) ; f.add(mt) ; f.show() ; } public void paint(Graphics g) { g.drawLine(sx,sy,dx,dy) ; } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { sx = e.getX() ; sy = e.getY() ; } public void mouseReleased(MouseEvent e) { dx = e.getX() ; dy = e.getY() ; repaint(); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseDragged(MouseEvent e) { dx = e.getX() ; dy = e.getY() ; repaint(); } public void mouseMoved(MouseEvent e) { } } CheckBox Checkbox元件通常拿來進行多重選擇,其用法如下: ----------程---------- ChcekboxTest.java import java.awt.*; import java.awt.event.* ; public class CheckboxTest implements ItemListener { public static void main(String args[]) { new CheckboxTest() ; } Checkbox cb1 = new Checkbox("選項1") ; Checkbox cb2 = new Checkbox("選項1",true) ; public CheckboxTest() { Frame f = new Frame("視窗") ; f.setLayout(new GridLayout(2,1)) ; f.setSize(200,200) ; cb1.addItemListener(this) ; cb2.addItemListener(this) ; f.add(cb1) ; f.add(cb2) ; f.pack() ; f.show() ; } public void itemStateChanged(ItemEvent e) { Checkbox cb = (Checkbox) e.getSource() ; System.out.println(cb.getLabel()) ; System.out.println(cb.getState()) ; } } ------------------------ CheckBoxGroup CheckboxGroup元件通常拿來進行多重選擇,其用法如下: ----------程---------- CheckboxGroupTest.java import java.awt.*; import java.awt.event.* ; public class CheckboxGroupTest implements ItemListener { public static void main(String args[]) { new CheckboxGroupTest() ; } Checkbox cb1 = new Checkbox("選項1") ; Checkbox cb2 = new Checkbox("選項2") ; public CheckboxGroupTest() { Frame f = new Frame("視窗") ; f.setLayout(new GridLayout(2,1)) ; f.setSize(200,200) ; CheckboxGroup cg = new CheckboxGroup() ; cb1.setCheckboxGroup(cg) ; cb2.setCheckboxGroup(cg) ; cb1.addItemListener(this) ; cb2.addItemListener(this) ; f.add(cb1) ; f.add(cb2) ; f.pack() ; f.show() ; } public void itemStateChanged(ItemEvent e) { Checkbox cb = (Checkbox) e.getSource() ; System.out.println(cb.getLabel()) ; System.out.println(cb.getState()) ; } } ------------------------ Choice Choice元件通常拿來進行多重選擇,不過它比CheckboxGroup佔用的畫面空間還要少,其用法如下: ----------程---------- ChoiceTest.java import java.awt.*; import java.awt.event.* ; public class ChoiceTest implements ItemListener { public static void main(String args[]) { new ChoiceTest() ; } public ChoiceTest() { Frame f = new Frame("視窗") ; f.setSize(200,200) ; Choice c = new Choice() ; c.addItemListener(this) ; c.add("選擇1") ; c.add("選擇2") ; c.add("選擇3") ; f.add(new Label("請選擇"),"North") ; f.add(c) ; f.pack() ; f.show() ; } public void itemStateChanged(ItemEvent e) { Choice c = (Choice) e.getSource() ; System.out.println(c.getSelectedIndex()) ; System.out.println(c.getSelectedItem()) ; } } ------------------------ List List元件可以拿來進行單選或多重選擇,我們可以決定它要佔用多少螢幕空間,其用法如下: ----------程---------- ListTest.java import java.awt.*; import java.awt.event.* ; public class ListTest implements ItemListener { public static void main(String args[]) { new ListTest() ; } public ListTest() { Frame f = new Frame("視窗") ; f.setSize(200,200) ; List l = new List() ; l.addItemListener(this) ; l.add("選擇1") ; l.add("選擇2") ; l.add("選擇3") ; f.add(new Label("請選擇"),"North") ; f.add(l) ; f.pack() ; f.show() ; } public void itemStateChanged(ItemEvent e) { List l = (List) e.getSource() ; System.out.println(l.getSelectedIndex()) ; System.out.println(l.getSelectedItem()) ; } } ------------------------ TextField TextField允許我們輸入文字,其用法如下: ----------程---------- TextFieldTest.java import java.awt.*; import java.awt.event.* ; public class TextFieldTest implements ActionListener,TextListener { public static void main(String args[]) { new TextFieldTest() ; } Label l = new Label("") ; TextField tf = new TextField("",20) ; public TextFieldTest() { Frame f = new Frame("視窗") ; f.setSize(200,200) ; tf.addActionListener(this) ; tf.addTextListener(this) ; f.add(tf,"North") ; f.add(l) ; f.pack() ; f.show() ; } public void actionPerformed(ActionEvent e) { tf.setText("") ; } public void textValueChanged(TextEvent e) { l.setText(tf.getText()) ; } } ------------------------ TextArea TextArea和TextField類似,不過TextArea可以存放多行字,而且不會因為Enter引發ActionEvent。我們還可以設定TextArea是否顯示垂直或水平方向的捲動軸。使用範例如下: ----------程---------- TextAreaTest.java import java.awt.*; import java.awt.event.* ; public class TextAreaTest { public static void main(String args[]) { new TextAreaTest() ; } public TextAreaTest() { Frame f = new Frame("視窗") ; f.setLayout(new GridLayout(4,1)); f.setSize(200,200) ; String str = "1234567890 234567890 34567890 4567890" ; TextArea ta1 = new TextArea(str,2,10,TextArea.SCROLLBARS_NONE) ; TextArea ta2 = new TextArea(str,2,10,TextArea.SCROLLBARS_HORIZONTAL_ONLY) ; TextArea ta3 = new TextArea(str,2,10,TextArea.SCROLLBARS_VERTICAL_ONLY) ; TextArea ta4 = new TextArea(str,2,10,TextArea.SCROLLBARS_BOTH) ; f.add(ta1) ; f.add(ta2) ; f.add(ta3) ; f.add(ta4) ; f.pack() ; f.show() ; } } ------------------------