2

我正在制作一个程序,您可以在其中单击包含图像的 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);
    }       
}

有谁知道这可能是什么原因?

4

2 回答 2

5

永远不要使用 getGraphics(),它可以返回 null 并且充其量是最后一个绘制周期的快照

一旦发生重绘,任何涂在上面的东西都会被移除

相反,正如 Legend 已经建议的那样,为自己创建一个自定义标签并覆盖 paintComponent 并在此处执行您的绘画

请记住,绘画是无状态的,这意味着在每次重绘时,您都必须重建您的状态

看看自定义绘画

于 2013-03-16T22:50:17.567 回答
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);
        }              
    }
};
于 2013-03-16T22:53:52.323 回答