0

アプリケーションを実行すると、ボタンの色が更新されず、正常に表示されず、動的に表示されませんでした。この問題は Linux 環境でのみ発生し、Windows でも同じコードで問題なく動作します。

 private JButton button = new JButton();
                button.setLayout(buttonLayout);
                button.add(totalsLabel, BorderLayout.CENTER);
                totalsLabel.setHorizontalAlignment(JButton.CENTER);
                button.add(statusLabel, BorderLayout.SOUTH);
                statusLabel.setHorizontalAlignment(JButton.CENTER);
                button.setMargin(new Insets(0, 0, 0, 0));
                button.setVerticalAlignment(SwingConstants.TOP);
                button.setHorizontalTextPosition(SwingConstants.CENTER);
                button.setEnabled(true);
                button.setPreferredSize(PREFERRED_SIZE);
                button.setRequestFocusEnabled(false);
                button.setVerifyInputWhenFocusTarget(false);
                button.setFocusPainted(false);
                button.setBackground(mementoTO.getBackGroundColor());
                private void initializeAlternatingColorsThread() {

                alternatingColors = new Thread(new Runnable()  {
                    public void run() {
                        while(true)  {
                            while(continueAlternatingColors())  {
                                try {
                                    if(button.getBackground().equals(BACKGROUND_PAY_LATER)) {
                                        button.setBackground(BACKGROUND_BUSY); }
                                    else {
                                        button.setBackground(BACKGROUND_PAY_LATER); }
                                    Thread.sleep(500); }
                                catch(InterruptedException ex) {
                                    getLogger().error(this + " - Error occured in initializeAlternatingColorsThread: ", ex);   }   }
                            synchronized(lockVariable) {
                                try {
                                    lockVariable.wait();    }
                                catch(InterruptedException e) {
                                } } } }
                }, "AlternatingColors");  }


    GuiExecutor.getInstance().update(new Runnable() {
                    public void run() {
                        setStaticText("RESETTING PUMP");
                        setStatus("HANG UP NOZZLE");
                        button.setBackground(BACKGROUND_BUSY);
                        button.repaint();
                    }   });       

Windows のルック アンド フィールを使用すると、Linux で例外が発生します。そこで、外観を変更し、GDK for Linux にしました。

    INFO   | jvm 1    | main    | 2013/01/21 15:14:23.995 | Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    INFO   | jvm 1    | main    | 2013/01/21 15:14:23.995 |     at javax.swing.plaf.basic.BasicButtonUI.getMinimumSize(BasicButtonUI.java:352)
    INFO   | jvm 1    | main    | 2013/01/21 15:14:23.995 |     at javax.swing.JComponent.getMinimumSize(JComponent.java:1714)
    INFO   | jvm 1    | main    | 2013/01/21 15:14:23.995 |     at java.awt.BorderLayout.minimumLayoutSize(BorderLayout.java:651)
    INFO   | jvm 1    | main    | 2013/01/21 15:14:23.995 |     at java.awt.Container.minimumSize(Container.java:1651)
    INFO   | jvm 1    | main    | 2013/01/21 15:14:23.995 |     at java.awt.Container.getMinimumSize(Container.java:1636)
    INFO   | jvm 1    | main    | 2013/01/21 15:14:23.996 |     at javax.swing.JComponent.getMinimumSize(JComponent.java:1716)
    INFO   | jvm 1    | main    | 2013/01/21 15:14:23.996 |     at java.awt.FlowLayout.minimumLayoutSize(FlowLayout.java:448)
    INFO   | jvm 1    | main    | 2013/01/21 15:14:23.996 |     at 
4

2 に答える 2

3

あなたのコードは Swing のスレッド化ルールを尊重していません。コンポーネントのプロパティは、Swing イベント スレッド (EDT) でのみ変更する必要があります。SwingWorker を使用してこれを行うと、問題が解消される可能性があります。

さらに良いことに、単純にスイングタイマーを使用してみませんか?

また、コードのフォーマットが貧弱で (たとえば -- } } } })、コードを読み取ってサポートするのが難しくなっています。私たちがあなたを助ける努力をしたい場合は、より良いフォーマットのコードをここに投稿する努力をしてください.

于 2013-02-22T05:12:33.787 に答える
3

これ...

alternatingColors = new Thread(new Runnable() {
    public void run() {
        while (true) {
            while (continueAlternatingColors()) {
                try {
                    if (button.getBackground().equals(BACKGROUND_PAY_LATER)) {
                        button.setBackground(BACKGROUND_BUSY);
                    } else {
                        button.setBackground(BACKGROUND_PAY_LATER);
                    }
                    Thread.sleep(500);
                } catch (InterruptedException ex) {
                    getLogger().error(this + " - Error occured in initializeAlternatingColorsThread: ", ex);
                }
            }
            synchronized (lockVariable) {
                try {
                    lockVariable.wait();
                } catch (InterruptedException e) {
                }
            }
        }
    }
}, "AlternatingColors");

Swing のシングル スレッド ルールに違反している - イベント ディスパッチ スレッドの外部で UI コンポーネントを作成または更新してはなりません。そうすると、予期しない動作が発生する可能性があります。

SwingTimer同じタスクを実行するには、を使用する必要があります...

詳細については、Swing での同時実行をご覧ください。

于 2013-02-22T05:13:39.203 に答える