Java图形表现得很奇怪

时间:2013-03-16 22:28:40

标签: java swing graphics

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

有谁知道可能导致这种情况的原因?

2 个答案:

答案 0 :(得分:5)

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

一旦重画出现任何涂在其上的东西都会被删除

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

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

查看Custom painting

答案 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);
        }              
    }
};