【问题标题】:Updating TextField - JavaFx更新文本字段 - JavaFx
【发布时间】:2018-07-13 02:41:12
【问题描述】:

我有 1 个“ViewElements”类、1 个控制器和 1 个 FXML 文件。

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

我尝试更新TextField“textfieldDateiAuswaehlen”,我想将文件的路径设置到TextField中,但我的方法不起作用。

视图元素:

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) {
}}

在屏幕截图中,您看到路径已传递给 TextField,但 UI 中的 TextField 并未更新。

我的错误在哪里?

【问题讨论】:

    标签: javafx textfield


    【解决方案1】:

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

    如果你声明一个控制器,给元素fx:id 属性,并在控制器中声明@FXML-annotated 字段,FXMLLoader 会将这些字段控制器中设置到 UI从 FXML 创建的节点。

    在您的代码中,您的控制器不包含 @FXML-annotated 字段。您创建了一个 ViewElements 类的实例,它创建了 TextFieldButton 的一些新实例

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

    显然,这些不是FXMLLoader 创建的相同文本字段和按钮。

    大概在某个地方,您加载了 FXML 并显示由 FXMLLoader 创建的 UI;但您不会显示在 ViewElements 实例中创建的 UI 节点。因此,当您修改 ViewElements 实例中的节点时,您并没有修改已显示的 UI,因此您什么也看不到。

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

    如果您想将逻辑与包含 UI 元素的类分离到不同的类中,则将“控制器”设为具有 UI 元素的类,并创建一个包含逻辑实现的不同类。然后在“控制器”类中,将用户事件处理委托给您的新类。

    即将fx:controller属性更改为指向ViewElements,并重构为

    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());
                }
            }
    
        }
    
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2015-01-16
      • 2017-08-31
      • 1970-01-01
      • 2015-01-12
      相关资源
      最近更新 更多