1

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) を呼び出します。ただし、一度に 1 つの六角形が塗りつぶされていることは、ユーザーにとって明らかです。これは、充填がどのように行われるかのサンプル画像です

色で塗りつぶす前の六角形 充填時の六角形 塗りつぶされた後の六角形

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();   
 }

これはうまくいきませんでした。一度にすべての六角形を埋める方法はありますか? ありがとう。

4

2 に答える 2

1

塗りつぶすすべての六角形から構成される 1 つの形状を作成することを試みることができます。Areaクラスとpublic void add(Area rhs)メソッドを使用します。Hexagon Shape オブジェクトに基づいて領域を作成できます。次に、単一の領域を埋めます。

于 2012-03-19T13:27:19.273 に答える
1

を使用してみてくださいsetIgnoreRepaint。「歓迎されない」ペイント イベントが発生します。

Component.setIgnoreRepaint(boolean)の Java ドキュメントを参照してください。

オペレーティング システムから受信したペイント メッセージを無視するかどうかを設定します。これは、OS レベルのペイント メッセージに対する即時の応答でない限り、AWT によってソフトウェアで生成されたペイント イベントには影響しません。

これは、たとえば、フルスクリーン モードで実行していてパフォーマンスを向上させたい場合や、ページ フリッピングをバッファ戦略として使用する場合に役立ちます。

于 2012-03-19T13:55:14.157 に答える