在 java 中将 swing jbutton 元素附加到数组中

Append swing jbutton elements to array in java

提问人:Gamaray 提问时间:12/23/2021 最后编辑:Andrew ThompsonGamaray 更新时间:12/23/2021 访问量:104

问:

我正在开发一个消息传递应用程序。GUI 是用 Java Swing 编写的。当客户端启动时,它会向我的服务器询问特定用户参与的聊天。服务器将以字符串数组的形式发送这些内容,例如:.{CHAT_PATH,CHAT_PATH}

一旦客户端收到它,它就会将其馈送到我的 GUI 类,该类应该在向下列出的屏幕上显示列表中的每个聊天名称(我将过滤掉路径的其余部分)。这就是我的问题所在。我首先创建一个列表:JButton

JButton[] chat_names = {};

然后我遍历聊天列表(chat_data),并为每个聊天名称添加一个新的 JButton 到我的chat_names列表中。喜欢这个:

for (int x=0; x<chat_data.length-1; x++){
    chat_names[x] = new JButton(chat_data[x]);
    chat_names[x].setBounds(100,100,100,100);
}
    
for (int x=0; x<chat_names.length; x++){
    frame.add(chat_names[x]);
}

当我这样做时,我收到以下语法错误:

Exception in thread "main" 
java.lang.ArrayIndexOutOfBoundsException: Index 0 out of   
bounds for length 0
at gui_main.menu_screen(gui_main.java:16)
at Main.main(Main.java:89)

有谁知道这是否是可修复的,或者我可以以另一种方式显示按钮列表,每个按钮上都有一个按钮。chat_name

Java swing jbutton 数组索引OutofboundsException

评论

2赞 Frakcool 12/23/2021
JButton[] chat_names = {};在这里,您创建了一个长度为 0 的数组,您可以在 之前调用或创建一个按钮的可变长度列表,并作为提示使用而不是用于您的变量和方法,因为这是约定。还有一件事 不要手动指定每个边界 ,而是使用适当的布局管理器JButtonschat_names = new JButton[chat_data.length];for-loopsList<JButton> chatNames = new ArrayList<>()camelCasesnake_caseJButton
1赞 Frakcool 12/23/2021
顺便说一句,您可以合并两者并在第一个循环中包含以下行:for-loopsframe.add(chat_names[x]);
0赞 Gamaray 12/23/2021
太棒了,谢谢。我明白你在说什么。我会去试试你的建议。
0赞 Gamaray 12/23/2021
第一件事没有成功,但使用 ArrayList 成功了,再次感谢。
0赞 Frakcool 12/23/2021
然后,让我添加我的评论作为答案,以便您接受它

答:

1赞 Frakcool 12/23/2021 #1

在这里,您创建了一个长度为 0 的 JButton 数组

JButton[] chat_names = {};

您可以致电

chat_names = new JButton[chat_data.length]; 

在 or 之前创建一个for-loops

List<JButton> chatNames = new ArrayList<>();

具有可变长度的按钮列表

作为提示使用,而不是用于您的变量和方法,因为这是约定俗成camelCasesnake_case

还有一件事,不要手动指定每个的边界,而是使用适当的布局管理器,例如 GridLayoutBoxLayout 可能会起作用。如果您坚持使用并且(非常肯定)在尝试在另一台计算机或不同的显示器上运行它时,您可能会发现自己遇到了与类似的问题。JButtonsetBoundsnull-layout

您还可以合并以下 2 个循环:

for (int x=0; x<chat_data.length-1; x++){
    chat_names[x] = new JButton(chat_data[x]);
    chat_names[x].setBounds(100,100,100,100);
}
    
for (int x=0; x<chat_names.length; x++){
    frame.add(chat_names[x]);
}

合二为一,减少所有聊天的一次迭代,从而提高性能:

for (int x=0; x<chat_data.length-1; x++){
    chat_names[x] = new JButton(chat_data[x]);
    chat_names[x].setBounds(100,100,100,100); //Use a layout manager!
    frame.add(chat_names[x]);
}