"Snap" 调整 JFrame 大小时 width/height 的 int 值

"Snap" to int values for width/height when resizing JFrame

我有一个包含自定义 JComponent 的 JFrame,该 JComponent 显示具有固定数量的行和列的网格。当调整 JFrame 的大小时,将重新计算行之间的间距,以便网格增加大小,同时仍保持相同数量的元素。当调整高度或宽度大到适合 n 列(或行)但太小不适合 n+1 时,就会出现问题。正确的观点是:

您可以看到蓝线与右侧的黑线完美对齐。如果我增加 window 的宽度,我会遇到以下问题:

网格扩展了 JComponent,并在其 paintComponent 中执行以下操作:

// Get the size of the JFrame containing the Grid
Dimension df = getParent().getSize();

// Calculate spacing between vertical lines (20 = number of vertical lines)
int vert_spacing = (df.width - 2 * this.margin) / 20;

// Draw the black border
g.setColor(Color.BLACK);
g.drawRect(this.margin, this.margin, df.width - 2 * this.margin, df.height - 2 * this.margin);

// Draw vertical lines
for (int i = this.margin; i <= df.width - this.margin; i += vert_spacing) {
    g.setColor(Color.blue);
    g.drawLine(i, this.margin, i, df.height - this.margin);
}

我想到的解决方案是 "snap" 在调整 JFrame 的大小后获得一个很好的价值,但我无法让它工作,我不确定它是否是最好的解决方案。问题在于 drawLineints 作为其值,因此行间距会变圆 up/down。有解决办法吗?

谢谢!

我认为问题在于您将矩形绘制得太大了。您需要考虑到矩形大小应基于垂直间距 * 20 而不是父级的实际大小 window.

可能是这样的:

int vert_spacing = (df.width - 2 * this.margin) / 20;
int extraSpace = df.width - (vert_spacing * 20);

// Draw the black border
g.setColor(Color.BLACK);
g.drawRect(this.margin, this.margin, (df.width - extraSpace) - 2 * this.margin, df.height - 2 * this.margin);

当然,上面的解决方案会向左倾斜,因此您可能还希望将网格居中放置在可用的 space 中。因此,除了使用边距作为 X 偏移量之外,您还需要使用额外 space:

的一半
int vert_spacing = (df.width - 2 * this.margin) / 20;
int extraSpace = df.width - (vert_spacing * 20);
int xOffset = extraSpace / 2;

// Draw the black border
g.setColor(Color.BLACK);
g.drawRect(this.margin + xOffset, this.margin, (df.width - extraSpace) - 2 * this.margin, df.height - 2 * this.margin);

当然画竖线的时候也需要用到xOffset

您应该使用浮动坐标,然后将它们四舍五入,以获得 "draw" 函数所需的整数:

// Calculate spacing between vertical lines (20 = number of vertical lines)
float vert_spacing = (float)(df.width - 2 * this.margin) / 20f;

// Draw vertical lines
for (int i=0; i<20; i++) {
    int x = Math.round(this.margin + i*vert_spacing);
   g.setColor(Color.blue);
   g.drawLine(x, this.margin, x, df.height - this.margin);
}