Java 如何用新信息更新JDialog?

Java 如何用新信息更新JDialog?,java,swing,repaint,jdialog,Java,Swing,Repaint,Jdialog,我有一个Gui,它允许用户单击按钮并查看文本文件的内容。问题在于,该文件可能相当大,包含100000多行数据,在表中读取和显示可能需要15秒以上的时间 文本文件的格式示例如下: */ Account ID : 8 digit number Money Charged : Integer < $10 Values separated by \t /* Account Id Money Charged ---------- --------

我有一个Gui,它允许用户单击按钮并查看文本文件的内容。问题在于,该文件可能相当大,包含100000多行数据,在表中读取和显示可能需要15秒以上的时间

文本文件的格式示例如下:

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

/*


Account Id    Money Charged
----------    --------------
731298        3
359412        5
624937        1
所以我的问题很简单: 是否可以通知用户当前正在通过JDialog中的JLabel计算数据,并在读取数据后,通过更新JDialog显示JTable

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

编辑

JDialogs能够在其中保存组件,比如您正在谈论的表。通过使用JDialog的getContentPane方法添加/删除进度条和标签等组件,您可以简单地告诉用户您正在做什么,以便通知他们程序正在工作

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

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

JDialogs能够在其中保存组件,例如您正在谈论的表。通过使用JDialog的getContentPane方法添加/删除进度条和标签等组件,您可以简单地告诉用户您正在做什么,以便通知他们程序正在工作

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

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

1我有一个Gui,允许用户单击按钮并查看文本文件的内容

使用CardLayout,如果您确实需要为已经显示或存在的值的输入/修改/删除阻止或提供输入掩码,我建议您创建另一个容器 2问题是,文件可能相当大,包含100000多行数据,读取和显示在表中可能需要15秒以上的时间

除了内部版本之外,我不认识任何人,他们可能想要检查或处理100k行,使用SwingWorker将FileIO填充到TableModel,并为JTable创建分页 3//Psuedo代码

执行的操作{

创建框架-而不是JFrame重新使用现有的JDialog,确保更好的是CardLayout

显示标签,让用户知道它的创建表-不知道让它

读取文本文件-使用SwingWorker和JProgressBar转换数据并将其放入TableModel,使用batch更新TableModel f.e.每50行,查找JTable的分页,然后只显示所需的行数,而不是100k,这可能很疯狂:-

创建地图和地点值-可能没有用,因为您正在TableModel中存储所有必需的信息

移除标签-不知道让它去吧

带有表格的更新对话框-Jtable可以从SwinWorker立即更新,Swing GUI可以访问所有鼠标或键盘输入,从不等待,也不会延迟10-15秒

}

1我有一个Gui,允许用户单击按钮并查看文本文件的内容

使用CardLayout,如果您确实需要为已经显示或存在的值的输入/修改/删除阻止或提供输入掩码,我建议您创建另一个容器 2问题是,文件可能相当大,包含100000多行数据,读取和显示在表中可能需要15秒以上的时间

除了内部版本之外,我不认识任何人,他们可能想要检查或处理100k行,使用SwingWorker将FileIO填充到TableModel,并为JTable创建分页 3//Psuedo代码

执行的操作{

创建框架-而不是JFrame重新使用现有的JDialog,确保更好的是CardLayout

显示标签,让用户知道它的创建表-不知道让它

读取文本文件-使用SwingWorker和JProgressBar转换数据并将其放入TableModel,使用batch更新TableModel f.e.每50行,查找JTable的分页,然后只显示所需的行数,而不是100k,这可能很疯狂:-

创建地图和地点值-可能没有用,因为您正在TableModel中存储所有必需的信息

移除标签-不知道让它去吧

带有表的更新对话框-可从SwingGUI公司的SwinWorker立即更新Jtable uld可接受所有鼠标或键盘输入,从不等待,也不会延迟10-15秒


}

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


还有其他方法,但您需要花费更多的时间来完成这些操作。

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



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

如果需要,我可以提供源代码。不确定它是否真的需要,是的,确切地说,有一些选项,比如天空中的星星,哪一个是你的,请用@mKorbel编辑你的问题,我想有人会要求SSCCE,这就是我添加最后一行的原因。我仍然不认为有必要回答是否能够用新信息更新JDialog。但我会把一个简单的程序放在一起,这样你们就有了一个SSCCE,当然你们不能这么做,因为这个问题描述得很好:-看看@Devon_C_Miller,我觉得进度条对于我想要做的事情来说有点太花哨了。我只是想显示一个字符串/标签。原因是,有时创建和加载表格需要100毫秒而不是15秒以上,如果需要,我可以提供源代码。不确定它是否真的需要,是的,确切地说,有一些选项,比如天空中的星星,哪一个是你的,请用@mKorbel编辑你的问题,我想有人会要求SSCCE,这就是我添加最后一行的原因。我仍然不认为有必要回答是否能够用新信息更新JDialog。但我会把一个简单的程序放在一起,这样你们就有了一个SSCCE,当然你们不能这么做,因为这个问题描述得很好:-看看@Devon_C_Miller,我觉得进度条对于我想要做的事情来说有点太花哨了。我只是想显示一个字符串/标签。原因是,有时创建和加载表格需要100毫秒而不是15秒以上。我添加了一个编辑来显示我使用getContentPane方法尝试的内容,但它只显示标签?我是否需要在创建表后再次将对话框设置为可见?另外,关于重新绘制,您可能是正确的。我只是在四处看看使其工作的方法。我也喜欢您的替代解决方案,并将记住它,以防我必须将它带到extentgetContentPane.validate来完成这项工作。查看JavaAPI总是有帮助的。因为getContentPane返回一个容器,所以在尝试了几次之后,我查看了该特定类的API,但无法使其自动更新。我想我可能必须按照mKorbel的建议在线程中完成它,RobinI添加了一个编辑来显示我使用getContentPane方法尝试的内容,但它只显示标签?我是否需要在创建表后再次将对话框设置为可见?另外,关于重新绘制,您可能是正确的。我只是在四处看看使其工作的方法。我也喜欢您的替代解决方案,并将记住它,以防我必须将它带到extentgetContentPane.validate来完成这项工作。查看JavaAPI总是有帮助的。因为getContentPane返回一个容器,所以在尝试了几次之后,我查看了该特定类的API,但无法使其自动更新。我想我可能不得不按照mKorbel和RobinI的建议在一个线程中完成,看看你为什么现在想要一个SSCCE。我想我们彼此误解了。我想知道的重要部分是如何在填充表时添加/删除标签,然后将表添加到对话框中,而不是等待标签。我正在创建SSCCE的过程中,你发布了你的answer@WilliamShatner然而,mKorbel是正确的。您不应该通过在EDT上创建模型来阻塞UI 15秒。荡秋千的人的建议很有道理。我甚至不确定,如果您在打开对话框后立即开始在EDT上解码您的模型,您是否可以保证始终绘制带有标签的JDialog。如果你想切换到更动态的东西,那么标签上会显示一个进度条或旋转图标,你需要释放EDT进行重新绘制。所以SwingWorker是解决问题的方法go@Robin我无意暗示mKorbel一点也不正确。我只是想说明,我的问题只是询问如何更新JDialog上显示的信息。如果用户觉得花费的时间太长,可以随时关闭它。mKorbel回答了不少问题
这是我一定会研究和了解的。谢谢你和mKorbel的建议。我仍在学习,并不断地向那些已经克服了简单编码问题的人学习,比如我每天遇到的那些问题。在阅读了SwingWorker之后,我相信你们两个是对的。我将不得不在一个线程中这样做,以确保它的更新没有任何问题。谢谢你们两位的建议@安德烈霍姆普森,当我读到更多罗宾的话时,我把它删掉了。我的想法是错误的,我相信在看了更多的文章后需要一条线索examples@WilliamShatner凉的希望你一切顺利如果您在实施过程中遇到任何问题,请回答我们一个新问题。我明白您为什么现在需要SSCCE。我想我们彼此误解了。我想知道的重要部分是如何在填充表时添加/删除标签,然后将表添加到对话框中,而不是等待标签。我正在创建SSCCE的过程中,你发布了你的answer@WilliamShatner然而,mKorbel是正确的。您不应该通过在EDT上创建模型来阻塞UI 15秒。荡秋千的人的建议很有道理。我甚至不确定,如果您在打开对话框后立即开始在EDT上解码您的模型,您是否可以保证始终绘制带有标签的JDialog。如果你想切换到更动态的东西,那么标签上会显示一个进度条或旋转图标,你需要释放EDT进行重新绘制。所以SwingWorker是解决问题的方法go@Robin我无意暗示mKorbel一点也不正确。我只是想说明,我的问题只是询问如何更新JDialog上显示的信息。如果用户觉得花费的时间太长,可以随时关闭它。mKorbel回答了很多问题,我一定会研究和了解这些问题。谢谢你和mKorbel的建议。我仍在学习,并不断地向那些已经克服了简单编码问题的人学习,比如我每天遇到的那些问题。在阅读了SwingWorker之后,我相信你们两个是对的。我将不得不在一个线程中这样做,以确保它的更新没有任何问题。谢谢你们两位的建议@安德烈霍姆普森,当我读到更多罗宾的话时,我把它删掉了。我的想法是错误的,我相信在看了更多的文章后需要一条线索examples@WilliamShatner凉的希望你一切顺利如果您在实现它时遇到任何问题,请返回给我们一个新问题。我的问题是,它在准备就绪时没有添加JTable。我在问题的底部添加了一些代码,作为我的示例doing@WilliamShatner哦,是的,很抱歉,我已经用netbeans GUI builder制作了一个java GUI应用程序两周了,我忘记了GUI还有其他东西——我的问题是它在准备好后没有添加JTable。我在问题的底部添加了一些代码,作为我的示例doing@WilliamShatner哦,是的,对不起,我已经用netbeans GUI builder制作了一个java GUI应用程序两周了,我忘了GUI还有其他东西-_-
//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
}
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
}