4

JFrame全体ではなく、JPanelのみに背景を描画するようにペイントメソッドに指示するにはどうすればよいですか。JFrame のサイズが JPanel より大きくなっています。JPanel のグリッド背景をペイントしようとすると、JPanel だけでなく、JFrame 全体にグリッドがペイントされているように見えます。

コードの一部:

public class Drawing extends JFrame {
  JPanel drawingPanel;
  ...........
  public Drawing (){
    drawingPanel = new JPanel();
    drawingPanel.setPreferredSize(new Dimension(600,600));
  }


public void paint(Graphics g) 
{
  super.paintComponents(g);
  Graphics2D g2 = (Graphics2D) g;
  g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

  paintBackground(g2); //call a METHOD to paint the for JPANEL
}


private void paintBackground(Graphics2D g2)
{
  g2.setPaint(Color.GRAY);
  for (int i = 0; i < drawingPanel.getSize().width; i += 300) 
  {
     Shape line = new Line2D.Float(i, 0, i, drawingPanel.getSize().height);
     g2.draw(line);
  }

  for (int i = 0; i < drawingPanel.getSize().height; i += 300) 
  {
    Shape line = new Line2D.Float(0, i, drawingPanel.getSize().width, i);
    g2.draw(line);
  }      
} //END private void paintBackground(Graphics2D g2)

}
4

5 に答える 5

5

JPanelでペイントを行う場合は、JFrameではなくJPanelをオーバーライドします。

JPanelのpaintComponent()メソッドをオーバーライドする必要があります。実用的な例については、カスタムペインティングに関するSwingチュートリアルのセクションをお読みください。

于 2010-01-01T07:14:00.730 に答える
3

camickr は正しいです。そう:

public class Drawing extends JFrame {
  JPanel drawingPanel;
  ...........
  public Drawing (){
    drawingPanel = new MyPanel();
    drawingPanel.setPreferredSize(new Dimension(600,600));
    add(drawingPanel);
  }
}

public class MyPanel extends JPanel {
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    myBackgroundRoutine(g2);
  }
}

図面をさまざまなコンポーネントから厳密に分離する必要があります。Swing はすでにサブコンポーネントを管理しているため、Frame 内の Panel に描画を実装する必要はまったくありません (paintComponents() の呼び出しは重大なエラーです)。また、Swing では paintComponent() のみが使用されるため、決して paint() をオーバーライドしないでください。自分が何をしているのか完全に理解するまで、両方を混ぜないでください。

于 2010-01-01T13:54:30.930 に答える
0

ペイントを行うには、JFrame ではなく、JPanel をオーバーライドする必要があります。JPanel の paintComponent() メソッドをオーバーライドできます

于 2015-12-07T13:48:14.037 に答える
0
super.paintComponents(g);

調査の最初のポイントとしてお勧めします。

于 2010-01-01T05:43:56.973 に答える
0

投稿したコードは完全ではありません。パネルが JFrame に追加される方法と、どの LayoutManager が使用されているかが欠落しています。
コードは正しいと継ぎ目があります。JPanel が JFrame 全体を占めていませんか? System.out.println(drawingPanel.getSize())これを確認するために a を追加します。
JFrame のデフォルトである BorderLayout を使用していて、制約なしでパネルを追加した場合、パネルは領域全体を使用します。PreferredSize は無視されます。
テストのためだけに、これを試してください:

public Drawing (){
    drawingPanel = new JPanel();
    drawingPanel.setPreferredSize(new Dimension(600,600));  // ignored
    drawingPanel.setBounds(0, 0, 600, 600);  // location and size
    setLayout(null);
    add(drawingPanel);
}

しかし、IMOこれは最善または正しい方法ではありません。paintComponent()Thorsten と camickr によって提案されているように、JPanelのメソッドをオーバーライドしたいと思います。
ただし、他のコンポーネントが JFrame に追加されるか、LayoutManager が変更されるまで、JFrame の全領域を引き続き使用します。

于 2010-01-01T17:24:02.333 に答える