1

我有一个 GUI,它允许用户单击按钮并查看文本文件的内容。问题是文件可能相当大(超过 100,000 行数据)并且可能需要 15 秒以上的时间才能读取并显示在表格中。

文本文件格式示例:

*/
    Account ID     : 8 digit number
    Money Charged  : Integer < $10
    Values separated by \t 

/*


Account Id    Money Charged
----------    --------------
731298        3
359412        5
624937        1

因此,当单击按钮时,它会读取每一行并将每个 id 放入地图并增加帐户费用。

完成后,它将在 JDialog 中放置一个带有信息的 JTable。但是,一旦单击该按钮,用户可能会对程序正在做什么感到困惑,因为我在 JDialog 和 JTable 出现之前经历了超过 10-15 秒的延迟。

那么有没有办法让 JDialog 出现一个字符串,让用户知道它正在创建表?(我认为可以使用其中一种 JDialog 方法来完成,例如repaint()orvalidate但那些似乎并没有奏效。

这是我认为应该完成的顺序:

//Psuedo-code
actionPerformed {
    create frame
    display label that lets user know its creating table
    read text file
    create map and place values
    remove label
    update dialog with table // unsure what to do to update it properly
}

所以我的总体问题很简单: 是否可以通知用户它当前正在计算数据(通过 JDialog 中的 JLabel)并且一旦读取数据,显示 JTable(通过更新 JDialog)?

如果需要,我可以提供来源。不确定它是否真的需要

编辑

public void actionPerformed(ActionEvent event) {
    JFrame frame = new JFrame();
    JDialog dialog = new JDialog(frame, "Account Charges", true);
    JLabel label = new JLabel("Currently calculating the charges")

    dialog.getContentPane().add(label);       //add waiting label
    dialog.setVisible(true);              
    readData(myFile);                         //read file and create table
    dialog.getContentPane().remove(label);    //waiting label no longer needed
    dialog.getContentPane().add(myJtable);    //update dialog with the table
}
4

3 回答 3

5

1)I have a Gui which allows the user to click a button and view the contents of a text file.

  • 使用 CardLayout,如果您确实需要阻止或提供输入掩码以输入/修改/删除已显示或存在的值,我建议您创建另一个容器

2)The issue is that the file can be rather large (100,000+ rows of data) and can take upwards of 15 seconds to read and display in a table.

  • 除了内部修订,我不认识任何人,可能想要检查或处理 100k 行,使用 SwingWorker 将 FileIO 填充到 TableModel,并为 JTable 创建分页

3) //伪代码

动作执行{

create frame- 不是 JFrame re_use existing JDialog,当然更好CardLayout

display label that lets user know its creating table- 不知道让它成为

read text file- 使用带有 JProgressBar 的 SwingWorker,转换数据并将其放入 TableModel,每 50 行使用批处理更新 TableModel fe,查找 JTable 的分页,然后您将只显示所需的行数,而不是 100k,这可能很疯狂:-)

create map and place values- 可能没用,因为您将所有必需的信息存储在 TableModel 中

remove label- 不知道让它成为

update dialog with table- Jtable 可以从 SwinWorker 立即更新,Swing GUI 可以访问所有鼠标或键盘输入,无需等待,也不会延迟 10-15 秒

}

于 2012-04-11T20:38:28.677 回答
4

JDialogs能够在其中容纳组件,例如您正在谈论的桌子。您可以通过添加/删除进度条和标签等组件的方法简单地告诉用户您在做什么JDialog's getContentPane,以便通知他们程序正在运行。

另外,如果我错了,请纠正我,但repaint()通常是java.awt包使用的一种方法,而不是那么多javax.swing……仅在某些情况下。

-- 另一种解决方案 -- 您可以在对话框打开之前告诉用户正在发生的事情。也许在 GUI 或进度条上有一个“当前状态”标签。当文件被完全读取并准备好使用时,您可以打开对话框并快速将值发布到表上。

于 2012-04-11T20:33:16.277 回答
2

使用您的解决方案的最简单方法是label.setVisible(false)在您的操作完成后执行。当然,应该制作您的布局管理器(或其他良好的免费设计),以便当标签变得不可见时其他组件可以正确调整大小/重新定位。通常它应该自动发生。

还有其他方法可以做到,但你会花更多的时间来制作它们。

于 2012-04-11T20:40:14.183 回答