B から A への切り替えは常に許可されますが、A から B への切り替えは条件に依存する 2 つのボタン (A と B) のグループを作成したいと思います。条件は、後者の場合 (A から B) でのみチェックでき、チェックは切り替え試行ごとに 1 回だけ実行できます。ItemEvent.SELECTED
切り替えが妨げられた場合、どちらのボタンに対してもイベントが生成されてはなりません。
非常に簡単に思えるので、単純で簡潔な方法でこれを行うことができなかった理由について困惑しています。ButtonGroup を拡張することがこれを行う方法だと思っていましたが、今はもうわかりません。
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
public class ToggleGroup extends JFrame {
private ButtonGroup group = new MyButtonGroup();
private JToggleButton buttonA = new JToggleButton("A");
private JToggleButton buttonB = new JToggleButton("B");
public ToggleGroup() {
setLayout(new FlowLayout());
add(buttonA);
add(buttonB);
group.add(buttonA);
group.add(buttonB);
group.setSelected(buttonA.getModel(), true);
pack();
setLocationRelativeTo(null);
ItemListener itemListener = new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
System.out.println("-> " + (e.getSource() == buttonA ? "A" : "B") + " selected");
}
}
};
buttonA.addItemListener(itemListener);
buttonB.addItemListener(itemListener);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ToggleGroup test = new ToggleGroup();
test.setVisible(true);
}
});
}
private class MyButtonGroup extends ButtonGroup {
private boolean check() {
int result = JOptionPane.showConfirmDialog(
ToggleGroup.this, "May I switch to B?",
"Important question", JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
return result == JOptionPane.YES_OPTION;
}
@Override
public void setSelected(ButtonModel m, boolean b) {
if (!b) {
return;
}
if (m == buttonA.getModel() || m == buttonB.getModel() && check()) {
super.setSelected(m, b);
}
}
}
}
私のコードの問題は明らかです。条件は複数回チェックされるため、ダイアログも複数回表示されます。
では、条件が失敗したときに切り替えの試行を「消費」するにはどうすればよいでしょうか。
編集:
これらのボタンを使用しているコンテキストは、アプリケーションのさまざまなモード間の切り替えの実装です。モードの 1 つは、データを変更して後でコミットできるようにします。コミットされていない変更が存在する場合、モードを切り替えるとデータが失われる可能性があります。切り替えが意図的なものであることを確認したいと思います。条件が満たされるまでいずれかのボタンを無効にすることはできません。