我所有的JavaFX TextFields中都有行

2022-08-31 13:53:42

所以,在JavaFX上咬牙切齿,到目前为止,事情进展顺利。

但是,所有文本字段都有一行穿过它们,距离顶部10px左右。

不仅在我的应用程序中,而且在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 上

只是好奇是否有其他人看到过这个并有建议。

编辑:我下载了样本,这显然与摩德纳主题有关。里海主题看起来很好。以下是摩德纳.jar文本字段部分的屏幕截图。有趣的是,遭受了类似的问题,尽管不像.TextAreaTextField

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

Sample Form Screenshot

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)

下面是 ScenicView 8.6 中 ThreeDOM 视图的屏幕截图,请注意以下行:ThreeDOM view from ScenicView -- notice the line

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

Caspian Theme view


答案 1

这是一个已知的未解决的错误

问题似乎是开发人员无法重现。

在 bug 报告的注释中,建议使用 jvm 参数:

-Dprism.disableRegionCaching=true

但是,如果有人能够重现这个非常罕见的错误,我的建议是:

  • 修改 modena css 文件,直到 bug 得到解决并共享该信息。它可能会有所帮助,因为里海似乎有效。
  • 如有必要,请调试到 javafx 源以隔离问题。但是,问题可能会更深,但值得一试

答案 2

嗯......我不是100%确定,因为我有Linux平台,但我对我的jvm没有影响;但是我仍然试图模仿(?不确定我是否成功了),无论如何,我想你描述的问题可能真的与

  • 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 :

enter image description here

...所以黑线出现在文本字段中,距离约为10px,可能只是因为Vgap设置为10;此外,请参阅“欢迎”文本交叉但带有垂直线;我测试了“不使用字体”的场景标题是否正确定位(见图);

图像 B

enter image description here

所以我猜GridPane可能有问题;也许默认的GridPane有“可见的线条”或其他什么,但是在组件添加行“释放”之后,但由于TextField应该包含带有“字体”的“文本”(参见图像垂直线条交叉文本,因为字体),重绘无法正常工作,您可以看到顶部的黑线,如图像A所示;我不能完全模仿这种效果,但我仍然可以建议“未处置”线可能来自哪里,或者有什么:)

无论如何,我将尝试进一步分析,我在此答案中描述的信息可以帮助您找到从哪里开始调试;

如果您需要一些其他信息,请告诉我;

祝你好运:)

我用来测试的工具包:

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

推荐