我有1" ViewElements" -Class,1个Controller和1个FXML文件。
ViewElements-Class包含FXML的元素,如按钮和文本字段。 Controller-Class包含业务逻辑。
我尝试更新TextField" textfieldDateiAuswaehlen",我想将文件的路径设置为TextField但我的方法不起作用。
ViewElements:
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不会更新。
我的错误在哪里?
答案 0 :(得分:2)
加载FXML文件时,FXMLLoader
创建与FXML中元素对应的UI节点。
如果声明一个控制器,给出元素fx:id
属性,并在控制器中声明@FXML
- 带注释的字段,FXMLLoader
将在控制器中设置这些字段< / em>到从FXML创建的UI节点。
在您的代码中,您的控制器不包含@FXML
- 带注释的字段。您创建了ViewElements
类的实例,该实例创建了TextField
和Button
的一些新实例:
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
可以将它创建的对象分配给字段的唯一方法是这些字段是否在控制器中,因为这是控制器&#34;知道的唯一其他对象&#34;。
如果要将逻辑分离到与包含UI元素的类不同的类中,请创建&#34; controller&#34;具有UI元素的类,并创建包含逻辑实现的不同类。然后在&#34;控制器&#34; class,只需将用户事件处理委托给新类。
即。将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());
}
}
}
}