JLabel不会改变颜色

Dam*_*mir 4 java swing background boolean jlabel

我的部分功能看起来像这样

jLabel2.setBackground(Color.YELLOW);
jLabel2.setText("Status : Idle");

boolean ok=cpu21.RestartSSH();

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

在我输入功能标签之前是绿色和运行,但是当我进入功能时它不会将颜色变为黄色(功能RestartSSH正在执行5-6秒,但在此期间标签不会改变颜色和捕获).我在绘画中犯了错误?

dog*_*ane 14

  • 使您的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();
Run Code Online (Sandbox Code Playgroud)

(更新:已添加电话SwingUtilities.invokeLater)

  • 为生成的线程上的UI调用添加SwingUtilities.invokeLater(..),你就是金 (2认同)

Jon*_*nas 5

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

jLabel2.setOpaque(true);
Run Code Online (Sandbox Code Playgroud)

或者你可能需要在改变颜色后调用重绘:

jLabel2.repaint();
Run Code Online (Sandbox Code Playgroud)