0

JFrame を拡張するクラス AgentHome があります。AgentHome には JPanel rem_panel があります。チェックボックスは、テキストボックスによって表示されるテキストが読み取られるデータベーステーブル内のエントリの数に応じて、rem_panel…チェックボックスの数に動的に追加されます。

AgentHome には整数変数 x とチェックボックス arraylist rem_cbarr があります。

rem_cbarr は、チェックボックスが作成されて rem_panel に追加されると、チェックボックスを保存します。プログラムの実行時に変数 x が 1 に設定されている場合、これらのチェックボックスの背景色を赤に設定しようとしています。変数 x が 1 に設定されているかどうかを確認するために、JADE フレームワークの TickerBehaviour を実装しました。

チェックボックスの背景色を赤に設定できません。これは私が実装したコードです。助けてください。ありがとう。

 public void setup()
{
  Behaviour loop = new TickerBehaviour( this, 2000 )
  {
     protected void onTick() {

      timer();
     }
  };


   addBehaviour( loop );
 }

  public void timer()
{
    AgentHome hm=new AgentHome();
           if(hm.x==1)
       {
           for (int i = hm.rem_cbarr.size()-1; i>=0; i--)
                   {
                       JCheckBox cb=hm.rem_cbarr.get(i);
                     cb.setBackground(Color.red);
                      hm.rem_panel.revalidate();
                     hm.rem_panel.repaint();
                   }
      }
}
4

2 に答える 2

1

いくつかのこと...

  • UIコンポーネントは、イベントディスパッチスレッドのコンテキスト内でのみ更新する必要があります
  • Thread#Sleepイベントディスパッチスレッドをブロックする可能性のあるアクション(ループの使用や画面の更新の試行など)は絶対に実行しないでください。
  • イベントディスパッチスレッドは、ペイントの更新をディスパッチする役割を果たします...
  • JCheckBoxデフォルトでは透過的です。

public class FlashCheckBox {

    public static void main(String[] args) {
        new FlashCheckBox();
    }

    public FlashCheckBox() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                frame.add(new FlashyCheckBox());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class FlashyCheckBox extends JCheckBox {

        private final Color defaultBackground;
        private int flash;
        private Timer flashTimer;

        public FlashyCheckBox() {

            defaultBackground = getBackground();

            flashTimer = new Timer(500, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    flash++;
                    if (flash % 5 == 0) {
                        setOpaque(false);
                        setBackground(defaultBackground);
                        flashTimer.stop();
                    } else if (flash % 2 == 0) {
                        setBackground(Color.YELLOW);
                        setOpaque(true);
                    } else {
                        setBackground(defaultBackground);
                        setOpaque(false);
                    }
                    repaint();
                }
            });

            flashTimer.setRepeats(true);
            flashTimer.setCoalesce(true);
            flashTimer.setInitialDelay(0);

            addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    flashTimer.restart();
                }
            });

        }

    }

}
于 2013-01-29T09:01:10.547 に答える
1

GUI 操作は EDT (Event Dispatcher Thread) 上で行う必要があります。Java では、これは を呼び出すことで発生しSwingUtilities.invokeLater(Runnable run)ます。

于 2013-01-29T08:33:53.467 に答える