Удалить интервал между прямоугольниками JavaFX - PullRequest
0 голосов
/ 30 мая 2018

Я работаю над графическим движком ASCII в Java, чтобы эмулировать графику терминала без каких-либо трудностей при работе с реальными терминалами.

Одним из ключевых элементов является окрашивание фона символов.Поэтому в каждой позиции я помещаю прямоугольник, который служит цветом фона, и объект Text, который представляет символ (используя моноширинные шрифты).

Я пробовал использовать FlowPanes, TilePanes, GridPanes, нообычные панели, кажется, работают лучше (достигнут наименьший интервал)Вот изображение, которое показывает проблему под рукой: Снимок экрана

Я пытаюсь выровнять все прямоугольники так, чтобы не было видимого пространства для просмотра на заднем плане.На изображении, связанном выше, между цветными прямоугольниками не должно быть черных ребер.

Вот код, который у меня есть, который добавляет Rectangle и Text для каждого «пикселя» (это просто класс с именем Char, который содержитa Прямоугольник и текстовый объект).

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);

Высота и ширина рассчитываются перед этим блоком и определяются на основе используемого шрифта.Они представляют ширину и высоту любого символа, поскольку используемый шрифт моноширинный.Заполнение - это просто число, используемое для центрирования «пикселей», которое также определяется перед вложенным циклом.

Класс Char:

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);
}

1 Ответ

0 голосов
/ 30 мая 2018

Это вопрос округления.Это можно исправить, убедившись, что вы используете целые местоположения и размеры.

В следующем коде вы заменяете назначения для 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();
}
...