Мне нужно, чтобы пользователь вводил имя, и я хочу отключить кнопку ok, пока не будет указан какой-либо ввод. Как я могу отключить его...?
Отключить кнопку ok на JOptionPane.dialog, пока пользователь не даст вход
Ответ 1
JOptionPane
позволяет вам указать компонент как панель сообщений и элементы управления/параметры, которые могут отображаться на нем.
Если вы добавляете правильных слушателей к компоненту сообщения, вы должны иметь возможность влиять на элементы управления, которые используются в качестве параметров.
Обновление
Например...
public class TestOptionPane05 {
public static void main(String[] args) {
new TestOptionPane05();
}
protected JOptionPane getOptionPane(JComponent parent) {
JOptionPane pane = null;
if (!(parent instanceof JOptionPane)) {
pane = getOptionPane((JComponent)parent.getParent());
} else {
pane = (JOptionPane) parent;
}
return pane;
}
public TestOptionPane05() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
final JButton okay = new JButton("Ok");
okay.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane pane = getOptionPane((JComponent)e.getSource());
pane.setValue(okay);
}
});
okay.setEnabled(false);
final JButton cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane pane = getOptionPane((JComponent)e.getSource());
pane.setValue(cancel);
}
});
final JTextField field = new JTextField();
field.getDocument().addDocumentListener(new DocumentListener() {
protected void update() {
okay.setEnabled(field.getText().length() > 0);
}
@Override
public void insertUpdate(DocumentEvent e) {
update();
}
@Override
public void removeUpdate(DocumentEvent e) {
update();
}
@Override
public void changedUpdate(DocumentEvent e) {
update();
}
});
JOptionPane.showOptionDialog(
null,
field,
"Get",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
new Object[]{okay, cancel},
okay);
}
});
}
}
Ответ 2
Насколько я знаю, это невозможно без переопределения JOptionPane
.
Ответ 3
Попробуйте найти библиотеки swinglabs или jGoodies для Java. Они имеют встроенный тип для того, что вам нужно.
Ответ 4
Мне нужно, чтобы пользователь вводил имя, и я хочу отключить кнопку ok, пока не будет указан какой-либо ввод.
неправильный способ сделать это.
то есть. define 'what is name' = может быть что угодно.
Итак, что вы пытаетесь сделать, это не принять пустую строку,
и вы делаете это как проверку ошибок после нажатия кнопки OK.
если пусто - всплывающее сообщение об ошибке/запрос повторного ввода/подтверждение отмены/все, что вы хотите сделать