JLabel setForeground не работает в SwingWorker - PullRequest
0 голосов
/ 20 марта 2019

Мне нужно менять цвет JLabel между синим и красным каждую 1 секунду, мне нужно SwingWorker, чтобы выполнить эту работу, но я могу изменить цвет только один раз, и тогда он перестает что-либо делать.

Подкласс SwingWorker:

public class NewClass extends SwingWorker {
    private JLabel label;

    public NewClass(JLabel label) {
        this.label = label;
    }
    @Override
    protected Object doInBackground() throws Exception {
        while(true) {
            label.setForeground(Color.BLUE);
            try {
                sleep(1000);
            } catch (Exception ex) {
                 ex.printStackTrace();
            }

            label.setForeground(Color.RED);  
        }
    } 

    void changeColor() {
         Color c = label.getForeground();

         if(c == Color.RED)
            label.setForeground(Color.BLUE);
         else
            label.setForeground(Color.RED);
    }
}

public class NewJFrame extends javax.swing.JFrame {

    public NewJFrame() {
        initComponents();

        NewClass g = new NewClass(label);
        g.execute();


    }

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }


    private javax.swing.JLabel label;

}

Но если я изменю doInBackground, чтобы использовать мой метод changeColor, он работает хорошо:

protected Object doInBackground() throws Exception {
        while(true) {
            changeColor();
            try {
                sleep(1000);
            } catch (Exception ex) {
                 ex.printStackTrace();
            }  
        }
}

Я не могу понять, почемуЭто не работает в первом, я думал, что эти два пути одинаковы.

1 Ответ

3 голосов
/ 20 марта 2019

Они не одинаковы.В первом случае вы делаете следующее:

  • вы меняете цвет переднего плана на синий
  • вы ждете одну секунду
  • вы меняете цвет на красный
  • вы не ждете
  • вы меняете цвет на синий
  • вы ждете одну секунду
  • ... до бесконечности
...