Все мои текстовые поля JavaFX имеют в них строки

Итак, режу зубы на JavaFX, пока все идет хорошо.

Однако все текстовые поля имеют строку, проходящую через них, 10 пикселей или около того сверху.

Не только в моем приложении, но и в приложении SceneBuilder.

Заметьте, я не использую явный CSS, я не знаю, что использует SceneBuilder. Экран снят с SceneBuilder, мои экраны выглядят одинаково.

JavaFX TextFields

Итак, это что-то фундаментальное.

java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

В Mac OS 10.9.5

Просто интересно, если кто-то еще это видел и имеет предложение.

Изменить: я загрузил образцы, это явно что-то связано с темой Модены. Каспийская тема выглядит просто замечательно. Ниже приведен снимок экрана из раздела Modene.jar TextFields. Интересно, что TextArea испытывает аналогичную проблему, хотя и не так универсально, как TextField.

Modena.jar screenshot

Дополнительные добавления:

Люди продолжают настаивать на этом, так что вот оно. Я по существу просто придерживался этого: https://docs.oracle.com/javafx/2/get_started/form.htm и использовал проект приложения NetBeans 8.0.2 JavaFX по умолчанию. Просто вырезать и вставить его с сайта.

public class Fxlinetest extends Application {

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX Welcome");

        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(25, 25, 25, 25));

        Text scenetitle = new Text("Welcome");
        scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
        grid.add(scenetitle, 0, 0, 2, 1);

        Label userName = new Label("User Name:");
        grid.add(userName, 0, 1);

        TextField userTextField = new TextField();
        grid.add(userTextField, 1, 1);

        Label pw = new Label("Password:");
        grid.add(pw, 0, 2);

        PasswordField pwBox = new PasswordField();
        grid.add(pwBox, 1, 2);

        Button btn = new Button("Sign in");
        HBox hbBtn = new HBox(10);
        hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
        hbBtn.getChildren().add(btn);
        grid.add(hbBtn, 1, 4);

        final Text actiontarget = new Text();
        grid.add(actiontarget, 1, 6);

        Scene scene = new Scene(grid, 300, 275);
        primaryStage.setScene(scene);

        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Пример скриншота формы

java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

Вот скриншот из представления ThreeDOM от ScenicView 8.6, обратите внимание на строку: Просмотр с трех точек зрения из ScenicView - обратите внимание на строку

java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)

Здесь образец экрана с использованием каспийской темы через:

    System.setProperty("javafx.userAgentStylesheetUrl", "caspian");

Каспийский вид темы

Ответ 1

Это известная неразрешенная ошибка.

Проблема заключается в том, что она не воспроизводится разработчиками.

В комментариях отчета об ошибке предлагается использовать параметр jvm:

-Dprism.disableRegionCaching=true

Однако, если кто-то может воспроизвести эту очень редкую ошибку, мое предложение:

  • измените файл modena css до тех пор, пока ошибка не будет решена и не будет делиться этой информацией. это может помочь, поскольку каспийский, похоже, работает.
  • при необходимости отлаживать источник javafx, чтобы изолировать проблему. однако проблема может быть более глубокой, но стоит сделать

Ответ 2

Эмм... Я не уверен на 100%, потому что я не влияю на мой jvm, хотя у меня есть платформа Linux; Но все же я пытался подражать ("не уверен, что я преуспел очень хорошо), так или иначе, я думаю, что проблема, которую вы описываете, может быть действительно связана с

  • a) шрифт
  • b) перерисовать проблему

Представленный вами код меня немного изменил, чтобы показать, что происходит с сетчатыми линиями, если компоненты находятся в "некотором" порядке;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;


public class BlackLineIssueJavaFXApplication1 extends Application {



    @Override
    public void start(Stage primaryStage) {

        System.setProperty("javafx.userAgentStylesheetUrl", "Modena");
        //Modena,caspian
        primaryStage.setTitle("JavaFX Welcome");

        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(25, 25, 25, 25));
//        grid.setGridLinesVisible(false);//<---

        Text scenetitle = new Text("Welcome");//original
//        Label scenetitle = new Label("Welcome");//modified
        scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));//original
//        scenetitle.setFont(Font.font("Verdana", FontWeight.LIGHT, 30));//modified
        grid.add(scenetitle, 0, 0, 2, 1);//original
//        grid.add(scenetitle, 0, 0);//modified


        Label userName = new Label("User Name:");//original
//        Text userName = new Text("User Name:");
//        userName.setFont(Font.font("Tahoma", FontWeight.NORMAL, 11));

//        grid.add(userName, 0, 1);//original
        grid.add(userName, 0, 1,1,2);//modified


        grid.setGridLinesVisible(true);//<---

        TextField userTextField = new TextField();  
//        userTextField.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));//modified
        userTextField.setOpacity(0.5);//<----

//        grid.add(userTextField, 1, 1);//original
        grid.add(userTextField, 1, 1,1,2);//modified

        grid.setGridLinesVisible(false);//<---



        Button btn = new Button("Sign in");
        HBox hbBtn = new HBox(10);

        hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
        hbBtn.getChildren().add(btn);
        grid.add(hbBtn, 1, 4);//original
        //grid.add(hbBtn, 1, 3);//modified

        final Text actiontarget = new Text();
        grid.add(actiontarget, 1, 6);

        Scene scene = new Scene(grid, 300, 275);
        primaryStage.setScene(scene);

        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

Запуск приложения выглядит следующим образом:

Изображение A:

введите описание изображения здесь

... поэтому черная строка появляется в текстовом поле на расстоянии около 10 пикселей, возможно, только потому, что Vgap установлен на 10; Более того, см. Текст "приветствия" скрещен, но с вертикальными линиями; Я тестировал, если "не использовать шрифт" для scenetitle, он правильно расположен (см. Изображение);

Изображение B

введите описание изображения здесь

Так что, возможно, что-то не так с GridPane. Может быть, по умолчанию GridPane имеет "видимые строки" или что-то, но после того, как компоненты добавили строки "disposed", но из-за TextField, который должен содержать "текст" с "шрифтом" (см. Изображение. Вертикальные линии пересекают текст из-за шрифта), repaint doesn 't работаем правильно, и вы можете видеть черную линию наверху, как показывает изображение A; Я не могу полностью эмулировать эффект, но все же могу предложить, где может возникнуть "непривязанная" линия или что-то подобное.

Я попытаюсь проанализировать немного дальше, так как информация, которую я описываю в этом ответе, может помочь вам найти, с чего начать отладку;

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать;

Удачи:)

Инструмент

который я использовал для тестирования:

  • JDK 1.0.8_25-
  • jre-1.8.0_60 (Linux x64)
  • ide: netbeans 8.0.1