0

JPanel にきれいなフラクタルを表示するアルゴリズムがあります。ユーザーがマウスをパネル上に置くたびに、フラクタル パネルにグリッド線の「十字線」を表示できるようにしたいと考えています。

私はこれを、次のようなものに描画するための迅速で簡単な方法で達成しました(fractalフラクタルJPanelの名前です):

@Override
public void mouseMoved(MouseEvent e) {
    Graphics g = fractal.getGraphics();
    // <problematic part>
    //   This is computationally expensive to do. It takes a good 0.2 seconds.
    //   This must be done to clear 'old' crosshairs
    fractal.repaint();
    // </problematic part>
            
    Color c = fractal.getColourScheme().getGridlineColour();
    g.setColor(new Color(c.getRed(), c.getGreen(), c.getBlue(), 50));
            
    // Draw crosshairs around the mouse's current point
    g.drawLine(e.getX(), 0, e.getX(), fractal.getHeight());
    g.drawLine(0, e.getY(), fractal.getWidth(), e.getY());
}

図示のように、古い十字線を消去するには repaint() する必要があります。

JPanel の上に移動するには、Glass Pane のようなものに十字線をペイントする必要があると感じていますが、JPanel は Glass Pane を提供していません。ただし、JRootPane は使用できます。代わりにこれを使用できますか?

PS

現在、フラクタルをピクセルごとに小さなLine2Ds でペイントしています。私は最終的にこれを生成するように変更しますBufferedImage-その場合、この問題は問題になるでしょうか?

4

1 に答える 1

1

ガラス板を使用するというあなたのアイデアは、あなたの問題を永久に解決すると思います。フラクタル自体をどのように描画するか、JPanel で表示するか、他のタイプのコンポーネントで表示するかは、もはや問題ではありません。各オブジェクトは、実際にはそれ自身のデータとアクションを担当する必要があるため、別のオブジェクトを設計するのが適切な選択になるでしょう。

そうは言っても、ガラス板を再塗装する必要があります。public void repaint(long tm, int x, int y, int width, int height)このメソッドを使用して、パネル全体を再描画するのではなく、パネルの特定の部分のみを再描画できるはずです。

JavaDocには次のように記載されています。

コンポーネントが表示されている場合、指定されたリージョンをダーティ リージョン リストに追加します。コンポーネントは、現在保留中のすべてのイベントがディスパッチされた後に再描画されます。

于 2013-02-27T14:08:57.270 に答える