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 重绘未正确显示组件的主要内容,如果未能解决你的问题,请参考以下文章