1


リスト配列からJPanelにレンダリングしようとしています。独自の2Dレンダラーを作成しましたが、RenderAdd関数を使用してリストに追加しようとすると、追加されないか、リスト配列でリストを読み取れません...彼は次のようなコードです。それを開始します。

JFrame frame = new JFrame();
    frame.setSize(900, 500);
    frame.setVisible(true);
    Render render = new Render(new RenderDimension(frame.getX(),frame.getY(),frame.getWidth(),frame.getHeight()), frame);
    BufferedImage zombie = new ImageLoader().readImage("zombie");
    BufferedImage player = new ImageLoader().readImage("player");
    render.RenderAdd(new RenderImage(new RenderDimension(100, 100, player.getWidth(), player.getHeight()), player));
    render.RenderAdd(new RenderImage(new RenderDimension(0, 0, zombie.getWidth(), zombie.getHeight()), zombie));
    render.start();
    render.RenderAdd(new RenderImage(new RenderDimension(200, 100, player.getWidth(), player.getHeight()), player));

'render'は、レンダリング部分のメインのRenderクラスです。次に、RenderAddは、オブジェクトのxとyであるRenderDimensionと、画像の幅と高さを持つRenderImageを追加します。次に、BufferedImageもパラメーターとして受け取ります。

ただし、プログラムを実行しようとすると、空白の画面が表示されます。

ここで、Renderクラスには、スレッドを拡張する別のクラスがあります。これは、フレームをパラメーターとして受け取り、コンテンツを削除してgetContentPane()へのペイントを開始するクラスです。この次のコードは、renderthreadクラスのpaintComponent()関数内にあります。残念ながら、何もペイントされませんが、それ自体を繰り返し印刷するSystem.out.print( "h")を試したため、プロセスは実行されます。

for (RenderImage r : render.getList()){
    int x = r.getSize().getX();
    int y = r.getSize().getY();
    int wi = r.getSize().getWidth();
    int hi = r.getSize().getHeight();
    if (x + wi >= -1 && x + wi <= d.getWidth()){
        if (y + hi >= -1 && y + hi <= d.getHeight()){
            g.drawImage(r.getImage(), x, y, null);
        }
    }
}
frame.getContentPane().add(p);
frame.getContentPane().validate();
frame.getContentPane().repaint();

問題はリストが追加されないことだと思うので、ここにその部分があります。

List<RenderImage> render = new ArrayList<RenderImage>();

public List<RenderImage> getList(){
    return render;
}

public void RenderAdd(RenderImage renders){
    render.add(renders);
}
4

1 に答える 1

3

あなたが私たちに与えてくれたサンプルコードで知るのは難しいです.

シナリオ #1、オーバーライドJComponent#paintComponent

paintComponentメソッド内でこれを行っている場合

for (RenderImage r : render.getList()){
    int x = r.getSize().getX();
    int y = r.getSize().getY();
    int wi = r.getSize().getWidth();
    int hi = r.getSize().getHeight();
    if (x + wi >= -1 && x + wi <= d.getWidth()){
        if (y + hi >= -1 && y + hi <= d.getHeight()){
            g.drawImage(r.getImage(), x, y, null);
        }
    }
}
frame.getContentPane().add(p);
frame.getContentPane().validate();
frame.getContentPane().repaint();

次に、しないでください。

メソッド内から何らかの方法で UI を更新するメソッドを呼び出しても、問題paintが発生するだけです。これは単に、イベント ディスパッチ スレッドに追加される別の再描画要求をトリガーするだけであり、paintComponentメソッドが呼び出され、CPU とプログラムの応答性に問題はありません。

また、EDT 以外から UI を更新する場合は、またはThreadを使用してリクエストを EDT に同期してください。SwingUtilities#invokeLaterSwingUtilities.invokeAndWait

また、あなたが電話していることを確認してくださいsuper.paintComponent

シナリオ 2、使用JComponent#getGraphics

頭に浮かぶ質問は、gあなたの例のどこから来たのかということです。

を使用している場合は、使用JComponent#getGraphicsしないでください。これは単純な再描画間のグラフィックスのスナップショットであり、次の再描画が発生するとすぐに消去されます。

のようなものからカスタム コンポーネントを作成し、そのメソッドJPanelをオーバーライドして、ループpaintComponentでコンポーネントを更新しますRenderImage(UI を変更するコードを除外するだけです)。

また、すべての再描画要求が EDT のコンテキスト内から行われることを確認してください。

于 2012-10-20T08:17:18.403 に答える