如何使用新信息更新JDialog?

Wil*_*ner 1 java swing jdialog repaint

我有一个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
Run Code Online (Sandbox Code Playgroud)

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

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

那么有没有办法让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
}
Run Code Online (Sandbox Code Playgroud)

所以我的整体问题很简单: 是否可以告知用户它当前正在计算数据(通过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
}
Run Code Online (Sandbox Code Playgroud)

mKo*_*bel 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中,每50周使用批处理更新TableModel fe,查找JTable的分页,然后你只显示所需的行数,而不是100k,这可能是疯狂的:-)

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

remove label - 不知道是不是

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

}