0

我正在开发一个消息传递应用程序。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上都有一个。

4

1 回答 1

1

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

JButton[] chat_names = {};

你可以打电话

chat_names = new JButton[chat_data.length]; 

for-loopsor 之前创建一个

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

有一个可变长度的按钮列表

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

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

您还可以合并这两个循环:

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]);
}
于 2021-12-22T19:44:29.293 回答