Java Swing - как перекрасить все компоненты сразу, чтобы пользователь не заметил, что они заполнены один за другим? - PullRequest
1 голос
/ 19 марта 2012

Я создал компонент Hexagon, который расширяет 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). Тем не менее, для пользователя будет очевидно, что один шестиугольник заполняется за раз. Вот пример изображения того, как происходит заполнение

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

Я попробовал другой способ перекраски, позволив 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 ]

1 голос
/ 19 марта 2012

Попробуйте использовать setIgnoreRepaint, оно будет содержать "нежелательные" события рисования.

См. Документацию по Java Component.setIgnoreRepaint (логическое значение) :

Устанавливает, следует ли игнорировать сообщения рисования, полученные из операционной системы. Это не влияет на события рисования, генерируемые программным обеспечением AWT, если они не являются немедленным ответом на сообщение рисования на уровне ОС.

Это полезно, например, если работает в полноэкранном режиме и требуется лучшая производительность, или если в качестве стратегии буфера используется перелистывание страниц.

1 голос
/ 19 марта 2012

Вы можете попытаться создать одну Форму, состоящую из всех шестиугольников, которые нужно заполнить.Используйте Area класс и public void add(Area rhs) метод.Область может быть создана на основе объекта Hexagon Shape.Затем заполните одну область.

...