Swing基礎

 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();// 再畫一次!
            }
        });

 

 定時器
TimerTimerTask

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);
    }

}
相關文章
相關標籤/搜索