【问题标题】:JavaFX TextField.setPrefColumnCount() not workingJavaFX TextField.setPrefColumnCount() 不工作
【发布时间】:2016-05-12 16:39:44
【问题描述】:

我看到一些奇怪的行为,在调用 setPrefColumnCount 后,没有正确计算 javafx.scene.control.TextField 的首选宽度。我的具体用例是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 设置为什么。此外,似乎在底层TextField 编辑器上设置prefWidth 与在Spinner 对象上设置它没有什么不同。有没有办法获得TextField.padding 属性(在initialize 方法中返回0,即使它最终在每一侧都设置为7)?如何查询向上/向下箭头的宽度?如果我能以某种方式计算/查询这些值,那么我可以使用测量文本技术。但是,如果没有这些信息,我无法弄清楚如何去做。

【问题讨论】:

  • 该属性也从未对我有用。我通过使用不同的方法来确定相对显示缩放来解决它。我创建了一个类似于 css 中的 em 值的变量。 final static double em = Math.rint(new Text("").getLayoutBounds().getHeight()); 然后我使用乘数作为相对宽度和高度的基础。 navButtons.setButtonMinWidth(5*em);
  • 我尝试基于包含所需数量的零字符的measuring text 做类似的事情。但是,在 Spinner 对象的特定情况下,我正在努力解决如何应用该测量。似乎设置基础TextFieldprefWidth 还必须考虑padding 属性(在initialize 方法中返回0,即使它最终会是7)和向上/向下按钮(其宽度我似乎无法获得)。

标签: java javafx java-8 javafx-8


【解决方案1】:

填充属性返回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();
    }

【讨论】:

  • 在“TextField 被添加到SceneGraph 之后”是否有一些我可以订阅的事件被触发?如果不是,实现此功能的标准做法是什么?
  • 在将相关节点附加到 Scene 中的 Stage 后,您可以使用上述任何一种方法。因此,在stage.show() 显示Stage 之后,您可以调用您需要的方法。
  • 我所有的 JavaFX 控制器都已经实现了一个包含 setStage 方法的接口(因此我可以为弹出对话框设置所有者)。对于那些包含Spinner 控件的组件,我注册了Stage.onShown 事件,并在该处理程序中执行此宽度计算。
  • 最后一点:我必须将prefWidth="0" 添加到Spinner 元素的FXML 中才能正常工作。否则,在显示Stage 后设置prefWidth 属性值时不会执行布局。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2015-11-11
  • 2015-12-07
相关资源
最近更新 更多