当前位置: 首页 > 知识库问答 >
问题:

添加两个JPanels时的问题

隗驰
2023-03-14

我正在尝试将两个JPanels添加到一个JFrame中,一个有一个简单的背景,另一个有按钮等,要么我只得到按钮,要么只有背景。我在任何地方都找不到解决我的问题的办法,所以如果有任何帮助,我将不胜感激。我对Java还是个新手,所以请不要讨厌。

GuimainMenu:

public class GuiMainMenu extends JFrame implements ActionListener, KeyListener {
    private static final long serialVersionUID = -7936366600070922227L;

    Color blue = new Color(114, 137, 218);
    Color gray = new Color(44, 47, 51);
    Color white = new Color(255, 255, 255);

    ImagePanel panel = new ImagePanel(new ImageIcon("image.png").getImage());

    public static int width;
    public static int height;

    JPanel p = new JPanel();
    JPanel p1 = new JPanel();
    JLabel l = new JLabel();
    JLabel l1 = new JLabel();
    JLabel l2 = new JLabel();
    JButton b = new JButton();
    JButton b1 = new JButton();
    JButton b2 = new JButton();
    String title = "-";

    
    public GuiMainMenu() {
        setSize(m.X, m.Y);
        setTitle(title);
        setResizable(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addKeyListener(this);

        p.setLayout(null);

        width = getWidth();
        height = getHeight();

        getRootPane().addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                width = getWidth();
                height = getHeight();

                addButtons();
                addLabels();
            }
        });

        addLabels();
        addButtons();
        
        add(p);
        add(panel);
        setVisible(true);
    }

    public void addLabels() {
        l.setSize(width, height);
        l.setLocation(5, -40);
        l.setText("x");
        l.setHorizontalAlignment(SwingConstants.LEFT);
        l.setVerticalAlignment(SwingConstants.BOTTOM);
        l.setForeground(blue);
        l.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));

        l1.setSize(width, height);
        l1.setLocation(-22, -40);
        l1.setText("y");
        l1.setHorizontalAlignment(SwingConstants.RIGHT);
        l1.setVerticalAlignment(SwingConstants.BOTTOM);
        l1.setForeground(blue);
        l1.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));

        l2.setText("test label");
        l2.setSize(width, height);
        l2.setLocation(0, -75);
        l2.setVerticalAlignment(SwingConstants.CENTER);
        l2.setHorizontalAlignment(SwingConstants.CENTER);
        l2.setForeground(blue);
        l2.setFont(new Font("Trebuchet MS", Font.BOLD, 26));

        p.add(l);
        p.add(l1);
        p.add(l2);
        validate();
    }

    public void addButtons() {
        b.setText("button0");
        b.setFocusable(false);
        b.setBorder(null);
        b.setLocation(width / 2 - 200, height / 2 - 35);
        b.setSize(400, 35);
        b.setForeground(white);
        b.setBackground(blue);
        b.addActionListener(this);

        b1.setText("button1");
        b1.setFocusable(false);
        b1.setBorder(null);
        b1.setLocation(width / 2 - 200, height / 2 + 10);
        b1.setSize(400, 35);
        b1.setForeground(white);
        b1.setBackground(blue);
        b1.addActionListener(this);

        p.add(b);
        p.add(b1);
        validate();
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
    }

    @Override
    public void keyPressed(KeyEvent arg0) {
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
    }

    @Override
    public void keyTyped(KeyEvent arg0) {
    }
}

ImagePanel类:

class ImagePanel extends JPanel {
    private static final long serialVersionUID = -7270956677693528549L;
    private Image img;

    public ImagePanel(String img) {
        this(new ImageIcon(img).getImage());
    }

    public ImagePanel(Image img) {
        this.img = img;
    }

    public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, GuiMainMenu.width, GuiMainMenu.height, null);
    }
}

共有2个答案

潘嘉颖
2023-03-14
p.setLayout(null); 

不要使用空布局。Swing被设计用于布局管理器。

要么只有按钮要么只有背景

add(p);
add(panel);

JFrame的默认布局管理器是BorderLayout。如果不指定约束,则两个组件都将添加到中心。但是,只显示最后添加的一个。

