我有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) {
}}
我的错误在哪里?
加载FXML文件时,FXMLLoader
创建与FXML中的元素相对应的UI节点。
如果声明一个控制器,赋予元素fx:id
属性,并在控制器中声明@fxml
-注释字段,则FXMLLoader
将把控制器中的这些字段设置为从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();
}
大概在某个地方,您加载了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中获得自定义主题的正确方法。 一个更优雅的解决方案如下: 同时,如果你只是想显示