Java Swing中按钮所在JPanel不显示,仅Label面板可见的解决求助
问题分析
问题出在JFrame默认的布局管理器是BorderLayout,当你直接调用frame.add(panel1)和frame.add(panel2)时,没有指定布局位置,两个组件都会被默认添加到BorderLayout.CENTER区域——后添加的panel2会完全覆盖之前的panel1,导致按钮面板无法显示。
解决方案
有两种简单的调整方式,都能实现panel1在上、panel2在下的布局效果:
方式1:利用BorderLayout指定位置
给每个面板明确指定在BorderLayout中的位置,比如把panel1放在顶部(NORTH),panel2放在底部(SOUTH):
public GUI() { JFrame frame = new JFrame("GUI Game"); frame.setPreferredSize(new Dimension(300, 205)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton increase = new JButton("Increase"); JButton decrease = new JButton("Decrease"); JPanel panel1 = new JPanel(new GridLayout(2, 1)); JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.LEFT)); JLabel points = new JLabel("Points:"); panel1.add(increase); panel1.add(decrease); panel2.add(points); // 明确指定布局位置 frame.add(panel1, BorderLayout.NORTH); frame.add(panel2, BorderLayout.SOUTH); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); }
方式2:使用主面板包裹两个子面板
创建一个主面板,设置垂直方向的网格布局,再把panel1和panel2添加到主面板,最后将主面板添加到frame:
public GUI() { JFrame frame = new JFrame("GUI Game"); frame.setPreferredSize(new Dimension(300, 205)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton increase = new JButton("Increase"); JButton decrease = new JButton("Decrease"); JPanel panel1 = new JPanel(new GridLayout(2, 1)); JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.LEFT)); // 创建主面板,设置2行1列的网格布局 JPanel mainPanel = new JPanel(new GridLayout(2, 1)); JLabel points = new JLabel("Points:"); panel1.add(increase); panel1.add(decrease); panel2.add(points); // 将子面板添加到主面板 mainPanel.add(panel1); mainPanel.add(panel2); // 把主面板添加到frame frame.add(mainPanel); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); }
两种方式都能让两个面板正常显示,你可以根据后续扩展需求选择更合适的布局方案。
内容的提问来源于stack exchange,提问作者jamesdiaz
相关产品推荐
相关产品推荐

