Когда пользователь нажимает кнопку, я хочу показать всплывающее окно, которое должно содержать как минимум два JTextFields и два JLabel, поэтому использование JOptionPane.showInputDialog
не является возможным.
Простая всплывающая форма java с по меньшей мере двумя полями
Ответ 1
Вы должны хотя бы рассмотреть один из JOptionPane
методов, таких как showInputDialog()
или showMessageDialog()
.
Приложение: выбор использования JOptionPane
больше зависит от пригодности модальности, а не от количества показанных компонентов. Смотрите также Как делать диалоги.
Приложение: Как отмечено в комментарии @camickr, вы можете установить фокус на конкретный компонент, используя подход, описанный в Dialog Focus, цитируемом здесь.
package gui;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.*;
/** @see https://stackoverflow.com/a/3002830/230513 */
class JOptionPaneTest {
private static void display() {
String[] items = {"One", "Two", "Three", "Four", "Five"};
JComboBox<String> combo = new JComboBox<>(items);
JTextField field1 = new JTextField("1234.56");
JTextField field2 = new JTextField("9876.54");
JPanel panel = new JPanel(new GridLayout(0, 1));
panel.add(combo);
panel.add(new JLabel("Field 1:"));
panel.add(field1);
panel.add(new JLabel("Field 2:"));
panel.add(field2);
int result = JOptionPane.showConfirmDialog(null, panel, "Test",
JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
System.out.println(combo.getSelectedItem()
+ " " + field1.getText()
+ " " + field2.getText());
} else {
System.out.println("Cancelled");
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
display();
}
});
}
}
Ответ 2
С небольшой библиотекой UiBooster вы можете создать диалог формы в несколько строк кода.
FilledForm form = new UiBooster()
.createForm("Personal informations")
.addText("Whats your first name?")
.addTextArea("Tell me something about you")
.addSelection(
"Whats your favorite movie?",
Arrays.asList("Pulp Fiction", "Bambi", "The Godfather", "Hangover"))
.show();