我看到一些奇怪的行为,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所示):
根据我想要显示的位数,有没有人知道设置TextField
宽度的正确方法?我在Windows 7 Enterprise SP1 x64上使用JRE 8u77,以防万一。
修改
我已经意识到问题的一部分是,即使我通过说明here来衡量文字,我仍然不知道将Spinner.prefWidth
设置为什么。此外,似乎在基础prefWidth
编辑器上设置TextField
与在Spinner
对象上设置它没有什么不同。有没有办法获得TextField.padding
属性(在initialize
方法中返回0,即使它最终设置为7)?如何查询上/下箭头的宽度?如果我能以某种方式计算/查询这些值,那么我可以使用测量文本技术。但是,如果没有这些信息,我无法弄清楚如何去做。
答案 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();
}