存储来自jfilechooser

时间:2018-04-20 14:04:49

标签: java swing java.util.scanner stringbuilder jfilechooser

所以我正在写一个汽车贷款摊销GUI程序。最终目标是获取用户输入数据或文件输入并显示付款计划。我现在有一个用户输入计划显示到控制台窗口,但我的主要问题是如何将文本文件中的数据存储到变量中以便将它们插入等式中?

我正在使用scannerstringbuilder,并且能够在控制台窗口中显示文件的内容,但无法弄清楚如何将值存储到变量中。此外,如果任何人有任何关于如何从控制台窗口显示日程安排到第二个GUI的提示,那也是很好的。

    File workingDir = new File(System.getProperty("user.dir"));

    JFileChooser openfile = new JFileChooser();
    openfile.setDialogTitle("Choose a file");
    openfile.setCurrentDirectory(workingDir);

    int status = openfile.showOpenDialog(null);

    try {
        if(status != JFileChooser.APPROVE_OPTION)
        {
            return null; // error 
        }
        else {
            File file = openfile.getSelectedFile();
            Scanner scan = new Scanner(file);
            StringBuilder info = new StringBuilder();

            while (scan.hasNext()) {
                String data = scan.nextLine();
                System.out.println(data);
            }

        }   

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    finally {

    }
return null;
}`

1 个答案:

答案 0 :(得分:0)

您显然没有显示示例代码的实际方法声明,而且从外观上看,您的数据文件只包含一行,因此我只想在此处进行操作。

文本文件中的所有内容都被视为字符串内容。要转换文本文件中的数据,您需要使用解析器。您的逗号分隔文件数据行包含3个特定值,这些值肯定会受益(目前)为 double 数据类型。为了对此数据行进行分段并将值内容放入双重类型变量,您需要使用 String.split()方法:

在我看来,我认为通过将 hasNextLine() scan.NextLine()结合使用,可以更好地阅读每个文件行。而不是 hasNext()

while (scan.hasNextLine()) {
    String data = scan.nextLine();
    // Skip blank lines or possible comment lines
    // (lines that start with a semi-colon). 
    if (data.trim().equals("") || data.trim().startsWith(";")) {
        continue;
    } 
    // Create an Array of string values.
    String[] stringValues = data.split(", ");
}

现在创建一个String Array,该数组的每个元素都包含文件数据行中包含的各个值:

  • stringValues [ 0 ]将保留字符串: 6500
  • stringValues [ 1 ]将保留字符串: 4.5
  • stringValues [ 2 ]将保留字符串: 6

请记住,数组索引从0开始而不是1.现在只需将这些元素转换并放置到单个 double 数据类型变量中,我们就可以这样做。

double totalAmount = Double.parseDouble(stringValues[0]);
double interestAmount = Double.parseDouble(stringValues[1]);
double durationAmount = Double.parseDouble(stringValues[2]);

您的 while 循环现在可能如下所示:

double totalAmount = 0.0;
double interestAmount = 0.0;
double durationAmount = 0.0;

while (scan.hasNextLine()) {
    String data = scan.nextLine();
    // Skip blank lines or possible comment lines
    // (lines that start with a semi-colon). 
    if (data.trim().equals("") || data.trim().startsWith(";")) {
        continue;
    } 
    // Create an Array of string values.
    String[] stringValues = data.split(", ");

    // Convert String Array elements to their 
    // respective double type variables.
    totalAmount = Double.parseDouble(stringValues[0]);
    interestAmount = Double.parseDouble(stringValues[1]);
    durationAmount = Double.parseDouble(stringValues[2]);
}
// rest of code here.....

现在问题是你使用那些双重类型的变量,因为你认为适合进行计算。

至于在GUI中显示时间表,我建议使用JTable。创建GUI并添加JTable。现在只需让所有单元格接受String而不是特定的数据类型。要向JTable添加数据行,可以使用如下方法:

private void addRowToJTable(JTable table, Object[] rowData) {
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    model.addRow(rowData);
}

传递给此方法的对象数组将包含表示表的每列的元素。一个简单的用例是:

// Table Columns:  Payment #, Pymt Date, Payment, Interest, Principle, Balance
Object[] rowData = {"1", "Jun 12, 2018", "$112.39", "$40.63", "$71.76", "$6,428.24"};
addRowToJTable(jTable1, rowData);

当然,在构建日程表时,您会在某种循环中使用此代码。如果你想要一个可运行的示例应用程序,我很快就会匆匆演示这些东西,然后给我发一封电子邮件。您的示例数据行可能会产生如下所示的计划:

enter image description here