流式布局FlowLayout
package net.zyz; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; public class TestFlowLayout { public static void main(String[] args) { Frame frame=new Frame("Flow Layout"); //設置窗口的布局方式為FlowLayout,元素在窗口中左對齊,元素水平間距為10,垂直間距為20 frame.setLayout(new FlowLayout(FlowLayout.LEFT,10,20)); for(int i=1;i<=10;i++){ frame.add(new Button("按紐"+i)); } frame.pack(); frame.setVisible(true); } }
邊界布局BorderLayout
package net.zyz; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; public class TestBorderLayout { public static void main(String[] args) { Frame frame=new Frame("Border Layout"); //邊界布局是frame默認的布局方式 Button button1=new Button("東"); frame.add(button1, BorderLayout.EAST); Button button2=new Button("西"); frame.add(button2, BorderLayout.WEST); Button button3=new Button("南"); frame.add(button3, BorderLayout.SOUTH); Button button4=new Button("北"); frame.add(button4, BorderLayout.NORTH); Button button5=new Button("中"); frame.add(button5, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } }
表格布局GridLayout
package net.zyz; import java.awt.Button; import java.awt.Frame; import java.awt.GridLayout; public class TestGridLayout { public static void main(String[] args) { Frame frame=new Frame("Grid Layout"); //frame默認的布局為BorderLayout frame.setLayout(new GridLayout(2, 3)); for(int i=1;i<=5;i++){ frame.add(new Button("按紐"+i)); } //setSize只指定窗口的大小,位置在原點(0,0) //setBound既可指定位置,又可指定大小 // frame.setSize(300,200); //pack會將窗口中的組件正好包裹起來,即大小自適應 frame.pack(); frame.setVisible(true); } }
綜合布局
package net.zyz; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Panel; public class TestMutiLayout { public static void main(String[] args) { Frame frame=new Frame("MutiLayout"); //窗口分成2行1列,分上下兩個panel frame.setLayout(new GridLayout(2, 1)); //第1個panel采用BorderLayout Panel p1=new Panel(); p1.setLayout(new BorderLayout()); Button b11=new Button("ButtonWest"); Button b12=new Button("ButtonEast"); //CENTER部分再使用panel並采用GridLayout Panel p11=new Panel(); p11.setLayout(new GridLayout(2, 1)); Button b13=new Button("ButtonUp"); Button b14=new Button("ButtonDown"); p11.add(b13); p11.add(b14); p1.add(b11, BorderLayout.EAST); p1.add(b12, BorderLayout.WEST); p1.add(p11, BorderLayout.CENTER); //第2個panel采用BorderLayout Panel p2=new Panel(); p2.setLayout(new BorderLayout()); Button b21=new Button("ButtonWest"); Button b22=new Button("ButtonEast"); //CENTER部分再使用panel並采用GridLayout Panel p21=new Panel(); p21.setLayout(new GridLayout(2, 2)); for(int i=1;i<=4;i++){ p21.add(new Button("Button")); } p2.add(b21, BorderLayout.EAST); p2.add(b22, BorderLayout.WEST); p2.add(p21, BorderLayout.CENTER); frame.add(p1); frame.add(p2); frame.setSize(300,200);; frame.setVisible(true); } }
繪圖Graphics
package net.zyz; import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; public class TestGraphics { public static void main(String[] args) { new FrameDraw(); } } class FrameDraw extends Frame{ /** * */ private static final long serialVersionUID = 1L; public FrameDraw() { setSize(400,300); setVisible(true); } @Override /** * Object->Component->Container->Window->Frame * paint是Container類的方法,在繼承Frame類中要重寫,重寫后系統就會自動調用 */ public void paint(Graphics g) { Color color=g.getColor(); g.setColor(Color.RED); g.drawOval(50, 50, 200, 150); g.setColor(new Color(0, 255, 0)); g.fillRect(100, 100, 200, 50); g.setColor(color); } }
動作事件監聽java.awt.event.ActionListener
Button
package net.zyz; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class TestActionListener { public static void main(String[] args) { new Frame2(); } } class Frame2 extends Frame { /** * */ private static final long serialVersionUID = 1L; public Frame2() { super("Event Listener"); Button button1 = new Button("button"); Button button2 = new Button("button"); button1.setActionCommand("button1"); button2.setActionCommand("button2"); //button1和button2加入同一個監聽器,如何區分? button1.addActionListener(new monitor()); button2.addActionListener(new monitor()); add(button1, BorderLayout.NORTH); add(button2, BorderLayout.SOUTH); pack(); setVisible(true); } } class monitor implements ActionListener { @Override public void actionPerformed(ActionEvent e) { Button button=(Button)e.getSource(); //首先要得到事件源對象,因getSource()返回的是Object,需強制轉換為Button String actionCommand=button.getActionCommand(); /** * Button的getLabel()方法得到是按紐上的文字,有可能兩個按紐的文本會一樣,如本例 * Button的getName()得到的是按紐的name,這個name值是由系統命名的,第1個Button的name是button0 * 最好使用getActionCommand()方法進行區分處理 */ if(actionCommand.equals("button1")){ System.out.println("你按下了button1按紐"); }else if(actionCommand.equals("button2")){ System.out.println("你按下了button2按紐"); } } }
TextField
package net.zyz; import java.awt.Frame; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class TestTextField { public static void main(String[] args) { new TFFrame(); } } class TFFrame extends Frame{ /** * */ private static final long serialVersionUID = 1L; public TFFrame() { TextField txt1=new TextField(10); //對於Button、TextField等標准組件,一般都采用ActionEvent txt1.addActionListener(new monitorTF()); add(txt1); pack(); setVisible(true); } } class monitorTF implements ActionListener{ @Override /** * 對於按紐來說默認的動作事件是單擊,文本框默認事件的是按回車鍵, * 這些事件執行時,系統回自動調用actionPerformed方法 * 所以需要在監聽器里要重寫該方法,ActionListener接口里也只有這一個方法 */ public void actionPerformed(ActionEvent e) { TextField tf1=(TextField)(e.getSource()); System.out.println(tf1.getText()); tf1.setText(""); } }
Window事件監聽WindowListener
package net.zyz; import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestWindowClose { public static void main(String[] args) { new FrameWindowCloseTest(); } } class FrameWindowCloseTest extends Frame { private static final long serialVersionUID = 1L; public FrameWindowCloseTest() { setSize(300, 200); setVisible(true); /* * addWindowListener方法的參數為繼承了WindowAdapter的匿名類 * 該匿名類直接寫在方法的內部 * 一般情況下很少使用,只有代碼簡單且無需變動時才臨時使用,推薦使用內部類 */ this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { setVisible(false); System.exit(0); } }); /* * addWindowListener()方法的參數為WindowListener對象 * 而WindowListener是一個接口,里面有6、7個類似windowClosing()的方法 * 如果要來實現接口的話,則需要實現接口里的每一個方法 * jdk提供了實現WinowListener接口的抽象類WindowAdapter, * 其實WindowApdater類中實現的方法並無實際代碼 * 對於類中的方法,子類是不需要全都實現。本例中只要重寫windowClosing()方法即可。 * monitor extends WindowAdapter implements WindowListener * WindowAdapter只是一個中間件,過渡一下 */ } }
鼠標事件監聽器MouseListener
package net.zyz; import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Iterator; public class TestMouseListener { public static void main(String[] args) { new FramePoints(); } } class FramePoints extends Frame{ private static final long serialVersionUID = 1L; ArrayList<Point> points; public FramePoints() { points=new ArrayList<Point>(); this.addMouseListener(new MonitorPoint()); this.addWindowListener(new WindowClose(this)); setSize(500,400); setVisible(true); } @Override public void paint(Graphics g) { g.setColor(Color.GREEN); Iterator<Point> iterator=points.iterator(); while (iterator.hasNext()) { Point point = (Point) iterator.next(); g.fillOval(point.x, point.y, 10, 10); } } //監聽鼠標事件:MouseAdapter implements MouseListener class MonitorPoint extends MouseAdapter{ @Override public void mousePressed(MouseEvent e) { FramePoints f=(FramePoints)e.getSource(); points.add(new Point(e.getX(), e.getY())); f.repaint(); } } //監聽窗口事件:WindowAdapter implements WindowListener // class MonitorWindow extends WindowAdapter{ // public void windowClosing(WindowEvent e) { // setVisible(false); // System.exit(0); // } // } }
按鍵事件監聽器KeyListener
package net.zyz; import java.awt.Frame; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestKey { public static void main(String[] args) { new FrameKey().lanch(); } } class FrameKey extends Frame { private static final long serialVersionUID = 1L; void lanch() { setSize(300, 200); this.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); /** * getKeyCode()方法得到是按鍵的虛擬鍵碼, * 如按A鍵無論大小寫都是65(美式鍵盤布局),而且跟鍵盤布局也有關。 * 如果按組合鍵的話,會激活多個keyPressed事件, * 如shift+A組合鍵getKeyCode()方法就會得到兩個鍵值,但getKeyChar()方法只會得到一個字符('a') * 所以keyPressed事件最好和getKeyCode()方法結合使用 * 虛擬鍵碼 用於報告按下了鍵盤上的哪個鍵,而不是一次或多次鍵擊組合生成的字符(如 "A" 是由 shift + "a" 生成的)。 * 例如,按下 Shift 鍵會生成 keyCode 為 VK_SHIFT 的 KEY_PRESSED 事件, * 而按下 'a' 鍵將生成 keyCode 為 VK_A 的 KEY_PRESSED 事件。 * 釋放 'a' 鍵后,會激發 keyCode 為 VK_A 的 KEY_RELEASED 事件。 * 另外,還會生成一個 keyChar 值為 'A' 的 KEY_TYPED 事件。 */ System.out.println(keyCode); System.out.println(e.getKeyChar()); switch (keyCode) { case KeyEvent.VK_UP: System.out.println("up"); break; case KeyEvent.VK_DOWN: System.out.println("down"); break; case KeyEvent.VK_LEFT: System.out.println("left"); break; case KeyEvent.VK_RIGHT: System.out.println("right"); break; default: break; } } }); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { setVisible(false); System.exit(0); } }); setVisible(true); } }