目錄
JFrame窗體................................................................................................. 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" 時默認執行的操作。方法中的參數解釋如下:
為“0”或DO_NOTHING_ON_CLOSE:
(在 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): - 修改圖標
getClass (). getResource ("login.png" )));
- 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 裝飾,則返回 true。 protected 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)。
二、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() 用固定比率調度。使用本方法時,所有后續執行根據初始執行的時間進行調度,從而希望減小延遲。 具體使用哪一個方法取決於哪些參數對你的程序或系統更重要。 2、每個Timer對象要在后台啟動一個線程。這種性質在一些托管的環境下不推薦使用,比如在應用服務器中。因為這些線程不在容器的控制范圍之內了。