当前位置: 首页 > 知识库问答 >
问题:

更新textfield-JavaFX

乐修远
2023-03-14

我有1个“viewelements”-类,1个控制器和1个fxml-文件。

ViewElements-Class包含FXML的元素,如按钮和文本字段。Controller-Class包含业务逻辑。

我试图更新文本字段“TextFieldDateIausWaeHlen”,我想将文件的路径设置到文本字段中,但我的方法不起作用。

public class ViewElements {

@FXML private TextField textfieldDateiAuswaehlen;
@FXML private TextArea textareaXmlContent;
@FXML private Button buttonXmlBearbeiten;
@FXML private Button buttonXmlLaden;
@FXML private Button buttonXmlOeffnen;

public ViewElements() {
    this.textfieldDateiAuswaehlen= new TextField();
    this.textareaXmlContent = new TextArea();
    this.buttonXmlBearbeiten = new Button();
    this.buttonXmlLaden = new Button();
    this.buttonXmlOeffnen = new Button();
}

public TextField getTextfieldDateiAuswaehlen() {
    return textfieldDateiAuswaehlen;
}

public void setTextfieldDateiAuswaehlenText(String text) {
    this.textfieldDateiAuswaehlen.setText(text);

}

public String getTextfieldDateiAuswaehlenContent() {
    return this.textfieldDateiAuswaehlen.getText();
}

public TextArea getTextareaXmlContent() {
    return textareaXmlContent;
}

public void setTextareaXmlText(String text) {
    this.textareaXmlContent.setText(text);
}

public Button getButtonXmlBearbeiten() {
    return buttonXmlBearbeiten;
}


public Button getButtonXmlLaden() {
    return buttonXmlLaden;
}

public Button getButtonXmlOeffnen() {
    return buttonXmlOeffnen;
}}
public class SampleController implements Initializable{

ViewElements viewElems= new ViewElements();


@FXML
private void handleButtonLaden(ActionEvent event){
    System.out.println("Klicked");
}

@FXML
private void handleButtonXmlOeffnen(ActionEvent event){

    FileChooser filechooser = new FileChooser();

    File file = filechooser.showOpenDialog(null);

    //Falls eine Datei ausgewaehlt ist
    if(file != null){

        //Falls TextField leer ist
        if(viewElems.getTextfieldDateiAuswaehlenContent().isEmpty()) {

            System.out.println(file.getAbsolutePath().toString());

            viewElems.getTextfieldDateiAuswaehlen().clear();

            String verzeichnis = file.getAbsolutePath().toString();

            viewElems.setTextfieldDateiAuswaehlenText(verzeichnis);


            Service<Void> service = new Service<Void>() {
                @Override
                protected Task<Void> createTask() {
                    return new Task<Void>() {
                        @Override
                        protected Void call() throws Exception {
                            Platform.runLater(() -> viewElems.setTextfieldDateiAuswaehlenText(verzeichnis));
                            return null;
                        }
                    };
                }
            };
            service.start();

            System.out.println("PRINT: " + viewElems.getTextfieldDateiAuswaehlenContent());
        }
    }

}

@Override
public void initialize(URL location, ResourceBundle resources) {
}}

我的错误在哪里?

共有1个答案

巴英韶
2023-03-14

加载FXML文件时,FXMLLoader创建与FXML中的元素相对应的UI节点。

如果声明一个控制器,赋予元素fx:id属性,并在控制器中声明@fxml-注释字段,则FXMLLoader将把控制器中的这些字段设置为从FXML创建的UI节点。

在代码中,控制器不包含@fxml注释字段。您可以创建viewelements类的实例,该类将创建TextFieldButton的一些新实例:

public ViewElements() {
    this.textfieldDateiAuswaehlen= new TextField();
    this.textareaXmlContent = new TextArea();
    this.buttonXmlBearbeiten = new Button();
    this.buttonXmlLaden = new Button();
    this.buttonXmlOeffnen = new Button();
}

大概在某个地方,您加载了FXML,并显示由FXMLLoader创建的UI;但是不显示在viewelements实例中创建的UI节点。因此,当您修改viewelements实例中的节点时,您并没有修改您所显示的UI,因此您看不到任何内容。

您需要将UI元素直接放置在控制器中(将其视为演示器可能更好)。FXMLLoader将其创建的对象分配给字段的唯一方法是这些字段在控制器中,因为这是控制器“知道”的唯一其他对象。

如果要将逻辑从包含UI元素的类中分离到一个不同的类中,那么将“控制器”设置为包含UI元素的类,并创建一个包含逻辑实现的不同类。然后在“Controller”类中,只需将用户事件处理委托给新类即可。

public class ViewElements {

