2010-05-25 47 views
1

我为JDesktopPane使用了自制的DesktopPaneUI,我已经为该类编写了适当的方法,并且遇到了麻烦。当我调整JDesktopPane的大小时,背景图片不会随框架调整大小。图像看起来像在窗户最初打开时的大小一样。我给它的图像大于窗口,我仍然有这个问题。JDesktopPane的背景设置

这里是我的桌面UI类的构造函数中的方法调用。

super(); 
this.background = javax.imageio.ImageIO.read(new File(fileName)); 

有没有办法我可以更改我设定的UI,或者myDesktopPaneUI类这样的背景仍然充满窗口时的JDesktopPane改变大小我的主类?

setUI(new myDesktopPaneUI("media/bg.jpg")); 

回答

6

覆盖paint()在图像扩展到窗格的大小的方式来调用drawImage()

@Override 
public void paint(Graphics g, JComponent c) { 
    g.drawImage(image, 0, 0, c.getWidth(), c.getHeight(), null); 
} 
4

如果仅创建自定义用户界面,添加背景图片,更简单的方法是做的JDesktopPane的风俗画,使其适用于所有的LAF的:

JDesktopPane desktop = new JDesktopPane() 
{ 
    protected void paintComponent(Graphics g) 
    { 
     g.drawImage(image, 0, 0, getWidth(), getHeight(), null); 
    } 

}; 

通常你会调用super.paintComponent方法(G)第一,但由于图像将覆盖整个背景,不需要这样做。

+2

图像甚至覆盖了的时候,它可能有透明的区域 - 所以不叫超相符超的合同只有不透明== false。它不是默认的,并且可以随时通过客户端代码进行更改。所以它不是很安全,并让你的IDE输入一个额外的行是... :-) – kleopatra 2011-12-05 10:47:27

+0

@kleopatra,好点;) – camickr 2011-12-05 15:58:54

+0

那么为什么不使用像“if(image!= null){drawImage;} else { super.paintComponent;}“在paintComponent的情况下,可以在以后连接图像?这是个好主意吗 ? – Benj 2013-03-05 22:52:26

1

使用的组件侦听器,知道什么时候该窗口已调整,然后重新调整使用

image.getScaledInstance(getWidth(), getHeight(), 0);