JPanelでグリッド線を背景としてペイントする方法
質問
私は問題があります。JFrame で Gridbaglayout を使用しました。コンポーネントの 1 つは JPanel です。
JPanelの背景としてグリッド線を描きたかったのです。たとえば、以下のプログラムでは、縦 3 本と横 3 本の線が生成されるはずですが、縦 2 本と横 2 本しか表示されません。最後の行は表示されませんでした。
もう一つの問題は、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以上あるようです。グリッド線の外側に余分な空白を入れずにグリッド線の背景を美しく見せるには、どうすればこれを解決できますか?
解決
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);
}
}
いくつかの詳細:
- 外側の線にはボーダーを使用しました。これにより、「599」でのトラブルが少し軽減されます。
- 内側に細分化されたグリッドが必要だと思いましたので、それを柔軟かつ構成可能にするためにいくつかの配管を追加しました。
- あなたに気づきました
paintComponents()
電話をかけないsuper.paintComponents()
. 。それはすべきです! - グリッドバッグ制約を指定するために、最小限必要と思われるコーディングを使用しました。コーディングが減る = バグが減る :)
- JComponent (コードの内容に従って) ではなく、JPanel (書いた内容に従って) をサブクラス化しました。違いは、JComponent が背景を描画できないため、結果的に灰色になったことのようです。
- おそらく最も重要なことは、kruler を使用して GUI を測定したことです。描画コンポーネントのサイズは両方ともちょうど 600 です。:)
他のヒント
あなたは2 itterations後300でIをインクリメントしている
、私は600で、あなたはforループを終了します。 また、あなた比較して幅+ 1と高さ+ 1を使用することができます299によって601または増分にあなたの寸法を設定してみてください。
所属していません StackOverflow