Re: [問題] 請問視窗可以閃爍顏色嗎??
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):