2

所以我一直在研究我的程序,但我无法使用网络地图的背景图像设置 JFrame,然后在 JFrame顶部使用 MigLayout 设置 JPanel ,这将允许我按照网络地图。我已经看到了几种关于如何设置背景图像的不同方法,并尝试使用我在本网站其他地方找到的示例,但效果不太好。此外,我对此进行了更多研究,发现在 JFrame 上放置 JPanel 可能会阻止看到 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();

        }
}

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

4

1 回答 1

3

这有点挑剔,但你应该总是打电话super.paintComponent,除非你有一个非常非常好的理由不这样做。

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

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

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

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

其他想法

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

此外,根据记忆,JFrame没有paintComponent方法:P

我会改为覆盖JPanel(or JComponent) 和 user therepaintComponent方法,然后将此面板添加到框架内容窗格或将其设置为内容窗格本身(frame.setContentPane(...)- 请注意,在将任何其他组件添加到框架之前执行此操作,因为这样将有效地将它们从 UI 中删除;))

于 2012-08-08T01:47:28.787 回答