尝试以下操作以查看其区别:

add(p, BorderLayout.PAGE_STRT);
add(panel, BorderLayout.CENTER);

一个带有简单的背景,另一个带有按钮等。

然而上面不是你想要的。Swing组件具有父/子关系。所以你真正需要的是:

backgroundPanel.add(buttonPanel);
add(backgroundPanel, BorderLayout.CENTER);

注我使用了更有意义的名字,因为“p”和“panel”不是描述性的。为变量使用描述性名称,这样人们就能理解它们的意思。

闾丘博
2023-03-14

我假设您希望显示一个带有背景图像和各种组件的JFrame。我认为在检查了您的代码后,您的部分有一些误解导致了问题。

我已经创建了一个简短的代码片段,它完成了基本的操作,也许可以帮助您解决问题。(未测试!)

@SuppressWarnings("serial")
public class GuiMainMenu extends JFrame{

    private BufferedImage imageBackground;  // TODO: load your background image

    public GuiMainMenu(){
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(1024, 768));
        setMinimumSize(new Dimension(800, 600));
        // TODO: setLayout if needed
        JPanel panel = (JPanel)add(new JPanel(){
            @Override
            public void paintComponent(Graphics g){
                super.paintComponent(g);
                g.drawImage(imageBackground, 0, 0, null);
            }
        });
        addOtherComponents(panel);
        pack();
        setLocationRelativeTo(null);
        setTitle("Your Title her");
        setVisible(true);
    }

    private void addOtherComponents(JPanel panel){
        //TODO: add the needed Stuff
        //panel.add ...
    }
}
 类似资料:
  • 问题内容: 我现在有一个发送HTTP请求的SwingWorker,并且我重写了SwingWorker的done()方法来更改JFrame中的内容。我想基本上删除所有内容,并根据服务器返回的值在JFrame上添加一个新的成员面板。 现在,我面临的问题是,当我在JFrame上调用以下方法时,它不会从JFrame中删除任何内容,也不会更改它在Frame中包含的内容。 我当前的修复方法如下,但我宁愿更改J

  • 问题内容: 我在3个单独的类中有3个窗口,我想使用cardLayout,以便当你单击next按钮时,将出现下一个窗口。如何将包含不同元素的JPanels添加到一个cardLayout?这是第一个窗口:(尽管唯一的区别是背景-但它代表了我实际得到它的想法) 第二个窗口: 最后一个: 问题答案: 我做了一个小程序,希望程序中写的注释可以指导你了解如何使用CardLayout。

  • 问题内容: 我有两个数字。例如: 为什么数字不支持算术运算?无论如何,我将如何在Java中将这两个数字相加?(当然,我是从某个地方获取它们的,我不知道它们是Integer还是float等)。 问题答案: 你不知道数字是整数还是浮点数…使用该类时,编译器也不知道你的数字是整数,浮点数还是其他东西。结果,像+和-这样的基本数学运算符不起作用;计算机将不知道如何处理这些值。 开始编辑 根据讨论,我认为一

  • 问题内容: 我尝试将两个jpanel并排放置,但是在这一刻,我无法执行我想要的代码, `我尝试再放一个jpanel: 此代码无效,也不会出错。 问题答案: 如果我正确理解了您的问题,则希望并排放置2个JPanel。查看布局GridLayout。 您需要setLayout(new GridLayout(1,2)); 上面写着1 Row,2 Col

  • 我有一个JPanel、窗口和一组JPanel和JLabel。我想在JFrame中添加5个JPanel,在每个JPanel中添加一个JLabel。每个JPanel将用于表示有关骰子的数据。 但是,当我运行代码时,只有最后一个JPanel出现在JFrame上,并带有文本“Dice 4”。我不明白为什么。 守则:

  • 问题内容: 我有此代码使用angular js: 我可以进行乘法,除法和减法,但是对于加法,代码仅将x和y值连接在一起(即,如果x = 3且y = 4,则总数为34,而不是7)。 我究竟做错了什么? 问题答案: 如果确实如此,那么正在发生的事情是将为x和y传递的值视为字符串并连接在一起。您应该做的是使用 或者如果您希望简洁