javafx:如何调用和传递控制对象?

7eumitmz  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(352)

这是一种获取不同javafx控件文本的方法。

  1. private String getText(Node item) {
  2. String txt = "";
  3. if (item instanceof Label) {
  4. if(!((Label)item).getText().isEmpty()){
  5. txt = ((Label)item).getText();
  6. }
  7. }
  8. if (item instanceof TextField) {
  9. if(!((TextField)item).getText().isEmpty()){
  10. txt = ((TextField)item).getText();
  11. }
  12. }
  13. if (item instanceof CheckBox) {
  14. if(!((CheckBox)item).getText().isEmpty()){
  15. txt = ((CheckBox)item).getText();
  16. }
  17. }
  18. return txt;
  19. }

我正试图减少代码行数。除了定义标签、文本字段、复选框等,是否有一个对象类可以调用所有其他控件并放在节点项旁边,这样我就不需要重复和指定每个控件?有没有办法做到这一点?

  1. private String getText(Node item, X x) {
  2. String txt = "";
  3. if (item instanceof x) {
  4. if(!((x)item).getText().isEmpty()){
  5. txt = ((x)item).getText();
  6. }
  7. return txt;
  8. }

我应该用什么替换x&x。我不知道应该调用或替换控件的对象。只是不介意isempty的逻辑。我主要关心的是应该调用或替换控件的对象。然后像这样调用该方法

  1. getText(txtSample, TextField.class)

  1. getText(lblSample, Label.class)

非常感谢。

6l7fqoea

6l7fqoea1#

因为普通的超类控件没有方法 getText() (因为并非所有控件都有文本),这是不可能的。
编辑:正如詹姆斯·杜德所指出的, LabelCheckBox 是否有一个拥有该方法的共同祖先 getText() ,即 Labeled . 这为我们节省了另一笔钱 instanceof 检查。
然而,其余的相似之处可以提取出来。假设我们首先编写一个helper方法来从控件中提取文本(注意与 instanceof :

  1. private String getRawText( final Node item )
  2. {
  3. if( item instanceof Labeled labeled )
  4. return labeled.getText();
  5. else if( item instanceof TextField field )
  6. return field.getText();
  7. else //this is the default
  8. return "";
  9. }

然后,原始函数变为:

  1. private String getText( final Node item )
  2. {
  3. final var txt = getRawText( item );
  4. return txt.isEmpty()
  5. ? ""
  6. : txt;
  7. }

但请注意,您需要检查 text.isEmpty() 而您初始化变量时使用的默认值 txt 它本身是空的( "" ). 因此,不需要检查是否为空。你是说 .isBlank() (仅剥离空白字符串)?或 getText() == null ?
否则,它可以被删除,然后你的左功能 getRawText() 只有

展开查看全部

相关问题