为什么带有背景图片的JFrame上的按钮无法正常显示

时间:2016-11-28 05:28:48

标签: java swing jframe

我最近编码了一个包含背景图片的系统主页。设置背景后,我创建的按钮无法正常显示。它只是在我使用鼠标并指向按钮的位置后出现。有人可以教我如何解决这个问题吗?感谢您的帮助。代码如下:

public class HomePage扩展了JFrame {

private JPanel button = new JPanel();
private JButton time = new JButton("Bus Schedule");
private JButton reserve = new JButton("Booking");
private JButton info = new JButton("About Us");
Container con = getContentPane();


public HomePage(){

    setTitle("Bus Reservation System");
    setSize(650,500);
    setLocation(360,100);
    setVisible(true);
    setResizable(false);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    setBackground();
    setButton();
}


public void setBackground(){

    JLabel background = new JLabel(new ImageIcon("C:/User/Desktop/Assignment/bg.jpg"));
    con.add(background);
    background.setLayout(new FlowLayout());
    con.add(button);

}


public void setButton(){

    Font but = new Font("Serif" , Font.ITALIC , 20);

    info.setFont(but);
    time.setFont(but);
    reserve.setFont(but);

    button.add(info);
    button.add(time);
    button.add(reserve);

    con.add(button);

}

3 个答案:

答案 0 :(得分:1)

简单错误(可能是拼写错误?),您正在设置JLabel的布局,您打算设置Container的布局。请con.setLayout(new FlowLayout());代替background.setLayout(...)

另外,我相信你的文件路径不正确。为了测试,只需将文件放在项目中并执行类似" bg.jpg"的路径,如果可行,我们可以验证这一点。对我有用。我认为这是问题的原因是因为您指定了C:/Users,但从未给出特定用户的文件夹。正确的路径是C:/Users/Your_name/Desktop/Assignment/bg.jpg

我不确定在那个路径部分,因为我不在你的系统上。但是,对我来说,如果我在我的日食中运行你的代码,这就解决了它。

编辑: 最后一点,图像并不是真正的"背景"使用当前代码的图像,因为它将使用FlowLayout移动它下面的按钮而不是它上面的按钮。您可能想要使用不同的布局。

答案 1 :(得分:1)

致电setVisible(true)后,如果您执行某些操作,则必须手动validate()revalidate()您的窗口。

在初始化所有所需设置和窗口成员资格后,只需调用setVisible()即可。

/* setVisible(true); -- wrong place */
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBackground();
setButton();
setVisible(true); // proper place

答案 2 :(得分:0)

首先,如前所述,在{email: req.body.email} 上调用setVisible(true)之前,应将所有组件添加到框架中。

JFrame

基于上面的代码,您将向内容窗格添加两个组件,因此GUI的层次结构如下所示:

JLabel background = new JLabel(new ImageIcon("C:/User/Desktop/Assignment/bg.jpg"));
con.add(background);
background.setLayout(new FlowLayout());
con.add(button);

在我看来,你希望你的GUI看起来像这样:

- frame
    - content pane
        - background
        - button

所以你的代码应该是:

- frame
    - content pane
        - background
            - button