2

paintComponent内で関数がどのように機能するかについてのプログラムフローとは本当に混乱していJPanelます。理想的には、Graphicsオブジェクトにアクセスして、プログラムフローに基づいて他の関数からデータを描画したいと考えています。私は次のように考えています:

private Graphics myG;

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    myG = g; //I want a graphics object that I can just draw with. 
             //Should I just initialize to myG = new Graphics(); or something?
    //private Graphics myG = new Graphics(); does not seem to work        
  }

//this is what's getting called, where I want to call other functions that 
//can use myG to draw graphics as I please
public void startPanelView() {      

    myG.drawRect(350, 20, 400, 300); //doesn't work

    otherFunctionForGraphics(); //which will also use myG.  
}

ここで自分自身を明確にしたことを願っています。Graphicsクラスを好きなように使えるようにしたいと思っています。g.drawRect(...)現在、私は関数内のようなことしかできませんpaintComponent()。これは私の目的には役立つかもしれませんが、もっと柔軟性が欲しいです。

ありがとう。

編集-了解しました。外部のGraphicsオブジェクトを参照しようとしてはいけないことを理解しています。しかし、アプリケーションロジックをpaintComponent関数から分離するにはどうすればよいですか?私は次のことをしているので、今このクラスは少し厄介に見えます:

public void paintComponent(Graphics g) {

    if (flag1 == true) {
        //do some graphics stuff, that I would prefer to be in another function
    }

    if (flag2 == true) {
        //do some other graphics stuff, again, which I would prefer 
        //to be in another function
    }

    //... etc. More of these cases.
}

そして基本的に、paintComponent関数は私にとってばかげて長く複雑になっているので、可能な限りそれを分割したいと思います。

4

4 に答える 4

4

パネルオブジェクトのメソッドrepaintから呼び出します。startPanelViewメソッドの外部でpaintグラフィックスオブジェクトを操作したり、メソッドの外部で使用するためにグラフィックスオブジェクトへの参照を維持したりしないでくださいpaint

于 2011-07-30T16:30:22.143 に答える
4

Graphics他の人は、オブジェクトをメンバー変数として保持できないということは正しいですが、paintComponentメソッドが長くなりすぎていることが問題である場合でも、GraphicsSwingが他のメソッドへの引数として提供するものを渡すことができます。

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawRect(350, 20, 400, 300);
    doSomeStuff(g);
    if (flag1) {
        doMoreStuff(g);
    } else {
        doDifferentStuff(g);
    }
}
于 2011-07-30T17:00:55.873 に答える
2

プログラムフローに基づいて他の関数からデータを描画するために、Graphicsオブジェクトにアクセスしたいと思います。私は次のように考えています:

いいえ、標準のSwingアプリケーションではこれを行わないでください。取得したGraphicsオブジェクトは保持されず、JVMまたはオペレーティングシステムが再描画が必要であると判断するたびに描画が消えます。描画するオブジェクトのリストまたはその他のコレクション(実装するクラスなどShape)を作成し、paintComponentメソッドでこれらのコレクションを反復処理することを検討してください。もう1つの手法は、BufferedImageに描画してから、paintComponentメソッドに表示することです。

于 2011-07-30T16:32:00.423 に答える
1

SwingまたはImage/ImageIconの基本的なJComponentは、JLabelです。Painting/Custom Painting/2D Graphics

2DグラフィックスまたはCustomPaintingから別のviodまたはクラスを呼び出さないでください。いくつかの貴重な例がここまたはここにあります。このフォーラムで検索して、Custom Paintingおよびに関する優れた提案を探してください。2D Graphics

于 2011-07-30T16:39:01.163 に答える