您好我正在开发自定义时钟应用程序。
我的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) {
}
}
答案 0 :(得分:2)
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);
...
答案 1 :(得分:0)
我认为你要找的是setOpaque
答案 2 :(得分:0)
你可以试试这个
setContentPane(new javax.swing.JLabel(new javax.swing.ImageIcon(getClass().getResource("background_image.jpg"))));
或者您可以在JFrame
上绘图并在其上添加JPanel
。现在,在JPanel
上添加您的组件。确保JPanel
不透明。这总是很容易设置背景图像。