Java重绘不正确显示组件

时间:2012-03-29 23:40:24

标签: java swing components panel repaint

开发GUI应用程序,使用JSWing,我加载XML文件,然后反序列化它,然后我将所有创建的对象添加到JPanel。 但是,在我移动窗口或单击面板之前,这就是它们的样子

enter image description here

移动窗口后,它们看起来正确,所以如何解决这个问题<

我看了这个链接 http://docs.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#paintComponent(java.awt.Graphics) 它可能是答案,因为在JComponent的构造函数中我使用

setOpaque(true);

但是我仍然不确定如何解决这个问题,因为文档的这部分内容很难理解(它对某些方面对我来说没有任何意义:-D)

顺便说一句,这幅画本身就是这样的

for (NetObject o : objects) {

                addNewObject(o);
            }

和addNewObject(不是整个代码)

public void addNewObject(NetObject o) {



         DraggableComponent object = new DraggableComponent(o, editorIndex); //Creates a draggableComponent
        this.add(object);//Adds this component to main container

        object.setOverbearing(true); //On click ,this panel gains lowest z-buffer


            object.setSize(48, 48);
            object.setLocation(o.x - 23, o.y - 23);
            object.setBackground(Color.WHITE);
            this.repaint(); //this = JPanel

}

和覆盖的paintComponent代码

@Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (isOpaque()) {
            if (object.type == 2) { //tarnsition
                g.drawImage(transition, 0, 0, this);

            } else if (object.type == 1) {
                boolean test = g.drawImage(place, 0, 0, this); //place
                g.drawString(object.loadTokens(), 3, 27); // 1,2,3,4...
            }
        }

    }

我试图调用this.revalidate - 在FOR EACH LOOP之后 - 没有帮助,唯一有效的方法是以某种方式移动窗口,奇怪的是,这个问题只存在于@Windows,我的同事正在开发这个完全相同的应用程序Linux,他没有遇到过图形问题。

我知道有很多这样的主题,但老实说我无法找到解决方案。

感谢您的回答, OSIRIS

1 个答案:

答案 0 :(得分:4)

setBackground() API提到“尊重此属性取决于外观和感觉,有些人可能会选择忽略它。”在paintComponent()中明确设置图形上下文的颜色并调用fillRect()