Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java swing-如何一次重新绘制所有组件,这样用户就不会注意到它们被逐个填充了?_Java_Swing_Repaint_Simultaneous - Fatal编程技术网

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

java swing-如何一次重新绘制所有组件,这样用户就不会注意到它们被逐个填充了?,java,swing,repaint,simultaneous,Java,Swing,Repaint,Simultaneous,我创建了一个六边形组件,它扩展了JPanel。它在PaintComponent()中绘制一个六边形多边形。为了让它用给定的颜色填充多边形,我创建了一个Highlight()方法,使组件重新绘制: public class Hexagon{ private Color highlightColor; private boolean highlighted; private Polygon polygon; public Hexagon(int width ...

我创建了一个六边形组件,它扩展了JPanel。它在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)。然而,对于用户来说,一次填充一个六边形是显而易见的。下面是填充过程的示例图像

我尝试了另一种重新绘制的方法,让包含六边形的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();   
 }
//此代码位于承载所有六边形的包含Jpanel的内部
公共空白高亮显示多个六角体(列表六角体){
用于(六角h:六角){
//使用防止六边形重新喷漆的重载
h、 突出显示(颜色为橙色,真实);
}
//重新粉刷整个面板
重新油漆();
}
这不管用。
你知道如何一次填满所有六边形吗?谢谢。

您可以尝试创建一个由所有要填充的六边形组成的形状。 使用
区域
类和
公共无效添加(区域rhs)
方法。可以基于六边形形状对象创建区域。
然后填充单个区域。

尝试使用
setIgnoreRepaint
,它将保存“不受欢迎”的绘制事件

请参阅以下文件的Java文档:

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

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


为了更快地获得更好的帮助,请发布一条消息。谢谢。这就解决了问题。然而,对于任何想使用这种方法的人,请小心,因为它会产生另一个问题!它使填充不同颜色的六边形比填充六边形组件本身更复杂。仍然可行,但更复杂。