1

次のコードがあります。

    timeLeftFinished = false;
    boolean agreed = jCheckBox1.isSelected();
    ActionListener taskPerformer = new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            timeLeftFinished = true;
        }
    };
    Timer timer = new Timer(0, taskPerformer);
    timer.setInitialDelay(5000);
    timer.setRepeats(false);
    timer.start();
    while (timeLeftFinished == true && agreed == true) {
        jButton3.setEnabled(true);

両方が true の場合に jButton3 を有効にしたいのですが、両方timeLeftFinishedagreedtrue であるかどうかを確認し、両方が true の場合にのみ jButton3 を有効にするにはどうすればよいですか?

補足:私は netbeans Gui Builder を使用していますが、おそらく IDE はイベントをバインドするコードを生成できますか?

ActionListener毎秒両方が真であるかどうかを確認する別の作成は、実行可能な実装ですか?

4

1 に答える 1

2

チェックボックスとタイマーの両方の個別の状態を確認して監視する必要があります...

jCheckBox1.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent evt) {
       agreed = jCheckBox1.isSelected();
       updateState();
   }
});
//...
ActionListener taskPerformer = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        timeLeftFinished = true;
        updateState();
    }
};
Timer timer = new Timer(0, taskPerformer);
//...

protected void updateState() {
    jButton3.setEnabled(timeLeftFinished && agreed);
}

イベント駆動型の環境で操作していることを忘れないでください。何かが直線的に発生することは非常にまれです。

また、UI は独自の 1 つのスレッド内で動作することに注意してください。UI 状態に対するすべての相互作用と変更は、このスレッドのコンテキスト内で発生することが期待されます。このスレッドの実行を停止するようなことをすると (たとえば、実行時間の長いループを使用するなど)、イベント ディスパッチ スレッドは新しいイベント (再描画要求を含む) を処理できなくなります。つまり、ループは決して終了せず、基本的には...

于 2013-10-05T01:21:00.757 に答える