Java使用JButton数组创建按钮仅显示1个的问题求助
问题根因
SetButtons错误继承了JButton类,你实例化的SetButtons对象本身就是一个独立的空白按钮,内部创建的4个功能按钮没有被添加到任何Swing容器中,SetPanel仅添加了SetButtons这一个按钮实例,因此仅显示1个按钮。actionPerformed逻辑错误,判断条件e.getSource() == this只会响应SetButtons本身这个空白按钮的点击事件,内部4个功能按钮的点击不会触发任何自定义逻辑。- 冗余代码:不需要给单个
JButton设置布局,布局管理器仅作用于JPanel这类容器组件。
修复后代码
SetButtons.java
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; // 父类改为JPanel,作为按钮容器 public class SetButtons extends JPanel implements ActionListener { JButton[] buttonArray = new JButton[4]; JButton exitBtn, newGameBtn, checkBtn, clearBtn; Font myFont = new Font("ink free", Font.BOLD,22); public SetButtons(){ this.exitBtn = new JButton("Exit"); this.newGameBtn = new JButton("New Game"); this.checkBtn = new JButton("Check Answer"); this.clearBtn = new JButton("Clear"); this.buttonArray[0] = exitBtn; this.buttonArray[1] = newGameBtn; this.buttonArray[2] = checkBtn; this.buttonArray[3] = clearBtn; // 给当前按钮容器设置流式布局 this.setLayout(new FlowLayout()); for (int i = 0; i < 4; i++){ this.buttonArray[i].addActionListener(this); this.buttonArray[i].setFont(myFont); this.buttonArray[i].setFocusable(false); // 将按钮添加到当前容器中 this.add(buttonArray[i]); } } @Override public void actionPerformed(ActionEvent e) { // 修正事件源判断逻辑 if(e.getSource() == exitBtn){ System.exit(0); } // 其余按钮逻辑可自行扩展 else if(e.getSource() == newGameBtn){ // 新游戏逻辑 }else if(e.getSource() == checkBtn){ // 检查答案逻辑 }else if(e.getSource() == clearBtn){ // 清空逻辑 } } }
SetPanel.java
import javax.swing.*; import java.awt.*; public class SetPanel extends JPanel { Font myFont = new Font("ink free", Font.BOLD,22); // 冗余属性可自行删除 SetLabels labels; SetButtons exitButton; SetPanel(){ SetButtons btn = new SetButtons(); this.add(btn); this.setBackground(Color.darkGray); this.setLayout(new FlowLayout()); } }
修复说明
- 将
SetButtons的父类从JButton改为JPanel,作为承载4个功能按钮的容器 - 在
SetButtons构造方法中遍历按钮数组,将所有按钮添加到当前容器内 - 修正事件响应逻辑,匹配不同按钮的点击事件执行对应操作
- 删除给单个按钮设置布局的冗余代码,改为给按钮容器设置布局
内容的提问来源于stack exchange,提问作者Daniel A. Morales
相关产品推荐
相关产品推荐

