2015-08-26 29 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