Java 为什么背景图片的JFrame上的按钮不能正确显示

Java 为什么背景图片的JFrame上的按钮不能正确显示,java,swing,jframe,Java,Swing,Jframe,我最近编写了一个包含背景图像的系统主页。设置背景后,我创建的按钮无法正确显示。它只是在我使用鼠标并指向按钮的位置后出现。有人能教我如何解决这个问题吗?谢谢你的帮助。代码如下: 公共类主页扩展JFrame{ private JPanel button = new JPanel(); private JButton time = new JButton("Bus Schedule"); private JButton reserve = new JButton("Booking"); private

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

公共类主页扩展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);

}
简单的错误(可能是打字错误?),您正在设置
JLabel
的布局,您打算设置
容器的布局
.Do
con.setLayout(new FlowLayout());
而不是
background.setLayout(…)

另外,我认为您的文件路径不正确。为了进行测试,只需将文件放入项目中,并执行类似“bg.jpg”的路径,如果有效,我们可以验证。对我来说,有效。我认为这是因为您指定了
C:/Users
,但从未为特定用户提供文件夹。正确的路径是
C:/Users/Your_name/Desktop/Assignment/bg.jpg

我不确定路径部分,因为我不在您的系统上。但是,对我来说,如果我在eclipse中运行您的代码,这会修复它

编辑:
最后一件事,对于当前代码,该图像实际上不会是“背景”图像,因为它会在其下方移动按钮,而不是在FlowLayout的上方。您可能需要使用不同的布局。

在调用
setVisible(true)
后,如果执行某些操作,则必须手动
验证()
重新验证()
您的窗口

初始化所有所需的设置和窗口成员资格后,只需调用
setVisible()
就更简单了

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

首先,如前所述,在调用
JFrame
上的
setVisible(true)
之前,应将所有组件添加到框架中

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
在我看来,您希望您的GUI如下所示:

- frame
    - content pane
        - background
        - button
- frame
    - content pane
        - background
            - button
因此,您的代码应该是:

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

这是正确的,很高兴你提到了它。但是,这似乎不是问题的根源,即使进行了此更改,图像文件也不会显示。(我正在我的系统上测试他的精确代码)。成功的原因是更改了路径并设置了整个容器的布局。@Ashwingup这一点非常好;我错过了JLabel的布局,而不是仅仅通过目视检查code.Ty的容器。我知道这是怎么回事。我第一次也错过了它(以及您指出的事情)。这就是为什么我在我的系统上测试了它,我没有发现任何错误,也很好奇它为什么不工作。这就是我发现问题的时候。@AshwinGupta“它在我使用鼠标并指向按钮的位置后出现”肯定是一个缺少
validate()
revalidate()
问题的迹象。