Java背景JFrame,带有Jpanel,在网格中排列图像

Java背景JFrame,带有Jpanel,在网格中排列图像,java,swing,jframe,jpanel,background-image,Java,Swing,Jframe,Jpanel,Background Image,因此,我一直在开发我的程序,我很难用网络地图的背景图像设置JFrame,然后在JFrame顶部使用MigLayout设置JPanel,这将允许我根据网络地图放置图像。我已经看到了几种不同的设置背景图像的方法,并尝试使用我在本网站其他地方找到的一个例子,但效果不太好。此外,我对此进行了更多的研究,发现拥有JFrame的JPanel ontop可能会阻止看到JFrame背景图像。我希望有人能看看我的代码,让我知道是否是这样 以下是我的课堂背景: public class bwMonBackgroun

因此,我一直在开发我的程序,我很难用网络地图的背景图像设置JFrame,然后在JFrame顶部使用MigLayout设置JPanel,这将允许我根据网络地图放置图像。我已经看到了几种不同的设置背景图像的方法,并尝试使用我在本网站其他地方找到的一个例子,但效果不太好。此外,我对此进行了更多的研究,发现拥有JFrame的JPanel ontop可能会阻止看到JFrame背景图像。我希望有人能看看我的代码,让我知道是否是这样

以下是我的课堂背景:

public class bwMonBackground extends JFrame {
    Image img;
    public bwMonBackground() {
        try {
            img = ImageIO.read(new File("/Users/pwopperer/workspace/BWmon/src/customer_vlans.jpg"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
public void paintComponent(Graphics g)
{
    super.paintComponents(g);
    g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}

}
以下是我的主要观点:

public class bwMonBackgroundMain {

    public static void main( String[] args )
        {
            bwMonBackground frame = new bwMonBackground();
            frame.setLayout(new FlowLayout(FlowLayout.LEFT,10,20));
            migLayout testing = new migLayout();
            frame.add(testing.createLayout());
            frame.setVisible(true);
            frame.setResizable(false);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();

        }
}

编辑:当我这样运行它时,我只得到一个带有我添加到其中的6个jLabel的JPanel

这有点吹毛求疵,但是你应该总是调用
super.paintComponent
,除非你有非常非常好的理由不这么做

此外,您还应尽可能使用
ImageObserver
提供
Graphics.drawImage
。基本上,这意味着如果图像处理在另一个线程中进行,ImageObserver将不会收到更改通知并自动更新;)

在地图上放置组件时,需要确保它们是透明的(
JComponent.setOpaque(false)
)。这将允许背景显示出来

显然,您可以选择一些不透明的组件,以便它们更易于阅读,或者提供
AlphaComposite
s以提供半透明效果

其他想法

我不会以这种方式重写
JFrame
。框架具有内容窗格,这些窗格负责核心内容

此外,从内存来看,
JFrame
没有
paintComponent
方法:p


我将替代
JPanel
(或
JComponent
)并在那里使用
paintComponent
方法,然后将此面板添加到框架内容窗格或将其设置为内容窗格本身(
frame.setContentPane(…)
-请注意,在将任何其他组件添加到框架之前执行此操作,因为这将有效地将它们从UI中删除;)

谢谢,我调用了super.paintComponents并将更新我的代码。你会推荐一个教程或示例来演示你推荐的ImageObserver的用法吗?真的,你不必为你正在做的事情担心太多,它是由
组件实现的,因此是由
JFrame
代表你实现的;)@Pat如果你真的非常想看到
ImageObserver
的运行,你可以看看
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.drawImage(img, 0, 0, this);
}