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

Posted

技术标签:

【中文标题】将swing jbutton元素附加到java中的数组【英文标题】:Append swing jbutton elements to array in java 【发布时间】:2022-01-23 20:40:19 【问题描述】:

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

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

JButton[] chat_names = ;

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

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

【问题讨论】:

JButton[] chat_names = ; 在这里您创建了一个长度为 0 的 JButtons 数组,您可以在 for-loops 之前调用 chat_names = new JButton[chat_data.length]; 或创建一个 List&lt;JButton&gt; chatNames = new ArrayList&lt;&gt;() 以获得可变长度的按钮列表,并且作为提示使用camelCase 而不是snake_case 作为您的变量和方法,因为这是约定。还有一件事不要手动指定每个JButton 的边界,而是使用正确的Layout Manager 顺便说一句,您可以合并 for-loops 并将此行包含在第一个循环中:frame.add(chat_names[x]); 太棒了,谢谢。我明白你对数组所说的内容。我去试试你的建议。 第一件事没有成功,但使用 ArrayList 成功了,再次感谢。 那么,让我添加我的评论作为您接受它的答案 【参考方案1】:

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

JButton[] chat_names = ;

你可以打电话

chat_names = new JButton[chat_data.length]; 

for-loops之前或创建一个

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

拥有可变长度的按钮列表

作为提示,您的变量和方法使用camelCase 而不是snake_case,因为那是convention。

还有一件事不要手动指定每个JButton 的边界,而是使用正确的Layout Manager,例如GridLayout 或BoxLayout 可能会起作用。如果您坚持使用setBounds 和(肯定更)null-layout,当您尝试在不同的计算机或不同的显示器上运行它时,您可能会发现自己遇到类似于this one 的问题。

你也可以合并这两个循环:

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]);

【讨论】:

以上是关于将swing jbutton元素附加到java中的数组的主要内容,如果未能解决你的问题,请参考以下文章

java游戏开发之JRadioButton

Swing学习篇 API [一]Swing常用组件

java GUI编程(swing)之二swing按钮组件

为啥我在 Swing 的 JButton 中的 html 代码偏离中心?

java JButton按钮始终居中

我可以让 Swing JButton 的边距更小吗?