2015-08-26 81 views
0

我正在嘗試構建一個窗口,其中一個圖片覆蓋了屏幕。圖片是JLabel,窗口是JFrame。在嘗試了無數種方法並查找了幾個小時的教程之後,我還沒有想出如何做到這一點。我同意,這是一個非常簡單的問題,但我根本不明白我該如何解決這個問題。這裏是我的代碼,我已經試過(我註釋掉了一些事情,我之前試過):構建簡單窗口時出錯?

package Buttons; 

import java.awt.event.*; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.GridLayout; 

public class Mewindow extends JFrame { 

private JFrame mewindow; 
private JLabel mepic = new JLabel(new ImageIcon("me.png")); 

public Mewindow() { 

    super("Here is a picture of ME!"); 

    mewindow.setLayout(new GridLayout(1, 0, 0, 0)); 

    // Icon me = new ImageIcon(getClass().getResource("me.png")); 

    add(mepic); 

    mewindow.setVisible(true); 
    mewindow.setSize(250, 250); 
    mewindow.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
} 

} 

謝謝你這麼多,你正在閱讀這篇文章的時候,我真的很感謝你的投入幫助的努力一位程序員!

回答

2

問題#1 ...

你沒有主要方法,所以,除非你是從其他類創建的類,它不會運行...

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       ex.printStackTrace(); 
      } 

      Mewindow frame = new Mewindow(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
    }); 
} 

問題#2 ...

現在,您將遇到NullPointerException,因爲mewindow未初始化,但實際上並不需要它,因爲您正在使用類的構造函數中的值,所以您將結束如果您嘗試親密交談,請撥打StackOverflowException它...但它沒有意義無論如何使用它...

public class Mewindow extends JFrame { 

    private JLabel mepic 
    public Mewindow() { 

     super("Here is a picture of ME!"); 

     setLayout(new GridLayout(1, 0, 0, 0)); 

     mepic = new JLabel(new ImageIcon(getClass().getResource("me.png"))); 
     add(mepic); 

     setVisible(true); 
     setSize(250, 250); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    } 
} 

現在你的代碼假定me.png存儲在相同的封裝內Mewindow,只是要小心這一點。

而且,生成的代碼實際運行(與我自己的圖片替換)

MeWindow

建議...

不要直接從JFrame擴展,使用JPanel代替,然後添加對於JFrame的實例,您的代碼將更具可重用性

+0

謝謝,這是非常好的解釋。我想我應該直接將圖像放入JLabel本身!你是什​​麼意思「不要直接從JFrame進行擴展,而是使用JPanel,然後將其添加到JFrame的實例,你的代碼將更加可重用」?另外,我的圖像並沒有填滿整個窗口,爲什麼?雖然......可能是圖像本身? –

+0

通常不鼓勵從頂級容器擴展,因爲它會將您鎖定到單個用例中,而且您並沒有真正爲課程添加任何新功能。它還帶有一些其他管理問題,最好留給實施。 'JLabel'不會縮放圖像,事實上,沒有Swing組件,相反,你需要自己實現這個功能 – MadProgrammer

+0

看看[這個例子](http://stackoverflow.com/questions/14548808/scale-the-imageicon-automatically-to-label-size/14553003#14553003)和[this example](http://stackoverflow.com/questions/11959758/java-maintaining-aspect-ratio-of-jpanel-background -image/11959928#11959928)和[this example](http://stackoverflow.com/questions/14115950/quality-of-image-after-resize-very-low-java/14116752#14116752) – MadProgrammer