我真的怀疑这是最好的方法,但这正是我目前正在使用的方式。我在JPanel中有这3个JLabel对象。所以3个圆圈在JPanel中的字体99.从左到右,圆圈的颜色为R B G. \ u2022是一个圆圈。
结束目标:能够将圆圈从开启更改为关闭。所以说默认开始是白色的。我希望能够做到| R W W |或| W B G |。但我遇到的问题是,我希望用户能够看到颜色开启和关闭,这就是重点。我试过等待,但它只是冻结了程序,然后它产生了颜色,没有过渡。我知道它会立即改变,但我想暂停它几毫秒,或者半秒,这样用户就可以看到它们开启和关闭。
示例:第二次传球,| R W W |第二个2 | W W W |第二个3 | R B W |第二个4 | W W W |第二个5 | R W G | ....等
ballR = new JLabel("\u2022");
panel.add(ballR);
ballR.setForeground(Color.RED);
ballR.setFont(new Font("Tahoma", Font.PLAIN, 99));
^^每种颜色都有一个,红色,蓝色,绿色^^
private void colorRed(){
ballR.setForeground(Color.RED);
try {
TimeUnit.SECONDS.sleep((1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ballR.setForeground(Color.WHITE);
}
答案 0 :(得分:3)
我尝试了等待,但它只是冻结了程序,然后它产生了颜色,没有过渡
目前还不清楚你是否在EDT上调用这段代码,但从描述听起来就是这种情况 - 在EDT上使用睡眠(或执行一个长时间运行的任务)将阻止任何重新绘制或听众被触发直到该方法返回(换句话说,UI锁定)。
但我希望将其暂停几毫秒或半秒,以便用户可以看到它们开启和关闭。
如果您希望在指定时间(或重复的时间间隔)后在EDT上执行任务,请使用Timer
Timer timer = new Timer(500, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
ballR.setForeground(Color.WHITE);//or RED, depending
}
});
timer.setRepeats(false);//don't repeat if you don't want to
timer.start();