Перехват нажатий кнопок переключения пользователяJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Перехват нажатий кнопок переключения пользователя

Сообщение Anonymous »

Можете ли вы перехватить клики JToggleButton, сделав изменение выбранного свойства условным? Если вы добавите ItemListener или ActionListener, вы не сможете наложить вето на изменение, оно уже произошло. Обратное переключение состояния создаст дополнительное событие (не должно быть никаких событий, если на клик наложено вето).
Сценарий использования: состояние кнопки соответствует некоторому внешнему состоянию, например значение столбца БД. После нажатия кнопки внешнее состояние соответствующим образом изменяется, но запрос по какой-либо причине может оказаться неудачным. Состояние графического интерфейса должно соответствовать фактическому внешнему состоянию, поэтому оно должно следовать за последним, а не наоборот.
Имейте в виду, что начальное выбранное состояние переключателя устанавливается программно (в соответствии с внешним состоянием). Этот вызов не должен быть перехвачен. Если бы это было так, то при каждой загрузке графического интерфейса в описанном сценарии возникал бы ненужный запрос.
Является ли прослушивание щелчков мыши и использование события в случае «вето» единственным способом? Ненавижу слушать щелчки мыши, от этого пахнет неуклюжим дизайном.
Если вы запустите демо-версию, вы заметите это в консоли еще до того, как сделаете какой-либо щелчок.

Код: Выделить всё

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;
}
}
Java 8.


Подробнее здесь: https://stackoverflow.com/questions/798 ... ton-clicks
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»