JButton没有出现在JPanel上

时间:2014-05-03 23:20:01

标签: java swing jpanel

我一直在努力学习如何在java中使用布局管理,我有以下代码试图添加类" StartButton&#34 ;, startbutton只是一个扩展JButton的类

当我运行代码时,我的JFrame正确加载并创建了JPanel,我还在layoutItems()中添加了一个print,以确保调用该函数。

这是我的JPannel代码;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JPanel;

public class menuPanel extends JPanel {

    private static final long serialVersionUID = 1L;

    private static final Color BG_COLOR = new Color(0xfaf8ef);


    private startButton startbutton;

    public menuPanel(){
        this.setOpaque(false);
        this.setPreferredSize(new Dimension(300, 400));
        this.setBackground(new Color(107, 106, 104));
        this.setVisible(true);
        setLayout(new GridBagLayout());

        startbutton = new startButton();

        layoutItems();
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(BG_COLOR);
        g.fillRect(0, 0, this.getSize().width, this.getSize().height);
    }


    public void layoutItems(){
        GridBagConstraints c = new GridBagConstraints();
        System.out.println("lol");
        c.weightx = 0.25;
        c.weighty = 0.175;
        c.gridwidth = 2;
        c.gridx = 1;
        c.gridy = 6;
        this.add(startbutton, c);
    }
}

2 个答案:

答案 0 :(得分:1)

忽略在上述课程中调用pack()的建议,因为它不适用于JPanels。相反,不要设置JPanel的大小或首选大小 - 让组件本身和布局管理器执行此操作。然后将所有项目添加到JFrame,在添加所有项目后在其上调用pack(),然后按顺序在其上调用setVisible(true)

哦,您需要将您的开始按钮类名更改为 S tart B utton,因为Java类名称应以大写字母开头,您应该使用驼峰 - 除常量外的所有标识符的大小写。

如果您在尝试这些建议后仍然遇到困难,请考虑创建并发布minimal code example program以供我们审核,测试和修复。

答案 1 :(得分:1)

覆盖paint而不是paintComponent会导致在为任何Swing组件绘制组件的方式中出现不可预测的行为。

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    ...
}

实际上覆盖paintComponent是不必要的,因为setBackground(BG_COLOR)会得到相同的结果