【问题标题】:JLabel doesn't change back colorJLabel 不会改变背景颜色
【发布时间】:2011-06-15 03:01:32
【问题描述】:

我的部分函数看起来像这样

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 秒,但在此期间标签不会改变颜色并捕获)。我在哪里画错了?

【问题讨论】:

    标签: java swing background boolean jlabel


    【解决方案1】:
    • 使您的 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的调用)

    【讨论】:

    • 为生成线程上的 UI 调用添加 SwingUtilities.invokeLater(..),你就很成功了
    • +1 这是正确的想法,但Thread 应该使用invokeLater(),正如这里所建议的en.wikipedia.org/wiki/…
    【解决方案2】:

    默认情况下,JLabels 是不透明的,因此默认情况下不会绘制它们的背景。尝试:

    jLabel2.setOpaque(true);
    

    或者您可能必须在更改颜色后调用 repaint:

    jLabel2.repaint();
    

    【讨论】:

    • 因为JLabel的背景默认是透明的 +1
    【解决方案3】:

    我怀疑您的 restartSSH() 方法阻止了 event dispatch thread。一种方法是使用SwingWorker,正如example 中所建议的那样。这将允许您显示重新启动过程的进度并在完成后适当地设置标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-08
      • 2014-06-21
      • 2014-04-21
      • 2021-01-23
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多