java介面編程(1),java介面編程

來源:互聯網
上載者:User

java介面編程(1),java介面編程

         本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020 

         最近想學下java的介面編程,在此記錄下。

    大多數的Swing應用都被構建在基礎的JFrame內部,JFrame在你作用的任何作業系統中都可以建立視窗應用。

看如下一個最簡單的JFrame例子:

JFrame frame = new JFrame("Hello Swing");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(300, 100);frame.setVisible(true);
       這樣就建立了一個帶標題的視窗,其中,setDefaultCloseOperation()告訴JFrame當用記執行關閉操作時應該做些什麼。EXIT_ON_CLOSE常量告訴它要退出程式。而如果沒有這個調用,預設的行為是什麼都不做,因此應用將不會關閉。setSize()以像素為單位設定視窗的大小。JFrame預設是不顯示的,所以需要設定setVisible(true),才能顯示在螢幕上。效果如所示:


       下面,給該視窗添加一個標籤,主要代碼如下:

     JLabel label = new JLabel("A Label");frame.add(label);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}label.setText("Hi,this is a different");
  這裡面的TimeUnit.SECONDS.sleep(1)指的是過1秒鐘後執行下面的操作,即重新設定JLabel顯示的文字。效果如下:

       上述是直接在Main()線程執行UI事件更新螢幕,但這並不是一種好的想法,Swing有它自己的專用線程來接收UI事件並更新螢幕,如果從其他線程著手對螢幕時進行操作,那麼就可能會產生衝突和死結。所以其他線程包括main()線程,應該通過Swing事件分發線程提交要執行的任務。可以通過將任務提交給SwingUtilities.invokeLater()來實現。

  如果我們將這種方式應用於面的例子,那麼代碼如下:

final JLabel label = new JLabel("A Label");frame.add(label);TimeUnit.SECONDS.sleep(1);SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {label.setText("Hi,this is a different");}});

  如上述代碼,不用直接操作JLabel,取而代之的是,提交一個runnable,因此也就不會產生衝突。

  既然,Swing有它自己專用的線程來接收UI事件,那麼,我們也不應該直接在Main()線程中操作JFrame,因此,我們將JFrame的操作也統一用Swing專用的線程來實現,則上述例子就變成:

public class test {private static JLabel label;private static JFrame frame;private static void InitJFrame(){frame = new JFrame("Hello Swing");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(300, 100);frame.setVisible(true);label = new JLabel("A Label");frame.add(label);} /** * @param args * @throws InterruptedException  */public static void main(String[] args) throws InterruptedException {SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubInitJFrame();}});TimeUnit.SECONDS.sleep(1);SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {label.setText("Hi,this is a different");}});}}
     當然了,因為建立JFrame有兩種方式,一種是new JFrame(),另一種就是直接繼承JFrame,上面的完整代碼用的是第一種方法,第二方法完整代碼如下:

public class SwingTest extends JFrame{private static JLabel label;private static SwingTest st;public SwingTest() {super("Hello Swing");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 100);setVisible(true);label = new JLabel("A Label");add(label);}/** * @param args * @throws InterruptedException  */public static void main(String[] args) throws InterruptedException {SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubst = new SwingTest();}});TimeUnit.SECONDS.sleep(1);SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {label.setText("Hi,this is a different");}});}}
  這裡要注意一點,對sleep()的調用不能在構造器的內部,如果放在內部,JLabel的初始文本就永遠都不會出現。這主要是因為構造器在sleep()調用完畢和新的標籤插入之前不會結束。


 


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.