自定义JPanel中JButton重叠显示问题排查与解决
问题原因
- 核心bug出在
MyButtonPanel的构造方法中:Arrays.fill(tab, new JButton())只会创建一个JButton实例,然后把数组所有元素都指向这个实例。也就是说tab[0]、tab[1]、tab[2]本质是同一个按钮对象。 - Swing的规则是:同一个组件只能被添加到容器一次,多次添加只会让它停留在最后一次的位置,视觉上就表现为三个按钮重叠,面板也被压缩成极小尺寸。
解决方法
修改MyButtonPanel的构造方法,通过循环创建独立的JButton实例,替换Arrays.fill的错误用法:
class MyButtonPanel extends JPanel{ JButton[] tab; public MyButtonPanel(int numOfButtons, LayoutManager layout) { this.tab = new JButton[numOfButtons]; // 循环生成独立的JButton,避免引用同一个实例 for (int i = 0; i < numOfButtons; i++) { tab[i] = new JButton(); } this.setLayout(layout); } }
额外优化:MyTopLeftPanel中重复调用的this.setLayout(new FlowLayout())可以删除,因为父类构造方法已经设置过布局。
修改后运行,三个按钮会作为独立组件,按照FlowLayout规则横向正常排列。
内容的提问来源于stack exchange,提问作者adamDud
相关产品推荐
相关产品推荐

