2

JFrameコンストラクターに次の簡単なコードがあります

    super(name);
    setBounds(0,0,1100,750);
    setLayout(null);


    setVisible(true);

    g = this.getGraphics();
    int[] x =new int[]{65,  122,  77,  20, };
    int[] y =new int[]{226,  258, 341,  310};
    g.setColor(Color.RED);  
    g.drawPolygon (x, y, x.length);
    System.out.println(g);

コンソールに次のような出力が表示されます。

sun.java2d.SunGraphics2D[font=java.awt.Font[family=Dialog,name=Dialog,style=plain,size=12],color=java.awt.Color[r=255,g=0,b=0] ]]

しかし、JFrame には赤いポリゴンは描画されず、空白の JFrame だけが描画されます。

どうして ??

4

2 に答える 2

7
  • オーバーライドpaint(..)しないでくださいJFrame

  • むしろ、オーバーライドされたカスタムを追加します JPanelpaintComponent(Graphics g)JFrame

  • 使用しないNull/AbsoluteLayout 適切なLayoutManager

  • インスタンスを呼び出さないsetBounds(..)JFrameください (許可されていないわけではありませんが、このアプリケーションに関連していることはわかりません)

  • GUI コンポーネントの作成と変更にEDTを使用することを忘れないでください。

    javax.swing.SwingUtilities.invokeLater(new Runnable() {
                @Override
               public void run() {
                    Test test = new Test();
               }
    });
    

次に、次のようにします。

public class Test {

    /**
     * Default constructor for Test.class
     */
    public Test() {
        initComponents();
    }

    public static void main(String[] args) {

        /**
         * Create GUI and components on Event-Dispatch-Thread
         */
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Test test = new Test();
            }
        });
    }

    /**
     * Initialize GUI and components (including ActionListeners etc)
     */
    private void initComponents() {
        JFrame jFrame = new JFrame();
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jFrame.add(new MyPanel());

        //pack frame (size JFrame to match preferred sizes of added components and set visible
        jFrame.pack();
        jFrame.setVisible(true);
    }
}

class MyPanel extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int[] x = new int[]{65, 122, 77, 20};
        int[] y = new int[]{226, 258, 341, 310};
        g.setColor(Color.RED);
        g.drawPolygon(x, y, x.length);
    }

    //so our panel is the corerct size when pack() is called on Jframe
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 400);
    }
}

これは以下を生成します:

ここに画像の説明を入力

于 2012-10-25T19:13:32.190 に答える
2

しようとしているアプローチよりも、paint(Graphics g)またはオーバーライドする方がよいでしょう。paintComponent(Graphics g)以下の行を追加setVisibleし、コード内の後の行を削除します。

public void paint(Graphics g) {
  int[] x =new int[]{65,  122,  77,  20};
  int[] y =new int[]{226,  258, 341,  310};
  g.setColor(Color.RED);  
  g.drawPolygon (x, y, x.length);
}
于 2012-10-25T19:04:12.460 に答える