Просто для удовольствия, однонаправленное связывание бедных людей, реализованное с помощью InputVerifier: обратите внимание, что гарантированно будет доступен входной драйвер, прежде чем передавать фокус (и, похоже, работает в текущих версиях jdk), возникли некоторые проблемы в более ранних версиях из них), так что делать какие-либо обновления в проверяющего должны быть безопасными, пока передача фокуса участвует в фиксации действия:
верификатор, и некоторые сырой объект данных:
/**
* Very simple uni-directional binding (component --> data) class.
*/
public static class BindingVerifier extends InputVerifier {
private RawData data;
private boolean first;
public BindingVerifier(RawData data, boolean first) {
this.data = data;
this.first = first;
}
@Override
public boolean shouldYieldFocus(JComponent input) {
String text = ((JTextComponent) input).getText();
if (first) {
data.one = text;
} else {
data.two = text;
}
return true;
}
@Override
public boolean verify(JComponent input) {
return true;
}
}
public static class RawData {
String one;
String two;
public RawData(String one, String two) {
this.one = one;
this.two = two;
}
public String toString() {
return one + "/" + two;
}
}
Использование:
final RawData data = new RawData(null, null);
JTextField first = new JTextField(20);
first.setInputVerifier(new BindingVerifier(data, true));
JTextField second = new JTextField(20);
second.setInputVerifier(new BindingVerifier(data, false));
Action commit = new AbstractAction("commit") {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(data);
}
};
JComponent form = new JPanel();
form.add(first);
form.add(second);
form.add(new JButton(commit));
Что такое 'FocusOut'? Я никогда не слышал об этом событии. – camickr
недавнее QA показывает [валидность формы [плохого человека]] (http://stackoverflow.com/a/14041811/203657) - для более развитого элемента управления рассмотрите использование структуры проверки, например f.i. JGoodies. Не мой день для тщательного чтения ;-) только что заметил, что ваш вопрос связан с управлением привязкой и проверкой: оберните действие фиксации в SwingUtilities.invokeLater, чтобы гарантировать, что сначала нужно перенести значение поля в класс данных перед фиксацией. – kleopatra