Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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
User interface Javafx文本字段是否调整为文本长度?_User Interface_Javafx_Textfield - Fatal编程技术网

User interface Javafx文本字段是否调整为文本长度?

User interface Javafx文本字段是否调整为文本长度?,user-interface,javafx,textfield,User Interface,Javafx,Textfield,大家好,我正在构建一个聊天服务器,我使用屏幕上的一个文本字段来输入用户写的聊天信息,这个想法是,当用户输入信息时,它就像一个气泡一样在人的头上工作 我的问题是,为了避免文本框太大或太小,有没有办法调整文本框的大小(如果愿意,请修剪),使其适应文本字段中写入的文本 另外,我正在使用JavaFx scenebuilder来完成所有这些工作。现在是时候在幕后进行一些编码了(生成器):。 以下代码块不是一个简洁的解决方案,但总比没有好。:) //定义宽度限制 textField.setMinWidth(

大家好,我正在构建一个聊天服务器,我使用屏幕上的一个文本字段来输入用户写的聊天信息,这个想法是,当用户输入信息时,它就像一个气泡一样在人的头上工作

我的问题是,为了避免文本框太大或太小,有没有办法调整文本框的大小(如果愿意,请修剪),使其适应文本字段中写入的文本


另外,我正在使用JavaFx scenebuilder来完成所有这些工作。

现在是时候在幕后进行一些编码了(生成器):。
以下代码块不是一个简洁的解决方案,但总比没有好。:)

//定义宽度限制
textField.setMinWidth(50);
textField.setPrefWidth(50);
textField.setMaxWidth(400);
//添加列表器
textField.textProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(observeValue您可以在
com.sun.javafx.scene.control.skin.Utils
中使用
computeTextWidth
方法。该方法在
javafx.scene.control.Label
类中用于计算标签内容的最小宽度

我解决了我的问题如下:

field.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> ob, String o,
                String n) {
            // expand the textfield
            field.setPrefWidth(TextUtils.computeTextWidth(field.getFont(),
                    field.getText(), 0.0D) + 10);
        }
    });

在JavaFX8中,有一个解决方案,下面是代码:

TextField tf = new TextField();
// Set Max and Min Width to PREF_SIZE so that the TextField is always PREF
tf.setMinWidth(Region.USE_PREF_SIZE);
tf.setMaxWidth(Region.USE_PREF_SIZE);
tf.textProperty().addListener((ov, prevText, currText) -> {
    // Do this in a Platform.runLater because of Textfield has no padding at first time and so on
    Platform.runLater(() -> {
        Text text = new Text(currText);
        text.setFont(tf.getFont()); // Set the same font, so the size is the same
        double width = text.getLayoutBounds().getWidth() // This big is the Text in the TextField
                + tf.getPadding().getLeft() + tf.getPadding().getRight() // Add the padding of the TextField
                + 2d; // Add some spacing
        tf.setPrefWidth(width); // Set the width
        tf.positionCaret(tf.getCaretPosition()); // If you remove this line, it flashes a little bit
    });
});
tf.setText("Hello World!");
  • 在JavaFX2.2中,这段代码的工作没有什么限制。您无法设置字体(因此,如果您不使用std字体,则必须手动设置)
  • 您无法从文本字段获取填充(因此,如果您知道填充,请将其硬编码)
快乐编码,

Kalasch

如果使用setPrefColumnCount,则不需要依赖于字体的魔法

        tf.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> ob, String o, String n) {
                tf.setPrefColumnCount(tf.getText().length() +1);
            }
        });
tf.textProperty().addListener(新的ChangeListener()){
@凌驾

public void发生了变化(observeValue自JavaFX 8以来,这是迄今为止最简单的:

textField.prefColumnCountProperty().bind(textField.textProperty().length());

最好/最简单的方法是使用JavaFX的“use\u COMPUTED\u SIZE”选项。您可以在FXML中定义它,也可以按如下方式编程:

TextField textField = new TextField("hello");
textField.setPrefWidth(Control.USE_COMPUTED_SIZE);

首先…很好的工作第二,你能详细解释一下它的功能吗?!:)这假设存在的每个javafx字体的每个字符在任何情况下都是7px宽的…这可能是人类历史上最糟糕的假设。这就像是从一个(巨人)身上带着水压飞入太空一样hose.Hey@specializet这还不错。如果你的应用程序中没有其他用例,那么这个假设可能会节省很多天;)。否则,您可能会在此处或类似问题上评估其他答案,如果这些答案不令人满意,当然会发布您的答案。除此之外,我将尝试使用更新的选项更新答案,自发布以来有很多改进。谢谢提醒。7号适合我,您在说什么@specializt?@Don喉正是我写的。再简单也写不出来了……也许你应该向说英语的人寻求帮助。是否可以通过实际创建一个标签来使用computeTextWidth()?我尝试使用文本创建一个标签,然后使用getMinWidth()和widthProperty()。doubleValue(),但两者都始终返回0.0…很好的解决方案!这是对我来说最好的答案。这个答案在实际单词的右侧没有留下太多空间。我确实必须执行
tf.setPrefWidth(width+14)
。请注意,这对可变宽度字体(在典型的文本字段中很可能是默认设置)不起作用.JavaFX似乎在计算最宽字符(“W”)的宽度之外的pref width,这高估了实际输入文本的长度。
textField.prefColumnCountProperty().bind(textField.textProperty().length());
TextField textField = new TextField("hello");
textField.setPrefWidth(Control.USE_COMPUTED_SIZE);