    @FXML private TextField textfieldDateiAuswaehlen;
    @FXML private TextArea textareaXmlContent;
    @FXML private Button buttonXmlBearbeiten;
    @FXML private Button buttonXmlLaden;
    @FXML private Button buttonXmlOeffnen;

    private SampleController controller ;

    public void initialize() {
        controller = new SampleController(this);
    }

    @FXML
    private void handleButtonXmlOeffnen(ActionEvent event){
        controller.handleButtonXmlOeffnen();
    }

    public TextField getTextfieldDateiAuswaehlen() {
        return textfieldDateiAuswaehlen;
    }

    public void setTextfieldDateiAuswaehlenText(String text) {
        this.textfieldDateiAuswaehlen.setText(text);

    }

    public String getTextfieldDateiAuswaehlenContent() {
        return this.textfieldDateiAuswaehlen.getText();
    }

    public TextArea getTextareaXmlContent() {
        return textareaXmlContent;
    }

    public void setTextareaXmlText(String text) {
        this.textareaXmlContent.setText(text);
    }

    public Button getButtonXmlBearbeiten() {
        return buttonXmlBearbeiten;
    }


    public Button getButtonXmlLaden() {
        return buttonXmlLaden;
    }

    public Button getButtonXmlOeffnen() {
        return buttonXmlOeffnen;
    }

}
public class SampleController {

    private final ViewElements viewElems ;

    public SampleController(ViewElements viewElems) {
        this.viewElems = viewElems ;
    }



    public void handleButtonXmlOeffnen() {

        FileChooser filechooser = new FileChooser();

        File file = filechooser.showOpenDialog(null);

        //Falls eine Datei ausgewaehlt ist
        if(file != null){

            //Falls TextField leer ist
            if(viewElems.getTextfieldDateiAuswaehlenContent().isEmpty()) {

                System.out.println(file.getAbsolutePath().toString());

                viewElems.getTextfieldDateiAuswaehlen().clear();

                String verzeichnis = file.getAbsolutePath().toString();

                viewElems.setTextfieldDateiAuswaehlenText(verzeichnis);


                Service<Void> service = new Service<Void>() {
                    @Override
                    protected Task<Void> createTask() {
                        return new Task<Void>() {
                            @Override
                            protected Void call() throws Exception {
                                Platform.runLater(() -> viewElems.setTextfieldDateiAuswaehlenText(verzeichnis));
                                return null;
                            }
                        };
                    }
                };
                service.start();

                System.out.println("PRINT: " + viewElems.getTextfieldDateiAuswaehlenContent());
            }
        }

    }



}
 类似资料:
  • 我认为这个解决方案是非常愚蠢的,必须有一个方法如何编码它更好。我不能每次都创建一个新的Person实例,这对我来说是不可接受的。 我也尝试为treeView触发一个事件,但这种方法会破坏焦点,也是一个愚蠢的解决方案。我也找到了这样的解决办法: 这也是不好的解决办法。

  • 对于标签,我可以轻松更改字体,但文本字段和文本区域没有选项。这正常吗? 我不能在场景生成器中为这些对象类型更改字体吗?

  • 在JavaFX应用程序中,我在choicebox旁边有一个choicebox和textfield。我想在文本域中的灰色文本框告诉用户要输入什么。但是,我希望提示文本根据ChoiceBox中选择的内容进行更改。 我在网上查找并找到了如何使用提示文本的textfield的代码,但我无法用ChoiceBox上的changeListener更改提示文本。 我试过了 而textfield之前已经用不同的提示

  • 问题内容: 我想一种添加到我当过用户更改的,它的值,应用程序在控制台上打印的东西。 我进行了搜索,发现以下非常相似的问题:JTextField的值更改侦听器 提到的问题的答案非常清楚和有效,但是不幸的是,它仅对(Not )有用,因为它说您应该像这样使用DocumentListener: 但是在JavaFX的TextField中,您无法执行此操作。所以?解决办法是什么? (使用代码进行描述可能会很好

  • 我一直在制作一个简单的JavaFX2 gui应用程序,发现JavaFX2的textfield中的PrompText在textfield获得焦点后立即隐藏。 这不是这样一些更新回来。在此更新之前,文本字段显示prompttext,直到输入一些文本。 这是不好的,真的需要一个解决方法。

  • 问题内容: 我正在使用Flutter SDK开发应用程序。当我使用一个TextField小部件,而我关注它,下划线变成蓝色。我需要这种颜色变为红色,我该怎么办呢? 我需要更改的屏幕截图。我只想更改下划线,而不要更改标签颜色。 问题答案: 尽管这些其他答案可能会以某种方式起作用,但您绝对不应使用它。这不是在Flutter中获得自定义主题的正确方法。 一个更优雅的解决方案如下: 同时,如果你只是想显示