Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在文本区域中手动更改字体大小及其样式会导致填充错误_Java_Javafx_Javafx 8_Textarea - Fatal编程技术网

Java 在文本区域中手动更改字体大小及其样式会导致填充错误

Java 在文本区域中手动更改字体大小及其样式会导致填充错误,java,javafx,javafx-8,textarea,Java,Javafx,Javafx 8,Textarea,我正在用JavaFX创建一个小的文本编辑器 为此,我使用TextArea和ComboBox动态设置样式:例如更改字体、大小、粗体、斜体等等。这是可行的,但是有一个令人不安的视觉缺陷,我无法忍受 我试图缩小问题的范围,下面是一个具有相同行为的简单代码和一些图片,以了解我所说的内容: (若要复制错误,请将大小设置为70,然后选择粗体,您将看到文本如何逐渐远离边缘。) 图像:您可以添加以下样式表 .text区域.content{ -外汇储备:37; } 它覆盖了modena.css中的填充: .te

我正在用JavaFX创建一个小的文本编辑器

为此,我使用TextArea和ComboBox动态设置样式:例如更改字体、大小、粗体、斜体等等。这是可行的,但是有一个令人不安的视觉缺陷,我无法忍受

我试图缩小问题的范围,下面是一个具有相同行为的简单代码和一些图片,以了解我所说的内容:

(若要复制错误,请将大小设置为70,然后选择粗体,您将看到文本如何逐渐远离边缘。)


图像:

您可以添加以下样式表

.text区域.content{
-外汇储备:37;
}
它覆盖了modena.css中的填充:

.text区域.content{
/*由于滚动窗格边框的原因,顶部和底部比TextInput少1px*/
-外汇填充:0.25em 0.583em 0.25em 0.583em;/*3 7*/
-fx光标:文本;
-fx背景色:
线性梯度(从0px 0px到0px 4px,导出(-fx控件内部背景,-8%),-fx控件内部背景);
-fx背景半径:2;
}

hmm。。你指的是哪条路线?你期望的是什么?对我来说,这似乎是意料之中的:看起来填充物会根据文本大小进行调整。好的,是的,我是说填充。我期待即时更新。填充物完全不应更改,或者应在尺寸更改后立即更改。另外,是否有一种方法可以禁用填充调整?嗯,为了使文本保持在边框中,需要从顶部移动,并且此更新是即时的,所以这不是问题。光标仍然存在一个bug,它保持了以前的大小,有没有办法修复它?还是只是JavaFX错误?我不确定我是否看到了游标错误。你能解释一下你的意思吗?编辑:我想我看到了。如果重新聚焦
文本区域
,但不单击文本,则光标不会重新定位或调整大小。这就是你的意思吗?没错,这对我来说很难解释,因为我不是本地人。无论如何,我认为官方的GUI工具有这个问题是非常令人伤心的,而且似乎什么都做不了。这里有错误报告:。
public class Main extends Application {
    public void start(Stage stage) {
        textArea = new TextArea("TEST 112123");
        textArea.setPrefWidth(800);
        textArea.setPrefHeight(400);
        textArea.setLayoutY(40);

        CheckBox bold = new CheckBox("BOLD");
        bold.setLayoutX(20);
        bold.setOnAction(e -> {
            Font currentFont = textArea.getFont();

            if (bold.isSelected()) {
                textArea.setFont(
                        new Font("System Bold", currentFont.getSize()));
        //I set new Font each time to save all of it's past properties and
        //change only one of them, this is the only way that I found to do 
        //this as there are no setters in the Font class, only constructors

            } else {
                textArea.setFont(
                        new Font("System", currentFont.getSize()));
            }
        });

        ComboBox sizeBox = new ComboBox();
        //I removed the list of options and the input validity check
        sizeBox.setLayoutX(80);
        sizeBox.setEditable(true);
        sizeBox.setOnAction(e -> {
            textArea.setFont(new Font(textArea.getFont().getName(),
                           Double.valueOf((String)sizeBox.getValue())));
        });

        stage.setScene(new Scene(new Group(textArea, bold, sizeBox), 800, 500));
        stage.show();
    }
}