JavaFX TextField.setPrefColumnCount()不起作用

时间:2016-05-12 16:39:45

标签: java javafx java-8 javafx-8

我看到一些奇怪的行为,javafx.scene.control.TextField的首选宽度在调用setPrefColumnCount后无法正确计算。我的具体用例是javafx.scene.control.Spinner控件。我的代码如下:

@FXML
private Spinner<Integer> mySpinner;

@Override
public void initialize(URL location, ResourceBundle resources) {
    mySpinner.getEditor().setPrefColumnCount(3);
}

执行上面的操作后,我得到的旋转器对于单个字符来说几乎不够大(微调器的值如图999所示):

Incorrectly Sized Spinner

根据我想要显示的位数,有没有人知道设置TextField宽度的正确方法?我在Windows 7 Enterprise SP1 x64上使用JRE 8u77,以防万一。

修改

我已经意识到问题的一部分是,即使我通过说明here来衡量文字,我仍然不知道将Spinner.prefWidth设置为什么。此外,似乎在基础prefWidth编辑器上设置TextField与在Spinner对象上设置它没有什么不同。有没有办法获得TextField.padding属性(在initialize方法中返回0,即使它最终设置为7)?如何查询上/下箭头的宽度?如果我能以某种方式计算/查询这些值,那么我可以使用测量文本技术。但是,如果没有这些信息,我无法弄清楚如何去做。

1 个答案:

答案 0 :(得分:1)

padding属性返回0,因为当时未放置的TextField没有应用任何CSS样式。将TextField添加到SceneGraph.

后尝试获取填充

那时您还可以使用Nodes lookup方法获取包含箭头按钮的StackPane

 StackPane upArrow = (StackPane) spnr.lookup(".increment-arrow-button");
 StackPane downArrow = (StackPane) spnr.lookup(".decrement-arrow-button");

然后应该可以计算微调器的宽度:

 double spinnerWidth = calculateWidth("123", spnr.getEditor()) + upArrow.getWidth();

 private double calculateWidth(String value, TextField textField) {
        Text text = new Text(value);
        text.setFont(textField.getFont());
        Insets insets = textField.getInsets();
        return insets.getLeft() + text.prefWidth(-1) + insets.getRight();
    }