2009-12-01 42 views
0

我的一位朋友要求我帮助他与Swing,并且我达到了无法解决问题的程度。 所以,首先我有一个ImagePanel图像面板没有重新绘制,除非系统事件

public class ImagePanel extends JPanel { 

    private Image img; 

    public void setImage(String img) { 
    setImage(new ImageIcon(img).getImage()); 
    } 

    public void setImage(Image img) { 
    int width = this.getWidth(); 
    int height = (int) (((double) img.getHeight(null)/img.getWidth(null)) * width); 
    this.img = img.getScaledInstance(width, height, Image.SCALE_SMOOTH); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
    g.drawImage(img, 0, 0, null); 
    } 
} 

而一个FileChooser,应打开所选图像到ImagePanel。它简单地称为ImagePanelsetImage。但图像没有画。没有重新组合,验证和无效的帮助。

但是,当调整大小(使用鼠标)JFrame时,图像被绘制。 所以,问题是 - 什么方法调用大小(使用鼠标),这使得ImagePanel成功重新绘制。

+0

您是否设置了JFrame?如果你这样做,你可以发布代码吗? – 2009-12-01 20:57:04

+0

JFrame由NetBeans生成,所以我发现粘贴生成的代码很奇怪。当然,ImagePanel被添加到JFrame中。 – Bozho 2009-12-01 21:20:21

回答

3

IconImage使用MediaTracker异步加载图像。在你调用repaint,invalidate等的地方,图像还没有完成加载。

在你的paintComponent,与

g.drawImage(img, 0, 0, this); 

组件类有ImageObserver的的实现,将调用当图像完成加载重绘更换

g.drawImage(img, 0, 0, null); 

0

调用重绘方法(documentation link)将导致面板重新粉刷。这会导致底层的绘画调用,这也是导致JPanel在调整大小时绘制的原因。

+0

当我手动调用repaint时,无论是JFrame还是Image面板,都没有任何反应。 – Bozho 2009-12-01 20:49:12

+0

您是否重复调用setImage以及调整大小,还是只调用一次setImage然后调整窗口大小?也许你可以发布更多的代码。 – 2009-12-01 21:29:53

1

设置图像并按照代码进行绘画不会改变组件的实际大小。根据包含帧的布局和设置,可能会发生一些不同的事情 - 您的ImagePanel初始大小为0x0,因此在放大帧并将更多空间分配给ImagePanel之前不会显示;或者ImagePanel被手动调整为不适合JFrame起始大小的大尺寸,在这种情况下,ImagePanel可能无法显示,直到调整大小后有足够的大小可用。

+0

谢谢。最初是调整大小的代码,但我在尝试中删除了它。现在,结合Davon的答案,它是有效的。我希望我有两个绿色的蜱虫:) – Bozho 2009-12-01 21:37:24

相关问题