java 圖形化界面筆記(1)

目錄


JFrame窗體................................................................................................. 1java

 


* 方法顏色服務器

* 小節顏色多線程

* 引發注意app

 

1、JFrame  窗體編輯器

  • 建立窗體
    在開發Java應用程序時,一般狀況下利用JFrame建立窗口。利用JFrame建立的窗口分別包含一個標題、最小化按鈕、最大化按鈕和關閉按鈕佈局

    在利用JFrame建立窗口時,須要設置單擊關閉按鈕時執行的動做 ,設置方法爲經過JFrame對象的setDefault CloseOperation(int operation)方法,該方法的入口參數能夠從JFrame類的靜態常量中選擇,可選的靜態常量(代碼的下方)測試

    public class Test(){
        public static void main(String[] args){
            JFrame frame = new JFrame(「新的窗口」);      // 新建一個窗體,窗體的標題是「」中的內容,
            JPanel panel = new JPanel();             // Jpanel 是面板容器類,包含在swing中;
            JTextArea textArea = new JTextArea();     //  JTextArea  文本區, JTextField文本框 
            
            panel.setLayout(new GridLayout());        // Layout是佈局; GridLayout 網格型佈局
            textArea.setText("test");
            //當TextArea裏的內容過長時生成滾動條
            panel.add(new JScrollPane(textArea));
            frame.add(panel);                       //在新建的窗體中添加面板;
            
            frame.setSize(200,200);                  //設置窗體的尺寸
            frame.setVisible(true);                  //注意這一步必定要最後調用,使得這個窗體可見,false是不可見;
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); //定義了點擊關閉按鈕的做用; } }

    setDefaultCloseOperation(int operation):設置用戶在此窗體上發起 "close" 時默認執行的操做。方法中的參數解釋以下:this

     爲「0」或DO_NOTHING_ON_CLOSE:spa

    (在 WindowConstants 中定義):不執行任何操做;要求程序在已註冊的WindowListener 對象的 windowClosing 方法中處理該操做。線程

    好比實例程序代碼中更改成f.setDefaultCloseOperation(f. DO_NOTHING_ON_CLOSE);或者f.setDefaultCloseOperation(0),而後查看效果,能夠發現窗口沒法關閉,下面是相同測試方法,再也不解釋了。

     爲「1」或HIDE_ON_CLOSE

    調用任意已註冊的 WindowListener 對象後自動隱藏該窗體。此時沒有關閉程序,只是將程序界面隱藏了。能夠打開任務管理器,能夠看到一個叫「java.exe」的進程(若是調試運行了多個java程序,則會看到多個「java.exe」的進程),若是此時用EditPlus測試程序,會發現當單擊窗口的關閉按鈕關閉窗口後,卻沒法再次對程序進行調試,由於程序線程沒有關閉,在任務管理器中關閉java.exe(若是有多個「java.exe」的進程,則先都關閉掉,再來測試該問題)基礎後,EditPlus才能夠從新編譯改程序。

    爲「2」或DISPOSE_ON_CLOSE

    調用任意已註冊 WindowListener 的對象後自動隱藏並釋放該窗體。但繼續運行應用程序,釋放了窗體中佔用的資源。

     爲「3」EXIT_ON_CLOSE(在 JFrame 中定義):使用 System exit 方法退出應用程序。僅在應用程序中使用。結束了應用程序。

    默認狀況下,該值被設置爲 HIDE_ON_CLOSE。

    當註釋掉實例中的f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);語句時,起到的效果和f.setDefaultCloseOperation(f. HIDE_ON_CLOSE); 或者f.setDefaultCloseOperation(1);同樣。


  • JFrame窗口的默認顯示位置爲從(0,0)點開始繪製,即從顯示器的左上角開始繪製。一般狀況下更但願顯示在顯示器的中央,能夠經過Toolkit類 的靜態方法getDefaultToolkit()得到一個Toolkit類的對象,而後經過Toolkit對象的getScreenSize()方法獲 得一個Dimension類的對象,經過Dimension對象能夠獲得顯示器的大小,例如顯示器的寬度和高度,得到Dimension對象的典型代碼如 下:
    Dimension displaySize = Toolkit.getDefaultToolkit().getScreenSize();
    經過JFrame對象的getSize()方法也能夠獲得一個Dimension類的對象,經過Dimension對象能夠獲得JFrame窗口的大小,例如JFrame窗口的寬度和高度,得到Dimension對象的典型代碼以下:
    Dimension frameSize = frame.getSize();
    利用上面獲得的兩個Dimension類的對象,就能夠計算出顯示在顯示器中央時的起始繪製點了,而後經過JFrame對象的setLocation(int x, int y)方法,設置JFrame窗口在顯示器中的起始繪製點,典型代碼以下:
    frame.setLocation((displaySize.width - frameSize.width) / 2,(displaySize.height - frameSize.height) / 2);
    利用JFrame建立的窗口默認是不可見的,即在運行時不在顯示器上繪製窗口,設置爲可見的方法是經過JFrame對象的setVisible(boolean b)方法,並將入口參數設爲true,典型代碼以下:
    frame.setVisible(true): 
  • 修改圖標 

          

    setIconImage (Toolkit . getDefaultToolkit (). createImage (
                    getClass (). getResource ("login.png" )));
     (注意:圖片login.png要放在與調用該圖片的類於同一個文件夾;另,Java好像不支持ico格式)
  • Java Swing如何實時刷新JTextArea,以顯示剛纔加append的內容 

    在代碼中執行完textArea.append("message")後,若是你想讓這個更新馬上顯示在界面上而不是等swing的主線程返回後刷新,咱們通常會在該語句後調用textArea.invalidate()和textArea.repaint()。

   問題是這個方法並不能有任何效果,textArea的內容沒有任何變化,這或許是swing的一個bug,有一個笨拙的辦法能夠實現這個效果,就是執行如下語句

     textArea.paintImmediately(textArea.getBounds());

     或
     textArea.paintImmediately(textArea.getX(), textArea.getY(), textArea.getWidth(), textArea.getHeight());

   這時,你會發現你剛纔增長的消息已經被實時地顯示出來了。

  • 畫圖並添加鼠標事件
    final Image img = Toolkit.getDefaultToolkit().getImage(Test.class.getResource("map.png"));
            JTextArea ta = new JTextArea() {             //文本區;
                {
                    setOpaque(false);// 設置不透明的參數,缺乏時背景圖片不顯示
                }
    
                public void paint(Graphics g) {
                    g.drawImage(img, 0, 0, this);
                    super.paint(g);
                }
            };
    
            MouseListener ml = new MouseListener() {                    //鼠標監聽器;
                public void mouseClicked(MouseEvent e) {                //MouseEvent 是鼠標活動類型,
                    if (e.getClickCount() == 2) {                       // GetClickCount() 鼠標點擊的次數統計;
                        System.out.println("Mouse double clicked");
                                      }
                            }
                          public void mouseEntered(MouseEvent e) {
                    // TODO Auto-generated method stub
    
                }
    
                public void mouseExited(MouseEvent e) {
                    // TODO Auto-generated method stub
    
                }
    
                public void mousePressed(MouseEvent e) {
                    // TODO Auto-generated method stub
    
                }
    
                public void mouseReleased(MouseEvent e) {
                    // TODO Auto-generated method stub
    
                }
                   };
            ta.addMouseListener(ml);
            ta.setBounds(0, 0, 300, 200);
            ta.setEditable(false);

     

  • 在一個TextArea裏寫內容,其餘兩個同時顯示
    /*JTextArea是多行文本編輯器,JTextField是一個簡單的單行文本編輯器,它們都由JTextComponent類派生,因此它們包含一些共同的方法,如設置和獲取所顯示的文本,指定文本是否可編輯,或者是否只讀,管理文本內的光標位置以及管理文本選擇等。
    文本組件的模型是一個稱爲Document的對象,對於一個JTextArea或JTextField,要爲之增長或刪除文本,就會改變相應的Document。當出現某種改動時,要由文檔自己(而不是可視的組件)來生成與文本相關的事件。所以,爲了接收JTextArea修改的通知,就要向底層Document註冊,而不是向JTextArea組件自己註冊:
    */
    JTextArea textArea = new JTextArea();
    Document d = textArea.getDocument();
    d.addDocumentListener(someListener);
    /*
    一個例子以下,在任意的一個文本區中鍵入的內容,在三個區中都將得以體現。咱們要作的就是讓全部的文本區都共享一個數據模型。
    */
    import java.awt.Container;
    import java.awt.GridLayout;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    
    public class ShareModel {
       
        public static void main(String[] args) {
            JFrame frame = new JFrame("ShareModel");
           
            JTextArea areaFiftyOne = new JTextArea();
            JTextArea areaFiftyTwo = new JTextArea();
            areaFiftyTwo.setDocument(areaFiftyOne.getDocument());
            JTextArea areaFiftyThree = new JTextArea();
            areaFiftyThree.setDocument(areaFiftyOne.getDocument());
           
            Container content = frame.getContentPane();                 //得到Jframe的全部awt組件,在一個容器裏;這個能夠用於導入到其它的容器裏,實現一個如出一轍的界面;
            content.setLayout(new GridLayout(3,1));                     //利用剛剛得到的窗體格式建立一個網格佈局;
            content.add(new JScrollPane(areaFiftyOne));
            content.add(new JScrollPane(areaFiftyTwo));
            content.add(new JScrollPane(areaFiftyThree));
           
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300,300);
            frame.setVisible(true);
        }
    }
    /*
    在一個文本區中鍵入時,此文本區將接受鍵盤事件,它會調用文檔中的方法來更新數據,相應的,文檔會向其它文本區發送事件,通知出現了更新,從而使它們可以正確的顯示文檔的新數據。不過,全部這一切都無需咱們關心。要作的只是通知文本區使用同一數據。Swing會接管其他的一切。
    另外須要注意的,JTextArea沒有滾動功能,超出文本區域的內容沒法顯示出來,經過鼠標拖動也沒法看到。但它實現了Swing Scrollable接口。必須把它放置在JScrollPane的內部才能實現滾動。
    */

     

  • Jframe其它方法;
    經常使用方法
    protected void addImpl(Component comp, Object constraints, int index)   添加指定的子 Component。
    protected JRootPane createRootPane()                                    由構造方法調用,以建立默認的 rootPane。
    protected void frameInit()                                             由構造方法調用,以適當地初始化 JFrame。
    AccessibleContext getAccessibleContext()                                得到與此 JFrame 關聯的 AccessibleContext。
    Container getContentPane()                                              返回此窗體的 contentPane 對象
    int getDefaultCloseOperation()                                          返回用戶在此窗體上發起 "close" 時執行的操做。
    Component getGlassPane()                                                返回此窗體的 glassPane 對象。
    Graphics getGraphics()                                                  爲組件建立一個圖形上下文。
    JMenuBar getJMenuBar()                                                  返回此窗體上設置的菜單欄。
    JLayeredPane getLayeredPane()                                           返回此窗體的 layeredPane 對象。
    JRootPane getRootPane()                                                 返回此窗體的 rootPane 對象。
    TransferHandler getTransferHandler()                                    獲取 transferHandler 屬性。
    static boolean isDefaultLookAndFeelDecorated()                          若是新建立的 JFrame 應該由當前外觀爲其提供 Window 裝飾,則返回 trueprotected boolean isRootPaneCheckingEnabled()                           返回是否將對 add 和 setLayout 的調用轉發到 contentPane。
    protected String paramString()                                          返回此 JFrame 的字符串表示形式。
    protected void processWindowEvent(WindowEvent e)                        處理此組件上發生的窗口事件。
    void remove(Component comp)                                             從該容器中移除指定組件。
    void repaint(long time, int x, int y, int width, int height)            在 time 毫秒內重繪此組件的指定矩形區域。
    void setContentPane(Container contentPane)                              設置 contentPane 屬性。
    void setDefaultCloseOperation(int operation)                            設置用戶在此窗體上發起 "close" 時默認執行的操做。
    static void setDefaultLookAndFeelDecorated(boolean defaultLookAndFeelDecorated)
    提供一個關於新建立的 JFrame 是否應該具備當前外觀爲其提供的 Window 裝飾(如邊框、關閉窗口的小部件、標題等等)的提示。
    void setGlassPane(Component glassPane) 設置 glassPane 屬性。 void setIconImage(Image image) 設置要做爲此窗口圖標顯示的圖像。 void setJMenuBar(JMenuBar menubar) 設置此窗體的菜單欄。 void setLayeredPane(JLayeredPane layeredPane) 設置 layeredPane 屬性。 void setLayout(LayoutManager manager) 設置 LayoutManager。 protected void setRootPane(JRootPane root) 設置 rootPane 屬性。 protected void setRootPaneCheckingEnabled(boolean enabled) 設置是否將對 add 和 setLayout 的調用轉發到 contentPane。 voidsetTransferHandler(TransferHandler newHandler) 設置 transferHandler 屬性,該屬性是支持向此組件傳輸數據的機制。 void update(Graphics g) 只是調用 paint(g)。

     

 

 

