繁体   English   中英

GUI类中的Java映像

[英]Java Images in the GUI class

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

我的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()方法

 public void paint() {
     BufferedImage img = null;
        try {
            //load the image
            img = ImageIO.read(new File("C:/Users/User/workspace/Alarm Clock/src/Clock/clock.jpg"));

            ImageIcon image = new ImageIcon(img);
            JLabel label = new JLabel(image);
            frame.setContentPane(label);

        } catch (IOException e) {

        }
 }
contentPane.add(panel1, BorderLayout.NORTH);
contentPane.add(panel2, BorderLayout.CENTER);

您的代码将面板添加到内容窗格中,这很好。

frame.setContentPane(label);

但是,然后在paint()方法中,将内容窗格替换为标签,从而丢失所有原始面板。

首先,您不应在JFrame上覆盖paint()。 如果您曾经做过自定义绘画,则应该重写JPanel的paintComponent()方法,并将面板添加到框架中。 另外,绘画方法仅用于绘画,您应该NVEVER在绘画方法中创建组件并将其添加到GUI。 您也不应以绘画方法读取图像。 绘画应该非常有效率。

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

基本代码为:

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

我认为您正在寻找的是setOpaque

你可以试试这个

setContentPane(new javax.swing.JLabel(new javax.swing.ImageIcon(getClass().getResource("background_image.jpg"))));

或者您可以在JFrame上绘制并在其上添加一个JPanel 现在,将组件添加到JPanel 确保您使JPanel不透明。这总是很容易设置背景图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM