我正在开发一个可以由其他人更改单词的程序,并且我尝试让用户在按下“添加”时可以更改任意数量的单词,以添加更多行。我会尝试解释一下自己,程序应该如下所示:
如果我按添加:
如果我继续按“添加”,它应该会添加越来越多的“行”。
为此,我使用这个:
JTextField oldword = new JTextField(5);
JTextField newword = new JTextField(5);
JPanel Panel = new JPanel();
List<JPanel> message = new ArrayList<JPanel>();
String[] options = new String[] {"Ok", "Cancel", "Add", "Delete"};
Panel.add(new JLabel("Change: "));
Panel.add(oldword);
Panel.add(Box.createHorizontalStrut(15));
Panel.add(new JLabel("by:"));
Panel.add(newword);
message.add(Panel);
while(response!=0 && response!=1){
response = JOptionPane.showOptionDialog(null, message, "Title",
JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);
if(response==2){
message.add(Panel);
}
}
但是当它到达“response = JOptionPane.showOptionDialog”时,我只得到一个带有以下内容的框:
如果我按“添加”,它就会开始重复该消息。
抱歉,如果我没有清楚地解释我的问题,我的语言能力很差。
最佳答案
您正在使用 ArrayList<JPanel>
作为消息。自 message
参数不是String
,但是Object
,任何对象都被接受。
在您的情况下,该列表包含 JPanel
其具有 toString()
这不适合您的消息(它更适合调试)。
对象的toString()
被调用并显示其结果,这是完全合法的代码,但很可能不是您想要的。
也许您想使用 StringBuilder构建要显示的字符串。
例如
StringBuilder builder = new StringBuilder();
builder.append("Change: ")
.append(oldword.getText())
.append("by:")
.append(newword.getText())
.toString();
编辑:
实际上可以显示 JPanel
在消息中,当您使用Component
时,它将被显示(但是当使用 ArrayList
时,它将不起作用):
JPanel panel = new JPanel();
JTextField oldword = new JTextField(5);
JTextField newword = new JTextField(5);
String[] options = new String[] {"Ok", "Cancel", "Add", "Delete"};
panel.add(new JLabel("Change: "));
panel.add(oldword);
panel.add(new JLabel("by:"));
panel.add(newword);
JOptionPane.showOptionDialog(null, panel, "Title",
JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);
如果你想显示多个Panel,你可以将它们放入一个 super Panel中并像Stack swing elements from top to bottom那样堆叠起来。
关于java - 在 JOptionPane.showOptionDialog 中使用 Arraylist 作为消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31774943/