java swing - 如何一次重绘所有组件,这样用户就不会注意到它们被逐个填充?

时间:2012-03-19 13:22:37

标签: java swing repaint simultaneous

我创建了一个扩展 JPanel 的Hexagon组件。它在 PaintComponent()中绘制六边形多边形。为了使用给定颜色填充多边形,我创建了一个 Highlight()方法,该方法使组件重新绘制:

public class Hexagon{
    private Color highlightColor;
    private boolean highlighted;
    private Polygon polygon;

    public Hexagon(int width ... etc){
         // code to create the hexagon polygon to be drawn
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.drawPolygon(polygon);

        // highlighting
        if(highlighted){
            g2d.setColor(highlightColor);
            g2d.fillPolygon(polygon);
        }
    }

    public void highlight(Color highlightColor){
        highlight(highlightColor, false);
    }

    public void highlight(Color highlightColor, boolean dontRepaint){
        highlighted = true;
        this.highlightColor = highlightColor;
        if(dontRepaint) { return; }
        repaint();
    }
}

现在,当我想一次突出显示(填充)多个六边形时,会出现问题。要突出显示它们,我将使用for循环并调用Hexagon.highlight(Color.orange)。然而,对于用户来说显而易见的是,一次填充一个六边形。以下是填充方式的示例图像

Hexagons before being filled with color Hexagons during filling Hexagons after being filled

我尝试了另一种重绘方法,让包含Hexagons的包含JPanel自我重绘。例如:

 // this code is inside the containing Jpanel that hosts all the hexagons
 public void highlightManyHexagons(List<Hexagon> hexes){
     for(Hexagon h : hexes){
         // use overload that prevents the hexagon to do a repaint
         h.highlight(Color.orange, true);
     }
     // repaint the whole panel
     repaint();   
 }

这不起作用。 知道如何让所有的六边形立刻被填充吗?感谢。

2 个答案:

答案 0 :(得分:1)

您可以尝试创建一个由要填充的所有六边形组成的Shape。 使用Area类和public void add(Area rhs)方法。可以基于Hexagon Shape对象创建区域。 然后填写单个区域。

答案 1 :(得分:1)

尝试使用setIgnoreRepaint,它会举行“不受欢迎”的彩妆活动。

请参阅Component.setIgnoreRepaint(boolean)的Java文档:

  

设置是否应忽略从操作系统接收的绘制消息。这不会影响AWT在软件中生成的绘制事件,除非它们是对OS级别绘制消息的即时响应。

     

这很有用,例如,如果在全屏模式下运行并且需要更好的性能,或者如果将页面翻转用作缓冲策略。