Java 为什么背景图片的JFrame上的按钮不能正确显示
我最近编写了一个包含背景图像的系统主页。设置背景后,我创建的按钮无法正确显示。它只是在我使用鼠标并指向按钮的位置后出现。有人能教我如何解决这个问题吗?谢谢你的帮助。代码如下: 公共类主页扩展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
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
的布局,您打算设置容器的布局.Docon.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()
问题的迹象。