getHeight() 和 getWidth() 都是 return 0
getHeight() and getWidth() both return 0
我正在尝试在 JPanel 中使用线条创建网格,为此,我绘制了均匀间隔的水平线和垂直线,直到到达 JPanel 的末尾。我使用一个名为 Drawing 的 class,它扩展了 JPanel 并且是我添加到 window 的对象。下面是我的代码。
public final class Drawing extends JPanel {
public Drawing() {
super();
setBackground(new Color(255, 255, 255));
setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
GroupLayout workspacePanelLayout = new GroupLayout(this);
setLayout(workspacePanelLayout);
workspacePanelLayout.setHorizontalGroup(workspacePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGap(0, 343, Short.MAX_VALUE));
workspacePanelLayout.setVerticalGroup(workspacePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGap(0, 400, Short.MAX_VALUE));
initWorkSpace();
}
private static class Line {
final int x1;
final int y1;
final int x2;
final int y2;
final Color color;
public Line(int x1, int y1, int x2, int y2, Color color) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.color = color;
}
}
private final LinkedList<Line> lines = new LinkedList<>();
public void addLine(int x1, int x2, int x3, int x4) {
addLine(x1, x2, x3, x4, Color.black);
}
public void addLine(int x1, int x2, int x3, int x4, Color color) {
lines.add(new Line(x1, x2, x3, x4, color));
repaint();
}
public void clearLines() {
lines.clear();
repaint();
}
@Override
private void paintComponent(Graphics g) {
super.paintComponent(g);
for (Line line : lines) {
g.setColor(line.color);
g.drawLine(line.x1, line.y1, line.x2, line.y2);
}
}
public void initWorkSpace() {
int x = 0;
int y = 0;
while (x < this.getWidth()) {
addLine(x, 0, x, this.getHeight(), new Color(153, 153, 153));
x += getSpacing();
}
while (y < this.getHeight()) {
addLine(0, y, this.getWidth(), y, new Color(153, 153, 153));
y += getSpacing();
}
}
}
问题是 'this.getHeight()' 和 'this.getWidth()' 都是 return 0,因此无法绘制网格。画线效果很好,只是面板显然没有尺寸。我该如何解决这个问题。
不是主要问题,但您需要将 class 的 getPreferredSize()
方法重写为 return 大小。
每个组件负责确定自己的首选大小。
然后布局管理器可以在将面板添加到父面板时使用此信息。
当然,这假设父面板正在使用您应该使用的布局管理器。
有关更多信息和工作示例,请阅读 Custom Painting
上的 Swing 教程部分
真正的问题是当您调用以下方法时:
initWorkSpace();
所有组件在创建时都具有零大小。因此,当从构造函数调用上述方法时,大小将始终为零。
如果您的绘画代码是动态的,这意味着它会随着框架大小的调整而变化,那么您需要在 paintComponent() 方法中调用该逻辑。
或者如果您的逻辑太复杂而无法在每次重绘组件时执行,您可以在面板中添加一个 ComponentListener
并处理 componentResized
方法并调用该方法。
此外,我不确定您为什么在进行自定义绘画时使用 GroupLayout。
我正在尝试在 JPanel 中使用线条创建网格,为此,我绘制了均匀间隔的水平线和垂直线,直到到达 JPanel 的末尾。我使用一个名为 Drawing 的 class,它扩展了 JPanel 并且是我添加到 window 的对象。下面是我的代码。
public final class Drawing extends JPanel {
public Drawing() {
super();
setBackground(new Color(255, 255, 255));
setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
GroupLayout workspacePanelLayout = new GroupLayout(this);
setLayout(workspacePanelLayout);
workspacePanelLayout.setHorizontalGroup(workspacePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGap(0, 343, Short.MAX_VALUE));
workspacePanelLayout.setVerticalGroup(workspacePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGap(0, 400, Short.MAX_VALUE));
initWorkSpace();
}
private static class Line {
final int x1;
final int y1;
final int x2;
final int y2;
final Color color;
public Line(int x1, int y1, int x2, int y2, Color color) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.color = color;
}
}
private final LinkedList<Line> lines = new LinkedList<>();
public void addLine(int x1, int x2, int x3, int x4) {
addLine(x1, x2, x3, x4, Color.black);
}
public void addLine(int x1, int x2, int x3, int x4, Color color) {
lines.add(new Line(x1, x2, x3, x4, color));
repaint();
}
public void clearLines() {
lines.clear();
repaint();
}
@Override
private void paintComponent(Graphics g) {
super.paintComponent(g);
for (Line line : lines) {
g.setColor(line.color);
g.drawLine(line.x1, line.y1, line.x2, line.y2);
}
}
public void initWorkSpace() {
int x = 0;
int y = 0;
while (x < this.getWidth()) {
addLine(x, 0, x, this.getHeight(), new Color(153, 153, 153));
x += getSpacing();
}
while (y < this.getHeight()) {
addLine(0, y, this.getWidth(), y, new Color(153, 153, 153));
y += getSpacing();
}
}
}
问题是 'this.getHeight()' 和 'this.getWidth()' 都是 return 0,因此无法绘制网格。画线效果很好,只是面板显然没有尺寸。我该如何解决这个问题。
不是主要问题,但您需要将 class 的 getPreferredSize()
方法重写为 return 大小。
每个组件负责确定自己的首选大小。 然后布局管理器可以在将面板添加到父面板时使用此信息。
当然,这假设父面板正在使用您应该使用的布局管理器。
有关更多信息和工作示例,请阅读 Custom Painting
上的 Swing 教程部分真正的问题是当您调用以下方法时:
initWorkSpace();
所有组件在创建时都具有零大小。因此,当从构造函数调用上述方法时,大小将始终为零。
如果您的绘画代码是动态的,这意味着它会随着框架大小的调整而变化,那么您需要在 paintComponent() 方法中调用该逻辑。
或者如果您的逻辑太复杂而无法在每次重绘组件时执行,您可以在面板中添加一个 ComponentListener
并处理 componentResized
方法并调用该方法。
此外,我不确定您为什么在进行自定义绘画时使用 GroupLayout。