Java 如何闪烁任何JComponent的背景色?

Java 如何闪烁任何JComponent的背景色?,java,swing,colors,background,jcomponent,Java,Swing,Colors,Background,Jcomponent,我试图闪烁JButton的背景色,但只有“睡眠”按钮起作用 我的代码: @Override public void actionPerformed(ActionEvent e){ if(!empty){ }else{ myButton.setBackground(Color.RED); try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e2){} myButton.setBackgroun

我试图闪烁JButton的背景色,但只有“睡眠”按钮起作用

我的代码:

@Override
public void actionPerformed(ActionEvent e){

  if(!empty){
  }else{
  myButton.setBackground(Color.RED);
  try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e2){}
  myButton.setBackground(Color.LIGHT_GRAY);
  try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e1) {}
  myButton.setBackground(Color.RED);
  try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e1) {}
  myButton.setBackground(Color.LIGHT_GRAY);
  }
  }
}
编辑: 无法发布全部代码,行数太多。 按钮位于GridBagLayout内:

myButton= new Jbutton("Button!");
myButton.setBackground(Color.White);
myButton.setHorizontalAlignment(JTextField.CENTER);;
myButton.setForeground(Color.black);
GridBagConstraints gbc_myButton = new GridBagConstraints();
gbc_myButton.fill = GridBagConstraints.BOTH;
gbc_myButton.gridx = 0;
gbc_myButton.gridy = 1;
gbc_myButton.gridwidth=3;
panel.add(myButton, gbc_myButton);
编辑2:
我只是发现它在运行时没有设置任何颜色(有或没有任何延迟/睡眠)。

问题是,当您睡眠UI线程时(通过
TimeUnit…sleep(x)
),它将无法重新呈现更改。我打赌最后一种颜色会被渲染


您需要找到另一种触发颜色更改的方法,查看计时器,尤其是swing计时器。

问题是,当您睡眠UI线程时(通过
TimeUnit…sleep(x)
),它将无法重新呈现更改。我打赌最后一种颜色会被渲染


你需要找到另一种触发颜色变化的方法,看看定时器,尤其是swing定时器。

你需要使用
javax.swing.timer
来制作这样的动画

final Button b = ...;
final Color[] colors = ...;
colors[0] = Color.RED;
colors[1] = Color.LIGHT_GREY;
ActionListener al = new ActionListener() {
  int loop = 0;
  public void actionPerformed(ActionEvent ae) {
    loop = (loop + 1) % colors.length;
    b.setBackground(colors[loop]);
  }
}

new Timer(200, al).start();

注意:并非所有组件/JComponents都会通过调用setBackground来更改背景

您需要使用
javax.swing.Timer
来制作这样的动画

final Button b = ...;
final Color[] colors = ...;
colors[0] = Color.RED;
colors[1] = Color.LIGHT_GREY;
ActionListener al = new ActionListener() {
  int loop = 0;
  public void actionPerformed(ActionEvent ae) {
    loop = (loop + 1) % colors.length;
    b.setBackground(colors[loop]);
  }
}

new Timer(200, al).start();


注意:并非所有组件/j组件都通过调用setBackground来改变背景,你说“只有
睡眠
工作”是什么意思?延迟工作,但颜色不变。a)200毫秒很短,请尝试更长的睡眠时间。b) 你在循环代码吗?测试了1秒,没有区别。不,我没有循环。小心不要让EDT线程进入睡眠状态。这将使GUI无响应。什么意思是“只有
睡眠
工作”?延迟工作,但颜色不变。a)200毫秒很短,请尝试更长的睡眠时间。b) 你在循环代码吗?测试了1秒,没有区别。不,我没有循环。小心不要让EDT线程进入睡眠状态。它将使GUI无响应。如何从类中检索ActionListener对象?因为你正在创建一个新的。如果我使用新时间(200,这个),它会在actionPerformed()的第一行给我一个空指针。我不理解你的问题。您试图在哪里检索ActionListener?什么是新时间(200,这个)?如果您在actionPerformed的第一行上得到一个NullPointerException,这意味着您实际上没有将颜色放入
colors
ArraI,我想我必须使用实现我的类的ActionListener。在阅读了整个文档之后,我发现这是一个新的ActionListener,在我的类的actionPerformed中。然后我尝试了你的代码,颜色在改变,但是循环没有停止。你可以实现忽略在前4个之后对actionPerformed的调用,而不是使用模继续循环。或者,可以将计时器设置为final或类成员,以便您可以在计时器中引用它,并使用Timer.stop当您要停止更改时,我认为必须有更简单的方法,但现在可以使用。如何从类中检索ActionListener对象?因为你正在创建一个新的。如果我使用新时间(200,这个),它会在actionPerformed()的第一行给我一个空指针。我不理解你的问题。您试图在哪里检索ActionListener?什么是新时间(200,这个)?如果您在actionPerformed的第一行上得到一个NullPointerException,这意味着您实际上没有将颜色放入
colors
ArraI,我想我必须使用实现我的类的ActionListener。在阅读了整个文档之后,我发现这是一个新的ActionListener,在我的类的actionPerformed中。然后我尝试了你的代码,颜色在改变,但是循环没有停止。你可以实现忽略在前4个之后对actionPerformed的调用,而不是使用模继续循环。或者,可以将计时器设置为final或类成员,以便您可以在计时器中引用它,并使用Timer.stop当您要停止更改时,我认为必须有更简单的方法,但目前可以使用。(1-)Swing组件应在事件调度线程(EDT)上更新。因此,您应该使用Swing计时器,而不是该链接中提到的其他计时器。@camickr是的,这些其他计时器不适用,谢谢(1-)Swing组件应该在事件调度线程(EDT)上更新。因此,您应该使用摆动计时器,而不是该链接中提到的其他计时器。@camickr是的,其他计时器不适合,谢谢