Сценарий использования: состояние кнопки соответствует некоторому внешнему состоянию, например значение столбца БД. После нажатия кнопки внешнее состояние соответствующим образом изменяется, но запрос по какой-либо причине может оказаться неудачным. Состояние графического интерфейса должно соответствовать фактическому внешнему состоянию, поэтому оно должно следовать за последним, а не наоборот.
Имейте в виду, что начальное выбранное состояние переключателя устанавливается программно (в соответствии с внешним состоянием). Этот вызов не должен быть перехвачен. Если бы это было так, то при каждой загрузке графического интерфейса в описанном сценарии возникал бы ненужный запрос.
Является ли прослушивание щелчков мыши и использование события в случае «вето» единственным способом? Ненавижу слушать щелчки мыши, от этого пахнет неуклюжим дизайном.
Если вы запустите демо-версию, вы заметите это в консоли еще до того, как сделаете какой-либо щелчок.
Код: Выделить всё
Updating external state to true...
Код: Выделить всё
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.WindowConstants;
import java.awt.Container;
public class ToggleButtonDemo {
public static void main(String[] args) {
Container mainPanel = createMainPanel();
JFrame frame = new JFrame("Toggle Button Demo");
frame.setContentPane(mainPanel);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private static JPanel createMainPanel() {
JPanel panel = new JPanel();
panel.add(toggleButtonPanel());
return panel;
}
private static JPanel toggleButtonPanel() {
JPanel toggleButtonPanel = new JPanel();
toggleButtonPanel.add(createToggleButton());
return toggleButtonPanel;
}
private static JToggleButton createToggleButton() {
JToggleButton toggleButton = new JToggleButton("Toggle me");
toggleButton.setModel(new JToggleButton.ToggleButtonModel() {
@Override
public void setSelected(boolean b) {
// intercepts programmatic calls too, unacceptable
if (externalStateUpdated(b)) super.setSelected(b);
}
});
toggleButton.setSelected(isSelectedInDb());
return toggleButton;
}
private static boolean externalStateUpdated(boolean requestedSelected) {
System.out.printf("Updating external state to %s...\n", requestedSelected);
return true;
}
private static boolean isSelectedInDb() {
// assuming it's always true
return true;
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... ton-clicks
Мобильная версия