GUI类中的Java图像

GUI类中的Java图像,java,Java,您好,我正在开发一个自定义时钟应用程序 我的GUI工作发现我的功能是好的,但我有一个问题3天了。如果不隐藏我的组件,我无法让GUI在后台显示图像 这是我的GUI类代码 public void makeFrame() { contentPane.setLayout(new BorderLayout()); contentPane.add(panel1, BorderLayout.NORTH); contentPane.add(panel2, BorderLayout.CE

您好,我正在开发一个自定义时钟应用程序

我的GUI工作发现我的功能是好的,但我有一个问题3天了。如果不隐藏我的组件,我无法让GUI在后台显示图像

这是我的GUI类代码

public void makeFrame()  {
    contentPane.setLayout(new BorderLayout());
    contentPane.add(panel1, BorderLayout.NORTH);
    contentPane.add(panel2, BorderLayout.CENTER);
    contentPane.add(panel3, BorderLayout.SOUTH);
    contentPane.add(panel4, BorderLayout.WEST);
    contentPane.add(panel5, BorderLayout.EAST);
    panel1.add(label1);
    panel2.setLayout(new GridLayout(3,4));
    panel2.add(time);
    panel2.add(label2);
    panel2.add(stopwatch);
    panel3.setLayout(new FlowLayout());
    panel4.setLayout(new FlowLayout());
    panel5.add(alarm);
    panel5.add(change);
    panel5.setLayout(new FlowLayout());
    label1.setFont(new Font("Arial", Font.PLAIN, 90));
    label1.setForeground(Color.BLUE);
    label2.setFont(new Font("Arial", Font.PLAIN, 70));
    label2.setForeground(Color.RED);
    time.setEditable(true);
    time.setText("Sample Time: n/ 13:45:23 ");
    time.setFont(new Font("Arial", Font.PLAIN, 60));
    stopwatch.setFont(new Font("Arial", Font.PLAIN, 45));
    stopwatch.setSize(20,20);
    stopwatch.setText("00 : 00 : 00");
    stopwatch.setEditable(false);
    stopwatch.add(rounds);

    frame = new JFrame("Clock");
    frame.setLayout(null);
    frame.setSize(600,900);
    paint();
    frame.setContentPane(contentPane);
    makeMenu();
    comboBox();
    stopWatch();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.validate();
    frame.pack();
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);


}
还有paint()方法


我想你要找的是

你可以试试这个

setContentPane(new javax.swing.JLabel(new javax.swing.ImageIcon(getClass().getResource("background_image.jpg"))));
或者您可以在
JFrame
上画图,并在其上添加
JPanel
。现在在
JPanel
上添加组件。确保
JPanel
不不透明。设置背景图像总是很容易的

contentPane.add(panel1, BorderLayout.NORTH);
contentPane.add(panel2, BorderLayout.CENTER);
您的代码正在向内容窗格添加面板,这很好

frame.setContentPane(label);
但是在paint()方法中,您将内容窗格替换为标签,因此您将丢失所有原始面板

首先,不应该覆盖JFrame上的paint()。如果进行自定义绘制,则应重写JPanel的paintComponent()方法,并将面板添加到框架中。此外,绘制方法仅用于绘制,您应该在绘制方法中重新创建组件并将其添加到GUI中。您也不应该以绘画方法阅读图像。绘画应该很有效率

因此,为了解决您的问题,我建议您可以使用。这是一个支持图像绘制的自定义面板,它将使添加到其中的任何组件都不不透明。可以绘制背景图像1)原始大小,2)缩放以填充面板,3)平铺

基本准则是:

//contentPane.setLayout(new BorderLayout());
BackgroundPanel contentPane = new BackgroundPanel(...); // choose your constructor
frame.setContentPane( contentPane );
contentPane.add(panel1, BorderLayout.NORTH);
...

您正在用该标签替换包含其他组件的内容窗格。尝试在内容窗格中使用卡片布局,将标签设置为最低级别,或覆盖框架的paint()方法并将图像添加到其中:永远不要将异常块保留为空。(这与您的问题无关,但可能与未来的问题有关。)@Thomas,
尝试使用卡片布局
-卡片布局一次只能显示一个组件,这将不起作用。此外,您提供的链接中的“已接受”答案是不完整的,因为它没有提到您需要在添加到内容窗格的面板上使用
setOaque(false)
,以便可以看到背景图像。我不确定您的第一个建议与OP已经尝试过的建议有多大的不同(除此之外,它都在一行中)。在contentPane上放置JLabel并设置我们设置的任何背景不会影响JFrame上的组件。唯一的退步是整个JFrame将采用提供的背景图像的大小。因此,如果背景图像发生变化,就会产生问题。一行是快速解决方案,但我的第二个建议更有意义。嗯,我认为这不会有帮助,因为OP正在替换内容窗格,从而将组件从框架中分离。我可能在这里弄错了(几年没有做Swing),如果是这样,请解释一下
setOpaque()
为什么以及如何帮助OP。
//contentPane.setLayout(new BorderLayout());
BackgroundPanel contentPane = new BackgroundPanel(...); // choose your constructor
frame.setContentPane( contentPane );
contentPane.add(panel1, BorderLayout.NORTH);
...