删除矩形JavaFX之间的间距
Remove spacing between rectangles JavaFX
我正在 Java 中开发 ASCII 图形引擎,以模拟终端图形,而无需处理实际终端的一些麻烦。
一个关键因素是为角色的背景着色。所以在每个位置,我都放了一个矩形作为背景色,还有一个文本对象,它代表一个字符(使用 monospace 字体)。
我试过使用 FlowPanes、TilePanes、GridPanes,但常规窗格似乎效果最好(达到最小间距)。这是一张显示当前问题的图片:Screenshot
我正在尝试使所有矩形对齐,使得 space 看不到背景。在上面链接的图像中,彩色矩形之间不应有黑色脊线。
这是我为每个 "pixel" 添加矩形和文本的代码(这只是一个名为 Char 的 class,它包含一个矩形和一个文本对象)。
for (int x = 0; x < COLUMNS; x++)
for (int y = 0; y < ROWS; y++)
pixels[x][y] = new Char(pane, paddingX + x * width, paddingY + y * height, width, height);
高度和宽度是在此块之前计算的,并根据使用的字体确定。它们代表任何字符的宽度和高度,因为使用的字体是 monospace。 padding只是一个用来居中的数字"pixels",也是在嵌套循环之前确定的。
字符 class:
private Text ch;
private Rectangle background;
Char(Pane pane, double x, double y, double w, double h) {
ch = new Text();
ch.relocate(x, y);
ch.setFont(View.font);
ch.setFill(Color.WHITE);
background = new Rectangle(w, h, Color.BLACK);
background.relocate(x, y);
ch.setBoundsType(TextBoundsType.VISUAL);
pane.getChildren().addAll(background, ch);
}
这是一个舍入问题。可以通过确保使用完整的位置和大小来修复它。
在下面的代码中,您将 x
、y
、nx
和 ny
的分配替换为注释中的分配会导致可见的间隙,但会更改 w
和 h
到整数值,例如10
,也防止了可见的间隙:
@Override
public void start(Stage primaryStage) {
double w = 10.5;
double h = 10.5;
Pane pane = new Pane();
for (int i = 0; i < 57; i++) {
for (int j = 0; j < 57; j++) {
double x = Math.floor(i * w);
double y = Math.floor(j * h);
double nx = Math.floor((i + 1) * w);
double ny = Math.floor((j + 1) * h);
// double x = i * w;
// double y = j * h;
// double nx = (i + 1) * w;
// double ny = (j + 1) * h;
Rectangle rect = new Rectangle(x, y, nx - x, ny - y);
rect.setFill(Color.BLACK);
pane.getChildren().add(rect);
}
}
primaryStage.setScene(new Scene(pane, 600, 600));
primaryStage.show();
}
我正在 Java 中开发 ASCII 图形引擎,以模拟终端图形,而无需处理实际终端的一些麻烦。
一个关键因素是为角色的背景着色。所以在每个位置,我都放了一个矩形作为背景色,还有一个文本对象,它代表一个字符(使用 monospace 字体)。
我试过使用 FlowPanes、TilePanes、GridPanes,但常规窗格似乎效果最好(达到最小间距)。这是一张显示当前问题的图片:Screenshot
我正在尝试使所有矩形对齐,使得 space 看不到背景。在上面链接的图像中,彩色矩形之间不应有黑色脊线。
这是我为每个 "pixel" 添加矩形和文本的代码(这只是一个名为 Char 的 class,它包含一个矩形和一个文本对象)。
for (int x = 0; x < COLUMNS; x++)
for (int y = 0; y < ROWS; y++)
pixels[x][y] = new Char(pane, paddingX + x * width, paddingY + y * height, width, height);
高度和宽度是在此块之前计算的,并根据使用的字体确定。它们代表任何字符的宽度和高度,因为使用的字体是 monospace。 padding只是一个用来居中的数字"pixels",也是在嵌套循环之前确定的。
字符 class:
private Text ch;
private Rectangle background;
Char(Pane pane, double x, double y, double w, double h) {
ch = new Text();
ch.relocate(x, y);
ch.setFont(View.font);
ch.setFill(Color.WHITE);
background = new Rectangle(w, h, Color.BLACK);
background.relocate(x, y);
ch.setBoundsType(TextBoundsType.VISUAL);
pane.getChildren().addAll(background, ch);
}
这是一个舍入问题。可以通过确保使用完整的位置和大小来修复它。
在下面的代码中,您将 x
、y
、nx
和 ny
的分配替换为注释中的分配会导致可见的间隙,但会更改 w
和 h
到整数值,例如10
,也防止了可见的间隙:
@Override
public void start(Stage primaryStage) {
double w = 10.5;
double h = 10.5;
Pane pane = new Pane();
for (int i = 0; i < 57; i++) {
for (int j = 0; j < 57; j++) {
double x = Math.floor(i * w);
double y = Math.floor(j * h);
double nx = Math.floor((i + 1) * w);
double ny = Math.floor((j + 1) * h);
// double x = i * w;
// double y = j * h;
// double nx = (i + 1) * w;
// double ny = (j + 1) * h;
Rectangle rect = new Rectangle(x, y, nx - x, ny - y);
rect.setFill(Color.BLACK);
pane.getChildren().add(rect);
}
}
primaryStage.setScene(new Scene(pane, 600, 600));
primaryStage.show();
}