JOptionPane настроить ввод

Все, что я хочу сделать, это иметь JOptionPane inputDialog с JTextArea вместо JTextField.
Я попытался поместить JTextArea внутри параметра Message, вот так

Object[] inputText = new Object[]{new JLabel("Enter Graph Information"),
                                  newJTextArea("",20,10)};
graphInfo=(String)JOptionPane.showInputDialog(null,
                                              inputText,
                                              "Create Graph",
                                              JOptionPane.PLAIN_MESSAGE,
                                              null,
                                              null,
                                              "");

Но у него все еще есть текстовое поле внизу, и я не могу получить текст из JTextArea. Есть ли способ удалить исходное текстовое поле и получить текст из jtextarea или полностью заменить текстовое поле текстовой областью? Я стараюсь по возможности избегать создания настраиваемого диалогового окна, и это «кажется» чем-то, что должно быть легко сделать?


person Matt Phillips    schedule 18.01.2010    source источник
comment
возможный дубликат Java - Как создать настраиваемое диалоговое окно?   -  person Tony    schedule 25.10.2014


Ответы (1)


Вы на правильном пути; вам просто нужно использовать showConfirmDialog вместо showMessageDialog, что позволяет передавать любое Component в качестве «сообщения» и отображать его в JDialog. Затем вы можете захватить содержимое JTextArea, если пользователь щелкнет OK; например

int okCxl = JOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(this),
                                    textArea,
                                    "Enter Data",
                                    JOptionPane.OK_CANCEL_OPTION)

if (okCxl == JOptionPane.OK_OPTION) {
  String text = textArea.getText();
  // Process text.
}

Если вы хотите показать JLabel вместе с вашим JTextArea, вы можете создать и передать JPanel, содержащий оба Components; например

JTextArea textArea = ...
JPanel pnl = new JPanel(new BorderLayout());

pnl.add(new JLabel("Please enter some data:"), BorderLayout.NORTH);
pnl.add(textArea, BorderLayout.CENTER);

JOptionPane.show...
person Adamski    schedule 18.01.2010
comment
+1 ты меня опередил :) Еще я не знал про SwingUtilities.getWindowAncestor () - круто. - person Joshua McKinnon; 19.01.2010
comment
Спасибо. Раньше я использовал JOptionPane.getFrameForComponent (this), но понял, что SwingUtilities.getWindowAncestor лучше, если родительский элемент вашего диалога также является JDialog. - person Adamski; 19.01.2010
comment
интересно, что когда я создаю диалог внутри слушателя действий, я не могу использовать SwingUtilities.getWindowAncestor: (хотя следующая строка работала. int okCxl = JOptionPane.showConfirmDialog (null, temp, Create new graph, JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MOD) ; - person Matt Phillips; 20.01.2010
comment
Изнутри ActionListener вызов SwingUtilities.getWindowAncestor (this) вернет ссылку на ActionListener, а не на родительский компонент. Вместо того, чтобы проходить это, вам нужно передать ‹Внешний класс› .this. - person Adamski; 04.11.2013