我有问题。我在JFrame中使用了Gridbaglayout。其中一个组成部分是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。如何解决这个问题,以使网格线背景看起来不错,网格线外没有任何额外的空白区域?
答案 0 :(得分: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);
}
}
一些细节:
paintComponents()
没有致电super.paintComponents()
。应该!答案 1 :(得分:0)
你正在增加300.经过两次迭代后,我就是600,你退出for循环。 尝试将尺寸设置为601或增加299.您还可以在比较中使用宽度+ 1和高度+ 1.