我正在创建一个程序,您可以在其中单击一个包含图像的JLabel 圆圈将出现在JLabel上。这在我的macintosh / java6上完美无缺,但是当我的时候 使用windows / java7会发生各种奇怪的事情。在图像的某些部分,你不能 画一个圆圈。它就像是图片中间的一个看不见的方形。而有时候 圆圈消失,并在不同的时间回来。 每当我绘制一个新圆圈时,所有圆圈都会在标签上重新绘制。
public void paint(JComponent label) {
Graphics g = label.getGraphics();
for (T node : nodes.keySet()) {
Point p = nodes.get(node);
Color color;
if (p.selected) {
color = Color.RED;
} else {
color = Color.BLUE;
}
g.setColor(color);
g.fillOval(p.x, p.y, circleRadius*2, circleRadius*2);
g.setColor(Color.BLACK);
g.setFont(new Font("Helvetica", 20, 20));
g.drawString((String) node, p.x, p.y);
}
}
有谁知道可能导致这种情况的原因?
答案 0 :(得分:5)
永远不要使用getGraphics(),它可以返回null,最多只是最后一个绘制周期的快照
一旦重画出现任何涂在其上的东西都会被删除
相反,正如Legend已经建议的那样,创建一个自定义标签并覆盖paintComponent并在此处执行您的绘画
请记住,绘画是无国籍的,这意味着在每次重画时,你都必须重建你的状态
答案 1 :(得分:0)
删除你的油漆(JComponent j);方法并尝试使用以下JLabel。 根据需要进行调整以满足您的需求。
final JLabel jLabel = new JLabel("!X!") {
@Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
for (T node : nodes.keySet()) {
Point p = nodes.get(node);
Color color;
if (p.selected) {
color = Color.RED;
} else {
color = Color.BLUE;
}
g.setColor(color);
g.fillOval(p.x, p.y, circleRadius*2, circleRadius*2);
g.setColor(Color.BLACK);
g.setFont(new Font("Helvetica", 20, 20));
g.drawString((String) node, p.x, p.y);
}
}
};