所以我一直在处理我的程序,我无法使用网络地图的背景图像设置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();
}
}
编辑:当我像这样运行它时,我只得到一个带有我添加的6个JLabel的JPanel
答案 0 :(得分:3)
这有点挑剔,但你应该总是打电话给super.paintComponent
,除非你有一个真正的,真正的理由不这样做。
此外,您应尽可能向Graphics.drawImage
提供ImageObserver
。基本上这意味着如果图像处理发生在另一个线程中,ImageObserver将不会通知更改并自动更新;)
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(img, 0, 0, this);
}
将组件放置到地图上时,您需要确保它们是透明的(JComponent.setOpaque(false)
)。这将允许背景显示。
显然,您可以选择一些不透明的组件,以便更容易阅读或提供AlphaComposite
来提供半透明效果。
其他想法
我不会以这种方式覆盖JFrame
。框架具有内容窗格,负责核心内容。
此外,从内存来看,JFrame
没有paintComponent
方法:P
我会改为覆盖JPanel
(或JComponent
)和用户paintComponent
方法,然后将此面板添加到框架内容窗格或将其设置为内容窗格本身( frame.setContentPane(...)
- 请注意,在将任何其他组件添加到框架之前执行此操作,因为这将有效地将其从UI中移除;))