2015-07-10 49 views
0

你好,我正在開發一個自定義時鐘應用程序。GUI類中的Java圖像

我的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) { 

     } 
} 
+1

要替換它包含有該標籤的其他組件的內容窗格。嘗試使用內容窗格的卡片佈局,並將標籤設置在最低級別或覆蓋框架的paint()方法並在其中添加圖像:http://stackoverflow.com/questions/1466240/how-to-set-an -image-as-a-background-for-frame-in-swing-gui-of-java – Thomas

+1

永遠不要讓一個異常塊爲空。 (這與你的問題無關,但可能與未來的問題有關。) – Risadinha

+0

@Thomas,「嘗試使用卡片佈局」 - CardLayout一次只能顯示一個組件,這是行不通的。另外,您提供的鏈接中的「接受」答案是不完整的,因爲它沒有提及您需要在添加到內容窗格的面板上使用'setOaque(false)',以便可以看到背景圖像。 – camickr

回答

0

我想你正在尋找的是setOpaque

+0

嗯,我認爲這不會有幫助,因爲OP正在替換內容窗格,從而將框架中的組件分離。我可能在這裏弄錯了(多年來沒有做過Swing),如果有的話,請解釋爲什麼'setOpaque()'會幫助OP。 – Thomas

0

你可以試試這個

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

或者你可以在你的JFrame上畫畫並在其上添加JPanel。現在將您的組件添加到您的JPanel。確保你使JPanel不是不透明的。這總是很容易設置背景圖像。

+0

我不確定你的第一個建議與OP已經嘗試的有什麼不同(除了它全部在一行中)。 – Thomas

+0

將JLabel放在contentPane上並設置我們設置的任何背景都不會影響JFrame上的組件。唯一的缺點是整個JFrame會採用提供的背景圖像的大小。因爲這個原因,如果背景圖像發生變化,它會產生問題 – Rahul

+0

單線是快速解決方案,但我的第二個建議更有意義。 – Rahul

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

您的代碼正在將面板添加到內容窗格,這很好。

frame.setContentPane(label); 

但是,然後在paint()方法中將內容窗格替換爲標籤,以便丟失所有原始面板。

首先,您不應該重寫JFrame上的paint()。如果您曾經做過自定義繪畫,則應該重寫JPanel的paintComponent()方法並將面板添加到框架中。此外,繪畫方法僅用於繪畫,您應該在繪畫方法中創建並向GUI添加組件。 YOu也不應該用繪畫方法閱讀圖像。繪畫應該非常高效。

所以要解決您的問題,我建議您可以使用BackgroundPanel。這是一個支持繪製圖像的自定義面板,它將使您添加的任何組件都不透明。您可以以原始大小繪製背景圖像1),2)縮放以填充面板,3)平鋪。

的基本代碼將是:

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