如何使用新信息更新JDialog?

时间:2012-04-11 20:06:40

标签: java swing repaint jdialog

我有一个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
}

3 个答案:

答案 0 :(得分:5)

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

  • 使用CardLayout,如果你真的需要阻止或提供输入掩码来输入/修改/删除已经显示或存在的值,我建议创建另一个Container

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)// 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)。当然,您的布局管理员(或其他良好的自由设计)应该制作成当标签变得不可见时其他组件正确调整大小/重新定位。通常它应该自动发生。

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