【发布时间】:2009-04-11 23:07:46
【问题描述】:
Item 是一个简单的模型类。
ItemComponent 是一个 Item 的视图,它只在给定的位置绘制简单的矩形。一堆 ItemComponent 实例被放入添加到应用程序的 JFrame 的父组件中(现在只是一个简单的 shell)。
视图有两种不同的显示样式。我想调整模型的一些属性,并可能更改状态(控制样式),然后调用 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() 正在检查的点,它返回错误。它确保 getPeer() != null。
所以我的组件没有对等点?那是怎么回事?它被添加到一个容器中,该容器本身被添加到应用程序的其余部分。而且它被绘制一次,所以我知道它是可见的。
【问题讨论】:
-
Peer 仅存在于 AWT 组件中(peer 是原生窗口系统的真实组件,与组件一起使用),大多数 Swing 组件没有 Peer。你为什么还要在 addNotify 上工作?
标签: java user-interface swing