Swing基礎程序員
JFrame佈局
JPanelthis
繪圖:paintspa
監聽事件: ActionListener KeyListenercode
Listener和Adapterorm
計時器:Timer TimerTask對象
scheduleblog
timer.cancel();繼承
什麼是Swing接口
Swing是JDK提供的一整套 GUI(Graphical User Interface)圖形用戶界面API。經過Swing能夠構建平臺無關的桌面應用程序。
JFrame
JFrame用於封裝窗體,一個JFrame對象用於實現一個窗體,建立窗口,包含邊框、標題和用於關閉和圖標化窗口的按鈕;
實際應用中,一般採用繼承JFrame的方式,定義本身的窗體。
JPanel
JPanel對象表示「面板」, 用於將較小的輕量級組件組合在一塊兒; JFrame 有一個用於盛放組件的「內容面板」,一般能夠將其設置爲JPanel對象。
組件
添加經常使用組件
在Swing中,按鈕、文本框、標籤等都有特定的類與之對應,稱之爲「組件」;想將其添加到容器中,須要經過調用容器(JFrame或JPanel)的add方法。
組件添加到容器時,其位置與容器的佈局設置有關
class LoginFrame extends JFrame{ public LoginFrame(){ this.setSize(350, 220); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel=new JPanel();//建立空白麪板 panel.setBackground(Color.blue); this.add(panel);//將面板添加到窗口裏面 //建立3個對象 將3個對象添加到面板 JLabel label =new JLabel("姓名"); JTextField name = new JTextField(20);//字符數 JButton login =new JButton("登陸"); panel.add(label); panel.add(name); panel.add(login); } }
Graphics繪圖
繪圖原理
任何JComponent的擴展組件都可以進行繪製,想實現繪製必須重寫paint方法;對於任何狀況的窗口重繪事件,處理器都會通告組件,引起執行全部組件的paint方法,但有一點須要注意的是,paint方法必定不能本身調用,當窗口重繪時(如:窗口擴大,縮小,第一次顯示時等)系統會自動調用。
paint方法只有一個Graphics參數,封裝了各類繪製操做,能夠將其簡單的理解爲「畫筆」;該畫筆由系統建立,在調用paint方法時傳入,做爲程序員可調用該「畫筆」對象的各類方法實現繪製;
Graphics對象的度量單位是像素,座標(0,0)爲容器的左上角點。
class StagePanel extends JPanel{ public void paint(Graphics g){ g.setColor(Color.BLACK); g.fillRect(0, 0, getWidth(), getHeight()); } }
事件監聽
1. 回調模式
回調模式是指:若是一個方法的參數是接口類型,則在調用該方法時,須要建立並傳遞一個實現此接口類型的對象;而該方法在運行時會調用到參數對象中所實現的方法(接口中定義的)。
interface Action { public void doSth(); } class 類{ public static void main(String[] args) { repeat(5, new Action() { public void doSth() { System.out.println("Hello, World"); } }); } public static void repeat(int n, Action action) { for (int i = 0; i < n; i++) { action.doSth(); } } }
如上的代碼中,repeat方法須要一個Action接口類型的參數,其邏輯爲將此參數的doSth方法重複執行n次。在調用時,經過內部匿名類傳遞參數,此處的語義可解釋爲:經過接口回調傳遞了一個方法給repeat,讓repeat將其執行5次
2. 事件監聽機制
事件監聽能夠當作是回調模式在Swing組件響應用戶事件中的應用。
3. ActionListener
ActionListener通常用於監聽表示要開始某種操做的事件,如:按鈕上的單擊,文本框中輸入回車等。參見下面的代碼:
public interface ActionListener extends EventListener { public void actionPerformed(ActionEvent e); } JButton button = new JButton(); button.addActionListener (new ActionListener() { public void actionPerformed (ActionEvent e) { JButton button = (JButton) e.getSource(); button.setText("Don't click me!"); }});
其中,actionPerformed方法用於實現處理Action事件的操做其參數ActionEvent用於封裝Action事件的信息,它的getSource方法能夠獲取產生該事件的事件源對象。
4. KeyListener
KeyListener用於監聽鍵盤事件,其中包括鍵按下、鍵釋放以及鍵入(必須確保有Unicode字符的產生,例如組合鍵將不會產生鍵入事件)的事件。代碼以下:
public interface KeyListener extends EventListener { public void keyTyped(KeyEvent e); public void keyPressed(KeyEvent e); public void keyReleased(KeyEvent e); }
其中,KeyEvent的getKeyCode()方法用於得到所按下(釋放)的鍵值,能夠和KeyEvent所封裝的形如VK_XX比對以肯定所按下的鍵。
5. 監聽Listener和Adapter
有些場合,僅僅須要響應Listener的某些方法,但做爲實現Listener接口的對象又不得不實現其全部的方法,儘管某些方法只提供空的實現。JDK對某些Listener提供了相應的所謂Adapter,即實現了該Listener接口,而全部方法都爲空實現的抽象類。在實踐中,只需繼承該抽象類,重寫須要的方法便可。
代碼以下:
this.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { int key = e.getKeyCode();// [c] if (key == KeyEvent.VK_Q) {//Q表示退出 System.exit(0);// 結束Java進程 } if (pause) {// pause = true if (key == KeyEvent.VK_C) {//C表示繼續 continueAction(); repaint(); } return; } switch (key) { case KeyEvent.VK_LEFT: //tetromino.moveLeft(); moveLeftAction(); break; case KeyEvent.VK_SPACE : hardDropAction(); break; case KeyEvent.VK_UP: rotateRightAction(); break; case KeyEvent.VK_P://按鍵盤上的P表示暫停 pauseAction(); break; } repaint();// 再畫一次! } });
定時器
Timer和TimerTask
JDK提供的Timer類和TimerTask抽象類能夠以固定的週期運行某段程序。
schedule (TimerTask task, long delay,long period) 幾個參數(任務,延遲時間,間隔時間)
Timer 老婆 TimerTask 老婆命令
timer.cancel();
匿名內部類 在使用外部方法中的局部變量的時候 變量必須用final修飾
不知道怎麼用修飾詞的時候 要用private 儘量封裝
public class Demo02 { /** * @param args */ public static void main(String[] args) { final Timer timer =new Timer(); //局部內部類 在方法中有效 class MyTask extends TimerTask{ public void run(){ System.out.println("吃大餐"); } } timer.schedule(new MyTask(), 1000, 500); /*匿名類/局部內部類 訪問外部方法中的局部變量 * 這個變量必須是final類型的 不然編譯錯誤 */ TimerTask overTask = new TimerTask(){ public void run(){ timer.cancel(); //把timer上的綁定的任務取消 } }; timer.schedule(overTask, 1000*10); } }