2012-04-11 93 views
1

我有一个Gui允许用户点击一个按钮并查看文本文件的内容。问题是文件可能相当大(超过100,000行数据),并且可能需要15秒钟才能读取并显示在表格中。如何用新信息更新JDialog?

文本文件的格式的例子:

*/ 
    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出现之前,我经历了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 
} 

所以我总的问题很简单: 是否可以告知其目前(在的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 
} 
+2

'如果需要,我可以提供源代码。不确定它是否真的需要,是的,有天空中有星星的选项,哪一个是你的,请用[SSCCE](http://sscce.org/)编辑你的问题 – mKorbel 2012-04-11 20:12:27

+0

@mKorbel我假设有人会请求SSCCE这就是为什么我添加了最后一行。我仍然认为不需要回答是否能够用新信息更新JDialog。但我会把一个简单的程序放在一起,所以有一个SSCCE – WilliamShatner 2012-04-11 20:16:18

+0

由你决定,当然你不能这么做,因为问题描述得很好:-) – mKorbel 2012-04-11 20:20:07

回答

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)//伪代码中创建paginations

的actionPerformed {

create frame - 不是JFrame的re_use现有JDialog,确保更好可能是CardLayout

display label that lets user know its creating table - 没有想到让它成为

read text file - 使用带JProgressBar的SwingWorker来转换数据并将其放到TableModel中,使用批处理更新TableModel f.e.每50rows,寻找paginations JTable的,行的,那么你就只显示所需的数字,而不是10万,这可能是疯狂的:-)

create map and place values - 因为你是存储在TableModel

所有需要的信息可能是无用的

remove label - 没有想到让它成为

update dialog with table - JTable中可以immediatelly从SwinWorker进行更新,Swing GUI的可能是入店所有鼠标或键盘输入,从来没有等待,也没有延迟在10-15sec

}

+0

我明白了你为什么想要一个SSCCE。我想我们误解了对方。我想知道的重要部分是如何在填充表格时添加/删除标签,然后将表格添加到对话框中,而不是在那里等待标签。 (当你发布你的答案时,我正在创建SSCCE) – WilliamShatner 2012-04-11 20:52:36

+0

@WilliamShatner mKorbel是正确的。通过在EDT上创建模型,您不应该在15秒内阻止UI。 SwingWorker的建议非常有效。我甚至不确定如果你在对话框可见之后立即开始在EDT上解码你的模型,你甚至不能保证你的具有标签的'JDialog'总会被绘制。如果你想切换到更动态的东西,那么标签(例如进度条或旋转图标)就需要释放EDT以进行重绘。所以'SwingWorker'是要走的路 – Robin 2012-04-11 20:58:07

+0

@Robin我不是故意暗示mKorbel是不正确的。我只想说我的问题只是询问更新JDialog上显示的信息。 (用户可以在感觉时间过长时关闭它)。 mKorbel回答了很多我肯定会研究和了解的事情。感谢您和mKorbel的建议。我仍然在学习,并不断向那些已经克服了简单编码问题的人学习,比如我每天遇到的问题 – WilliamShatner 2012-04-11 21:04:30

4

JDialogs能够追究他们的内部组件,比如你正在谈论的表。您可以简单地通过使用JDialog's getContentPane方法添加/删除组件(如进度条和标签)来告诉用户您正在做什么,以便通知他们程序正在工作。

另外,纠正我,如果我错了,但repaint()通常是由java.awt包使用的方法,而不是javax.swing ...只有在某些场合。

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

+0

我添加了一个编辑来显示我使用'getContentPane()'方法尝试的内容,但它只显示标签?一旦创建了表格,我是否需要再次设置对话框? – WilliamShatner 2012-04-11 20:51:15

+0

另外,你可能对'repaint()'是正确的,我只是环顾可能使它工作的方法。我也喜欢你的替代解决方案,并会记住,以防万一我必须将它放到这个程度 – WilliamShatner 2012-04-11 20:58:34

+0

'getContentPane()。validate()'应该完成这项工作。它总是有助于查看Java API。因为'getContentPane()'返回一个'Container',所以我查看了这个特定类的API [here](http://docs.oracle.com/javase/6/docs/api/java/awt/Container.html ) – 2012-04-11 21:02:13

2

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

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

+0

我的问题是,它不准备添加JTable。我在我的问题的底部添加了一些代码作为我在做什么的示例 – WilliamShatner 2012-04-11 20:54:51

+0

@WilliamShatner噢对不起,我已经用netbeans gui builder制作了一个java GUI应用程序2周,现在我忘记了还有其他的事情比gui -_- – MarioDS 2012-04-11 21:08:19