Swingsアプリケーションを作成しました。GUIには「開始」ボタンがあります。 「スタート」ボタンをクリックするたびに、スタートボタンを無効にし、「ストップ」ボタンを有効にする必要があります。
そのために、「開始」ボタンの「ActionPeformed(...)」メソッドに次のコードを記述しました。
startButton.setEnabled(false);
stopButton.setEnabled(true);
ただし、上記のコードは、GUIに必要な影響を与えません。
上記のコードは私がやりたいことに対して正しいですか?
「repaint()」でも動作しません。
編集:
コードが非常に長いため、すべてのコードを貼り付けることはできません。ただし、コードについては詳しく知ることができます。
「開始」ボタンの「ActionPeformed」メソッドで、上記の2つのステートメントを呼び出した後、「SwingWorker」スレッドを実行しています。
このスレッドは問題を引き起こしていますか?
そのために、「開始」ボタンの「ActionPeformed(...)」メソッドに次のコードを記述しました。
そのコードは、[スタート]ボタン自体ではなく、[スタート]ボタンに登録されているActionListener
のactionPerformed(...)
にある必要があります。
次のような単純なActionListener
を追加できます。
JButton startButton = new JButton("Start");
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
startButton.setEnabled(false);
stopButton.setEnabled(true);
}
}
);
ローカルスコープで匿名リスナーを作成する場合、上記の例では、上記のstartButtonがfinal
である必要があることに注意してください。
コードが非常に長いため、すべてのコードを貼り付けることはできません。
コードが機能しない理由はいくつかあります。ボタン変数を2回宣言したので、実際にボタンの有効化/無効化を変更することはありません。たぶん、あなたはEDTをブロックしています。
フォーラムに投稿するには、 [〜#〜] sscce [〜#〜] を作成する必要があります。
問題を特定するのはあなた次第です。 2つのボタンを持つシンプルなフレームから始めて、コードが機能するかどうかを確認します。動作するようになったら、10秒間だけスリープするスレッドを開始して、まだ動作するかどうかを確認してください。
200行のプログラムを作成する前に、まず基本がどのように機能するかを学びます。
いくつかの基本的なデバッグ方法を学びましょう。私たちは読者ではありません。問題の口頭での説明に基づいて、あなたがしている愚かな間違いを推測することはできません。
これは動作します。
public class TestButton {
public TestButton() {
JFrame f = new JFrame();
f.setSize(new Dimension(200,200));
JPanel p = new JPanel();
p.setLayout(new FlowLayout());
final JButton stop = new JButton("Stop");
final JButton start = new JButton("Start");
p.add(start);
p.add(stop);
f.getContentPane().add(p);
stop.setEnabled(false);
stop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
start.setEnabled(true);
stop.setEnabled(false);
}
});
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
start.setEnabled(false);
stop.setEnabled(true);
}
});
f.setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
new TestButton();
}
}