2、Timer計時器

  • timer使用
    private java.util.Timer timer;
    timer = new Timer(true);
    timer.schedule(
    new java.util.TimerTask() { public void run()
    { //server.checkNewMail(); 要操做的方法} }, 0, 5*60*1000);
    第一個參數是要操做的方法,
    第二個參數是要設定延遲的時間,
    第三個參數是週期的設定,每隔多長時間執行該操做。
    使用這幾行代碼以後,Timer自己會每隔5分鐘調用一遍
    server.checkNewMail()方法,不須要本身啓動線程。Timer自己也是多線程同
    步的,多個線程能夠共用一個Timer,不須要外部的同步代碼。
    
    timer方法 (
    1)Timer.schedule(TimerTask task,Date time) 安排在指定的時間執行指定的任務。 (2)Timer.schedule(TimerTask task,Date firstTime ,long period) 安排指定的任務在指定的時間開始進行重複的固定延遲執行. (3)Timer.schedule(TimerTask task,long delay) 安排在指定延遲後執行指定的任務. (4)Timer.schedule(TimerTask task,long delay,long period) 安排指定的任務從指定的延遲後開始進行重複的固定延遲執行. (5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 安排指定的任務在指定的時間開始進行重複的固定速率執行. (6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long period) 安排指定的任務在指定的延遲後開始進行重複的固定速率執行.

     

  • timer注意事項
    ava.util這個包中能夠找到Timer和TimerTask這兩個類。Timer直接從Object繼承,它至關於一個計時器,可以用它來指定某個時間來執行一項任務,或者每隔必定時間間隔反覆執行同一個任務。建立一個Timer後,就會生成一個線程在背後運行,來控制任務的執行。而TimerTask就是用來實現某項任務的類,它實現了Runnable接口,所以至關於一個線程。
    如何實現本身的任務調度?
    1、繼承TimerTask,注意TimerTask是實現Runnable接口的,所以只要重載run()方法便可。
    2、建立Timer對象,調用schedule()方法。相關注意點分析:
    1、任務調度要優先考慮實時保證
    因爲Java的天性,而且在開發JDK的過程當中要考慮到不一樣平臺,而不一樣平臺的線程調度機制是不一樣的,所以各類平臺下JVM 的線程調度機制也是不一致的。從而Timer不能保證任務在所指定的時間內執行。另外因爲Time rTask是實現Runnable接口的,在TimerTask被放進線程隊列睡眠一段時間(wait)以後,當到了指定的該喚起該TimerTask時,因爲執行的確切時機取決於JVM的調度策略和當前還有多少線程在等待CPU處理。所以 就不能保證任務在所指定的時間內執行。一般在以下兩種狀況下致使任務延遲執行:
    (1)、有大量線程在等待執行
    (2)、GC機制的影響致使延遲
    這也是爲何在Timer API中存在兩組調度方法的緣由。即:
    (1)、schedule()
    用固定延遲調度。使用本方法時,在任務執行中的每個延遲會傳播到後續的任務的執行。
    (2)、scheduleAsFixedRate()
    用固定比率調度。使用本方法時,全部後續執行根據初始執行的時間進行調度,從而但願減少延遲。
    具體使用哪個方法取決於哪些參數對你的程序或系統更重要。
    二、每一個Timer對象要在後臺啓動一個線程。這種性質在一些託管的環境下不推薦使用,好比在應用服務器中。由於這些線程不在容器的控制範圍以內了。
相關文章
相關標籤/搜索