Re: [問題] 請問視窗可以閃爍顏色嗎??

看板java作者 (= ̄ω ̄=)時間14年前 (2011/09/04 11:42), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《spiderman007 (千里之外)》之銘言: : 在一個視窗上放置一個按鈕,按下時背景會2種顏色交換?? : import java.awt.*; : import java.awt.event.*; : import javax.swing.*; : public class app23_1_1 extends JFrame implements ActionListener{ : static app23_1_1 frm = new app23_1_1(); : static Container cp = frm.getContentPane(); : static Button btn1 = new Button("button1"); : static Button btn2 = new Button("button2"); : public static void main(String[] args){ : cp.add(btn1); : cp.add(btn2); : cp.setLayout(new FlowLayout()); : cp.setBackground(Color.pink); : btn1.addActionListener(frm); : frm.setTitle("jframe window"); : frm.setSize(200,150); : frm.setVisible(true); : } : public void actionPerformed(ActionEvent e){ : for(int i=0; i<1000000000; i++){} : cp.setBackground(Color.yellow); : for(int i=0; i<1000000000; i++){} : cp.setBackground(Color.pink); : } : } : 但結果只會直接顯示粉紅色...中間並不會變黃色?? 不知道你的 actionPerformed 方法裡的兩個迴圈要做什麼? 也許是希望視窗背景先變成黃色,過一段時間後再變成粉紅色 那麼首先應該知道一件事: 任何會改變 UI 的程式碼都是靠著在訊息佇列 (Event Queue) 裡面新增一個「重繪」 的訊息,然後等到目前在執行的程式碼都跑完了,JVM 會從訊息佇列讀取下一個工作,這 時候如果讀取到「重繪」訊息, JVM 才會去執行相關 UI 元件的繪圖動作。 上面程式碼的問題在於 actionPerformed 不論執行了什麼動作,它們都只是在訊息佇列 中增加要求繪圖的訊息而已,所以當 actionPerformed 執行完畢的時候,視窗背景的 顏色被設定成 Color.PINK ,接下來 JVM 讀取訊息佇列,發現有視窗繪圖的要求,於是 就依照該視窗目前被設定的背景顏色進行繪圖,最後視窗背景就被畫成粉紅色了。 如果有需要依照一定的間隔時間進行繪圖的話(例如動畫),可以使用 javax.swing.Timer 類別,須注意它和 java.util.Timer 的不同,Swing 的 Timer 是 直接在「事件派遣執行緒」(Event-dispatch Thread) 中運作,可以直接操作 UI 元件, 而另一個 Timer 則會產生一個新的執行緒,用這個 Timer 來操作 UI 必須考慮同步化 的問題。 在此附上一個範例:http://pastie.org/2478922 至於繪圖的相關議題可以參考官方說明文件: http://java.sun.com/products/jfc/tsc/articles/painting/index.html -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 223.142.67.214

09/04 22:45, , 1F
謝謝你的熱心回答....
09/04 22:45, 1F
文章代碼(AID): #1EOlEatl (java)
文章代碼(AID): #1EOlEatl (java)