JLabel不改变背景颜色

6
我的职责之一是处理以下代码:
jLabel2.setBackground(Color.YELLOW);
jLabel2.setText("Status : Idle");

boolean ok=cpu21.RestartSSH();

if(ok){
    jLabel2.setBackground(Color.GREEN);
    jLabel2.setText("Status : Run");    
}

进入函数之前标签是绿色和“运行”,但是进入函数后,标签没有变成黄色(函数RestartSSH执行5-6秒钟,但在此期间标签没有改变颜色并且截图)。我在绘制方面犯了什么错误?

3个回答

18
  • 将你的JLabel设置为不透明,这样你就能够设置它的背景色。
  • 在一个单独的线程中执行RestartSSH,否则你的GUI将无法响应事件。
final JLabel jLabel2 = new JLabel("HELLO");
jLabel2.setOpaque(true);
jLabel2.setBackground(Color.YELLOW);
jLabel2.setText("Status : Idle");

//perform SSH in a separate thread
Thread sshThread = new Thread(){
    public void run(){
        boolean ok=cpu21.RestartSSH();
        if(ok){
           //update the GUI in the event dispatch thread
           SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                   jLabel2.setBackground(Color.GREEN);
                   jLabel2.setText("Status : Run");
               }
           });
        }
    }
};
sshThread.start();

(更新:添加了对 SwingUtilities.invokeLater 的调用)


2
在生成的线程上添加SwingUtilities.invokeLater(..)以进行UI调用,你就可以了。 - Mike Tunnicliffe
+1 这是正确的想法,但是 Thread 应该使用 invokeLater(),如此处所建议 http://en.wikipedia.org/wiki/Continuation_passing_style#Continuations_as_objects - trashgod

5

JLabel默认是不透明的,因此它们的背景默认情况下不会被绘制。尝试使用以下代码:

jLabel2.setOpaque(true);

或者在更改颜色后,您需要调用repaint:

jLabel2.repaint();

1
因为JLabel默认情况下背景是透明的,所以加1。 - jmj

2

我怀疑你的restartSSH()方法会阻塞事件分派线程。一个解决方法是使用SwingWorker,正如这个示例所建议的那样。这将允许你显示重启进程的进度,并在完成时适当地设置标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接