【问题标题】:Java background JFrame with a Jpanel arranging images in a gridJava 背景 JFrame 与 Jpanel 在网格中排列图像
【发布时间】:2012-08-08 00:29:06
【问题描述】:

所以我一直在研究我的程序,但我无法设置一个带有网络地图背景图像的 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

【问题讨论】:

    标签: java swing jframe jpanel background-image


    【解决方案1】:

    这有点挑剔,但你应该总是打电话给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(或JComponent)并使用paintComponent方法,然后将此面板添加到框架内容窗格或将其设置为内容窗格本身(frame.setContentPane(...) - 请注意,您在将任何其他组件添加到框架之前执行此操作,因为这将有效地将它们从 UI 中删除;))

    【讨论】:

    • 谢谢,我调用了 super.paintComponents 并将更新我的代码。是否有您推荐的教程或示例来演示您推荐的 ImageObserver 的用法?
    • 真的,你不需要为你正在做的事情担心太多,它由Component实现,因此由JFrame代表你实现;)
    • @Pat 如果你真的很想看到ImageObserver 的实际效果,你可以看看daniweb.com/software-development/java/threads/177666/…
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 2014-01-13
    相关资源
    最近更新 更多