首页 > 解决方案 > 如何在同一个 JFrame 上同时显示多个按钮?

问题描述

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;

public class SpeedMathGoStartScreen extends JFrame{
    
    JLabel background;
    JLabel title;
    JButton play;
    JPanel playPanel;
    JLabel playLabel;
    JButton guide;
    JPanel guidePanel;
    
    public SpeedMathGoStartScreen() {
        
        title = new JLabel("SPEED MATH GO");
        title.setFont(new Font("Comic Sans", Font.BOLD, 96));
        title.setBounds(90, 0, 900, 100);
        this.add(title);
        
        ImageIcon backgroundImage = new ImageIcon("C:\\Users\\chenr\\Documents\\Speed Math Go\\iconfinder_play-circle_2561292\\ttt.png");
        background = new JLabel(backgroundImage);
        background.setBounds(0, 0, 1000, 700);
        this.add(background);
        
        ImageIcon playImage = new ImageIcon("C:\\Users\\chenr\\Documents\\Speed Math Go\\iconfinder_play-circle_2561292\\iconfinder_play-circle_2561292.png");
        play = new JButton("Play", playImage);
        playPanel = new JPanel();
        playPanel.setLayout(null);
        playPanel.setBounds(345, 200, 300, 150);
        play.setBounds(345, 200, 300, 150);
        play.setFont(new Font("Comic Sans", Font.BOLD, 48));
        play.setBackground(Color.RED);
        play.setVisible(true);
        playPanel.add(play);
        this.add(playPanel);
        
        ImageIcon guideImage = new ImageIcon("C:\\Users\\chenr\\Documents\\Speed Math Go\\iconfinder_play-circle_2561292\\iconfinder_thefreeforty_map_1243687.png");
        guide = new JButton("Guide", guideImage);
        guidePanel = new JPanel();
        guidePanel.setLayout(null);
        guidePanel.setBounds(320, 400, 350, 150);
        guide.setBounds(320, 400, 350,  150);
        guide.setFont(new Font("Comic Sans", Font.BOLD, 48));
        guide.setBackground(Color.CYAN);
        guide.setVisible(true);
        guidePanel.add(guide);
        this.add(guidePanel);
        
        //play.addActionListener(new ActionListener()
     //   {
       //   public void actionPerformed(ActionEvent e)
      //    {
       //     new SpeedMathGoGUI();
      //    }
     //   });
        play.addActionListener(
                new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                
                    new SpeedMathGoGUI();
                    dispose();
                }
            });
        
        guide.addActionListener(
                new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        
                        new SpeedMathGoGuide();
                        dispose();
                    }
                }
                );
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(1000, 700);
        setVisible(true);
}
}

如果在 Eclipse 上运行它,则只显示指南按钮。当我注释掉第 56 行(应该是 this.add(guidePanel))时,只显示播放按钮。我必须对我的代码进行哪些调整才能在 JFrame 上显示两者?我还想知道其他类是否可能影响了这个错误,因为当按下按钮时它会转换为另外两个。

标签: javaswingjpaneljbutton

解决方案


不要使用空布局!!!不要使用 setBounds()!!!

Swing 旨在与布局管理器一起使用,因此您需要了解布局管理器的工作原理。

仅显示指南按钮。

this.add(playPanel);
...
this.add(guidePanel);

默认情况下,JFrame 的内容窗格使用BorderLayout.

在上面的代码中,当您将组件添加到 aBorderLayout并且未指定约束时,将CENTER使用该约束。但是,“CENTER”中只能显示一个组件,因此您会看到添加的最后一个组件。

如何同时显示多个按钮

如果您希望面板上有两个按钮(或任何组件),则将两个按钮添加到面板中。基本代码是:

JPanel buttonsPanel = new JPanel();
buttonsPanel.add( play );
buttonsPanel.add( guide );
this.add(buttonsPanel);

JPanel 的默认布局管理器是FlowLayout. 这是一个简单的布局。组件显示在同一行,添加组件时不需要约束。

阅读 Swing 教程中有关布局管理器的部分,以获取更多信息和其他布局管理器的工作示例。您可以根据自己的要求选择合适的布局管理器。您始终可以使用不同的布局管理器嵌套面板以实现所需的布局。


推荐阅读