gpt4 book ai didi

java - Swing:为什么我的自定义组件不重新绘制?

转载 作者:行者123 更新时间:2023-11-30 01:40:15 25 4
gpt4 key购买 nike

Item 是一个简单的模型类。

ItemComponent 是一个 Item 的 View ,它只在给定的位置绘制简单的矩形。一堆 ItemComponent 实例被放入一个父组件中,该组件被添加到应用程序的 JFrame 中(现在只是一个简单的 shell)。

该 View 有两种不同的显示样式。我想调整模型的一些属性,并可能更改状态(控制样式),然后调用 update() 重新绘制。

问题是,据我所知...paint() 只被调用过一次。 repaint() 似乎没有效果。

出了什么问题?

我不是 Swing 程序员,我是根据示例将其拼凑在一起的,所以我希望这可能是一些我不明白的微不足道的事情。

public class ItemComponent extends JComponent implements ItemView {

private static final Color COLOR_FILL_NORMAL = new Color(0x008080ff);
private static final Color COLOR_FILL_TARGET = Color.LIGHT_GRAY;
private static final Color COLOR_OUTLINE = new Color(0x00333333);

Item item;
RoundRectangle2D rect;
State state = State.NORMAL;
float alpha = 1.0f;

public ItemComponent(Item item) {
this.item = item;
this.rect = new RoundRectangle2D.Double(0, 0, 0, 0, 5, 5);
item.setView(this);
}

public void setState(State state) {
this.state = state;
}

public void update() {
System.out.println("ItemComponent.update");
setLocation(item.getLeft(), 1);
setSize(item.getWidth(), getParent().getHeight()-1);
rect.setRoundRect(0, 0, getWidth()-1, getHeight()-1, 5, 5);

repaint();
//paintImmediately(getBounds());
}

@Override
public void addNotify() {
update();
}

@Override
public void paint(Graphics g) {
System.out.println("paint");

Graphics2D g2 = (Graphics2D)g;

g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));

if (state == State.NORMAL) {
System.out.println("draw normal");
g2.setPaint(COLOR_FILL_NORMAL); // light blue
g2.fill(rect);

g2.setPaint(COLOR_OUTLINE);
g2.draw(rect);
}
else if (state == State.TARGET) {
System.out.println("draw target");
g2.setPaint(COLOR_FILL_TARGET);
g2.fill(rect);

float[] dashPattern = { 8, 5 };
g2.setStroke(new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10, dashPattern, 0));
g.setColor(COLOR_OUTLINE);
g2.draw(rect);
}
}
}
<小时/>

提示:我追踪到 repaint() 并发现 isDisplayable() 被检查的点,并且它返回 false。它确保 getPeer() != null。

所以我的组件没有对等点?那是怎么回事?它已被添加到一个容器中,该容器本身又被添加到应用程序的其余部分。它被绘制一次,所以我知道它是可见的。

最佳答案

我向已经看过此内容的人表示歉意。我对代码进行了一些删减以便发布,并无意中遗漏了一个关键部分:

@Override
public void addNotify() {
update();
}

添加后我就用它来进行一些设置。事实证明,您不要重写它,或者至少您需要调用 super.addNotify(),否则一大堆重要的初始化不会发生。

将其更改为此解决了问题:

@Override
public void addNotify() {
super.addNotify();
update();
}

关于java - Swing:为什么我的自定义组件不重新绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/740956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com