作者uziel (= ̄ω ̄=)
看板java
标题Re: [问题] 请问视窗可以闪烁颜色吗??
时间Sun Sep 4 11:42:26 2011
※ 引述《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
1F:推 spiderman007:谢谢你的热心回答.... 09/04 22:45