Java 重绘未正确显示组件

Posted

技术标签:

【中文标题】Java 重绘未正确显示组件【英文标题】:Java repaint not displaying component correctly 【发布时间】:2012-04-13 16:15:34 【问题描述】:

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

我移动窗口后,它们看起来正确,那么如何解决这个问题

我看了这个链接 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

【问题讨论】:

也许pack() 会解决它。否则,发布SSCCE。 【参考方案1】:

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

【讨论】:

另见opacity 属性。 谢谢,只需 g.setColor(Color.WHITE); g.fillRect(0, 0, 48, 48); boolean test = g.drawImage(config.place, 0, 0, this); //放置 g.drawString(object.loadTokens(), 3, 27); // 1,2,3,4... 有效!

以上是关于Java 重绘未正确显示组件的主要内容,如果未能解决你的问题,请参考以下文章

Java GIF 动画未正确重绘

Java - 从单独的组件中重绘组件

dojo边框布局显示所有内容,闪烁然后正确重绘

如何在 Java 中使用 JButton 重绘组件?

重绘 Swing 组件会产生糟糕的结果

来自线程内的实例化组件不会重绘到 Java 中的 JFrame