我有一个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放入地图中并增加帐户的费用。
完成后,它会将一个JTable放在JDialog中并附上信息。然而,一旦点击按钮,用户可能会对程序正在做什么感到困惑,因为我在JDialog&amp;之前经历了超过10-15秒的延迟。 JTable出现了。
那么有没有办法让JDialog显示一个字符串,让用户知道它正在创建表? (我认为可以使用其中一种JDialog方法完成,例如repaint()
或validate
,但这些方法似乎没有。
以下是我认为应该完成的顺序:
//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
}
答案 0 :(得分:5)
1)I have a Gui which allows the user to click a button and view the contents of a text file.
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.
3)// Psuedo-code
actionPerformed {
create frame
- 不是JFrame重新使用现有JDialog
,确定更好CardLayout
display label that lets user know its creating table
- 不知道是不是
read text file
- 使用SwingWorker和JProgressBar,转换数据并将其放到TableModel中,使用批处理来更新TableModel f.e.每50个,寻找JTable的分页,然后你只显示所需的行数,而不是100k,这可能是疯狂的: - )
create map and place values
- 可能没用,因为你在TableModel中存储了所有必需的信息
remove label
- 不知道是不是
update dialog with table
- Jtable可以立即从SwinWorker更新,Swing GUI可以访问所有鼠标或KeyBoards输入,永不等待,也不会在10-15秒延迟
}
答案 1 :(得分:4)
JDialogs
能够在其中保存组件,例如您正在谈论的表。您可以使用JDialog's getContentPane
方法添加/删除进度条和标签等组件,告诉用户您正在做什么,以便通知他们程序正在运行。
另外,如果我错了,请更正我,但repaint()
通常是java.awt
个套餐使用的方法,而不是javax.swing
...仅在某些情况下。< / p>
- 另一种解决方案 - 在对话框打开之前,您可以告诉用户发生了什么。也许在GUI或进度条上有一个“当前状态”标签。当文件被完全读取并准备好使用时,您可以打开对话框并快速在表格上发布值。
答案 2 :(得分:2)
使用解决方案的最简单方法是在操作完成后执行label.setVisible(false)
。当然,您的布局管理员(或其他良好的自由设计)应该制作成当标签变得不可见时其他组件正确调整大小/重新定位。通常它应该自动发生。
还有其他方法可以做到,但你会花更多的时间来制作它们。