当前位置: 首页 > 知识库问答 >
问题:

我所有的JavaFX文本字段中都有行

楚昀
2023-03-14

所以,在JavaFX上切齿,到目前为止一切进展顺利。

然而,所有文本字段都有一条横跨它们的线,从顶部算起大约10px。

不仅在我的应用程序中,在SceneBuilder应用程序中也是如此。

注意,我没有使用任何明确的CSS,我不知道SceneBuilder使用什么。屏幕截图来自SceneBuilder,我的屏幕看起来一样。

所以,这是基本的东西。

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上

只是好奇是否还有人看过这个并有建议。

编辑:我下载了样本,这显然与Modena主题有关。里海主题看起来不错。下面是Modena的屏幕截图。jartextfields部分。有趣的是,TextArea遇到了类似的问题,尽管不像TextField那样普遍。

更多附录:

人们一直在吵着要这个,所以它来了。我基本上是这样做的: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)

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)

使用Caspian的主题屏幕:

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

共有2个答案

陈飞
2023-03-14

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

  • a)字体
  • b)重漆问题

您所表示的代码我做了一些修改,以显示如果组件按“某些”顺序排列,gridpanel线会发生什么情况;

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:

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

图像B

所以我猜GridPane可能有问题;可能默认的网格窗格有“可见的线条”或其他内容,但在组件添加了“已处理”的线条后,由于TextField应该包含“文本”和“字体”(请参见图像A垂直线条交叉文本,因为字体),重绘无法正常工作,您可以看到顶部的黑色线条,如图A所示;我无法完全模仿这种效果,但我仍然可以建议“未处置”行可能来自何处或其他方面:)

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

如果您需要一些额外的信息,请让我知道;

祝你好运:)

我用来测试的工具包:

  • jdk-1.0.8_25
阎唯
2023-03-14

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

问题似乎在于,它对开发人员来说是不可复制的。

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

-Dprism.disableRegionCaching=true

然而,如果有人能够复制这种非常罕见的错误,我的建议是:

  • 修改modena css文件,直到错误得到解决并共享该信息。这可能会有帮助,因为里海似乎起作用了
  • 如有必要,调试到javafx源代码中以隔离问题。然而,问题可能会更深,但值得一试
 类似资料:
  • 我的代码中有JavaFX文本字段,希望在文本字段上为不同的事件添加一个操作。 今天,我只在文本字段中写入一些文本后按enter键时得到一个操作。如何添加处理tab press的操作?还有,当文本字段用鼠标点击失去焦点时,该如何反应? 当我读留档应该是可能的:https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TextFi

  • 问题内容: 我想在我存储在Elasticsearch 7.3中的文档中搜索单词 我想要在以前版本的Elasticsearch上工作的示例是: 但是此查询不适用于Elasticsearch 7+,因为已删除。现在该字段消失了,我该如何编写查询以完成相同的任务? 注意:我已经阅读了将所有字段复制到自定义字段中的建议,但是这要求显式地写出每个字段以包括在all_fields字段中。由于我有很多小字段,因

  • 我在寻找一种方法来放弃我的程序中的一个getter。我有一堆动态创建的文本字段: 下面是getter,我想在这里返回聚焦的TextField 处理程序将接收聚焦字段并调用我的“model”-class中的checkInput()方法。 此刻,它接收到一个由我自己设置的预定义字段。检查答案的代码有效。感谢任何帮助我的人,如果我自己找到了一个方法,我一定会把它贴在这里。

  • 我正在从事一个JavaFX 2.2项目,在使用TextField控件时遇到问题。我想限制用户可以在每个文本字段中输入的字符数。但是,我找不到属性或类似maxlength的东西。Swing中也存在同样的问题,通过这种方式解决了。JavaFX 2.2如何解决这个问题?

  • 问题内容: 我需要通过使用命令替换表的列中的一些字符。 我知道该命令需要一个列名,然后是要更改的文本(在以下示例中为“ a”字符)和新文本(在以下示例中为“ e”字符)。 这样执行该命令将用’ e* ‘字符更改表的列中所有’ a ‘出现次数。 * 但是,如果我需要为每一列而不只是为每一列执行命令,该怎么办?这可能吗? 谢谢 问题答案: 使用以下SQL查询来生成您需要替换所有列中的值的SQL查询。

  • 我不明白为什么我所有的bean在控制器中都是空的。我知道这是一个常见的问题,但我不是用实例化对象。 控制器: 当我请求我在上收到一个NullPointerException。 我的服务 网络配置 主要的 启动应用程序时,我可以在日志中看到bean实际上正在自动连接到控制器: 所以我不明白为什么当我试图访问控制器中的时,它是空的。我不会在任何地方用实例化控制器。 裁剪异常 编辑: 我已经删除了网页。