3

私は問題があります。JFrame で Gridbaglayout を使用しました。コンポーネントの 1 つが JPanel です。

JPanel の背景としてグリッド線を描きたかったのです。たとえば、以下のプログラムでは、3 つの垂直線と 3 つの水平線を生成するはずですが、2 つの垂直線と 2 つの水平線しか表示されません。最後の行は表示されませんでした。

もう1つの問題は、JPanelのサイズが私が設定したものよりも大きかったようです。これは、JPanel の白い背景よりも短い線の長さからわかりました。

  public class drawLayout extends JComponent 
    {

 public Dimension getPreferredSize() { 
  return new Dimension(600, 600); 
 }

 public int getY() { 
  return 0; 
 } 

 public int getX() { 
   return 0; 
    }

    @Override public void paintComponent(Graphics g)
    {
     g.setPaint(Color.GRAY);

            for (int i = 0; i <= getSize().width; i += 300) 
            {
               g2.drawLine(i, 0, i, getSize().height);
            }

            for (int i = 0; i <= getSize().height; i += 300) 
            {
               g2.drawLine(0,i, getSize().width, i);
            }
    } 
}

編集:

http://www.freeimagehosting.net/image.php?1af16edc28.jpg

最初の問題は解決しました (グリッド線は JPanel に表示されました)。もう一つの問題は私を困惑させました。添付の画像でわかるように、グリッドの長さ (赤いボックスでマーク) を見ると、JPanel のサイズは 600 を超えているように見えます。グリッドラインの外側に余分な空白がなくてもグリッドラインの背景がきれいに見えるようにするにはどうすればよいですか?

4

2 に答える 2

3

JPanel のサイズが 600 の場合、使用可能な座標は 0 から 599 までです。600 の線は描画されません。

また、境界線やインセットがあると、使用可能なスペースがさらに減少します。

更新:時間があったので、アプリケーションを書きました。うまくいけば、いくつかの有用なヒントが見つかります。

public class Jessy extends JFrame {

   private static final int DRAWING_SIZE = 600;
   private static final int SUBDIVISIONS = 2;
   private static final int SUBDIVISION_SIZE = DRAWING_SIZE / SUBDIVISIONS;

   public Jessy() {
      setSize(800, 800);
      setLayout(new GridBagLayout());
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.weightx = 1.0;
      gbc.weighty = 1.0;
      gbc.gridx = 0;
      gbc.gridy = 0;
      JLabel drawingBoard = new JLabel("Drawing Board");
      gbc.anchor = GridBagConstraints.SOUTH;
      drawingBoard.setFont(new Font("Serif", Font.BOLD, 28));
      add(drawingBoard, gbc);
      JPanel panel = new JPanel() {
         @Override public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setPaint(Color.GRAY);
            for (int i = 1; i < SUBDIVISIONS; i++) {
               int x = i * SUBDIVISION_SIZE;
               g2.drawLine(x, 0, x, getSize().height);
            }
            for (int i = 1; i < SUBDIVISIONS; i++) {
               int y = i * SUBDIVISION_SIZE;
               g2.drawLine(0, y, getSize().width, y);
            }
         }          
      };
      panel.setPreferredSize(new Dimension(DRAWING_SIZE, DRAWING_SIZE));
      panel.setBackground(Color.WHITE);
      panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
      gbc.gridy++;
      gbc.anchor = GridBagConstraints.CENTER;
      add(panel, gbc);
      JButton saveDrawing = new JButton("SAVE DRAWING");
      gbc.gridy++;
      gbc.anchor = GridBagConstraints.NORTH;
      add(saveDrawing, gbc);
   }
   public static void main(String[] args) {
      (new Jessy()).setVisible(true);
   }
}

いくつかの詳細:

  • 外線には Border を使用しました。これにより、「599」の手間が少し省けます。
  • 内側に細分化されたグリッドが必要だと思ったので、柔軟で構成可能にするために配管を追加しました。
  • paintComponents()あなたが を呼び出さないことに気付きましたsuper.paintComponents()。そうすべき!
  • gridbag の制約を指定するために最低限必要なコーディングと思われるものを使用しました。コーディングが少ない = バグが少ない :)
  • JComponent(コードの内容に従って)ではなく、JPanel(あなたが書いたものに従って)をサブクラス化しました。違いは、JComponent が背景を描画できないため、最終的に灰色になったことです。
  • おそらく最も重要なことは、kruler を使用して GUI を測定したことです。描画コンポーネントのサイズは、両方ともちょうど 600 です。:)
于 2009-12-08T22:49:44.680 に答える
0

i を 300 ずつ増やしています。2 回繰り返した後、i は 600 になり、for ループを終了します。サイズを 601 に設定するか、299 ずつ増やしてみてください。幅 + 1 と高さ + 1 を比較に使用することもできます。

于 2009-12-08T22:48:44.053 に答える