使用JavaFX从多个文本字段中检索输入

时间:2017-11-13 14:38:04

标签: java javafx textfield

使用JavaFX,我创建了4个文本字段,用户可以输入信息。然后我按下一个按钮,将用户的输入保存到文本文件中,用户可以在其中选择要保存的位置。 我无法弄清楚如何从每个单独的字段中检索用户的输入。 我正在使用带有控制器类的fxml。

package application;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

public class MainController {

@FXML
private Button Button1;
@FXML
private Button Button2;

@FXML
private ListView listview;
@FXML
private TextField Name;
@FXML
private TextField DoB;
@FXML
private TextField Address;
@FXML
private TextField Exp;

public void Button1Action(ActionEvent event) {
    FileChooser fc = new FileChooser();
    File selectedFile = fc.showOpenDialog(null);

    if (selectedFile != null) {
        listview.getItems().add(selectedFile.getName());
    } else {
        System.out.println("File is not valid");
    }

}

public void Button2Action(ActionEvent e) {
    String name = name.getText(Name);
}

}

这是fxml     

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" 
minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" 
xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="application.MainController">
<children>
  <Button fx:id="Button1" layoutX="90.0" layoutY="72.0" 
mnemonicParsing="false" onAction="#Button1Action" text="File Explorer" />
  <ListView fx:id="listview" layoutX="300.0" layoutY="27.0" 
prefHeight="346.0" prefWidth="200.0" />
  <TextField fx:id="DoB" layoutX="131.0" layoutY="238.0" />
  <TextField fx:id="Address" layoutX="131.0" layoutY="274.0" />
  <TextField fx:id="Exp" layoutX="131.0" layoutY="310.0" />
  <TextField fx:id="Name" layoutX="131.0" layoutY="200.0" />
  <Button fx:id="Button2" layoutX="159.0" layoutY="348.0" 
mnemonicParsing="false" onAction="#Button2Action" text="Print Paycheck" />
  <Label layoutX="15.0" layoutY="204.0" text="Name" />
  <Label layoutX="14.0" layoutY="242.0" text="Date of Birth" />
  <Label layoutX="15.0" layoutY="278.0" text="Address" />
  <Label layoutX="15.0" layoutY="314.0" text="Years of Experience" />
</children>
</AnchorPane>

编辑:

我已经能够将输入写入文本并根据用户的需要保存。 但是文件中的文字不在新行上而是没有间隔

    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Save file");
    fileChooser.getExtensionFilters().add(new ExtensionFilter("Text Files", 
"*.txt"));
    File saveFile = fileChooser.showSaveDialog(window);

    FileWriter writer;
    try {
        writer = new FileWriter(saveFile);
        BufferedWriter buf = new BufferedWriter(writer);

        buf.write(name.getText() + "\n ");
        buf.write(dob.getText() + "\n ");
        buf.write(address.getText() + "\n ");
        buf.write(exp.getText() + "\n ");
        buf.flush();
        buf.close();

    } catch (IOException e) {

    }

2 个答案:

答案 0 :(得分:1)

String name = name.getText(Name);应更改为String name = Name.getText()。如果您对每个文本字段执行类似的操作,您应该能够获取其内容。

编辑:
要提示用户他们想要保存文本文件的位置以及要调用的内容,您可以使用FileChooser,您可以这样使用:

FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Save File");
fileChooser.getExtensionFilters().add(new ExtensionFilter("Text Files", "*.txt"));
Window window = Button1.getScene().getWindow();
File saveFile = fileChooser.showSaveDialog(window);

然后使用普通文件IO的东西来写你想要的文件。

Code Review旁注,您可以自由忽略:
在Java中,使用小写字母和带有大写字母的Classes命名变量是一种很好的做法。这使得第一眼就能看出是在对象的实例上还是在类上调用方法。

答案 1 :(得分:-1)

您可以创建一个文本字段数组。创建一个vbox而不是ListView,然后在for循环中向vbox子项添加文本字段。

另一种选择是使用listview。 [如果您的文本字段很少使用vbox而不是listview]