【问题标题】:Swing app crashes if minimised如果最小化,Swing 应用程序会崩溃
【发布时间】:2016-07-21 08:43:53
【问题描述】:

我的 Swing 应用程序有问题。

我有一个SwingWorker,其中有一个 for 循环,它启动 300 多个 oracle 数据库请求并用结果填充几个JTables。

如果我保持 Swing 应用程序窗口未最小化,或者至少在 Windows 资源管理器中部分可见,则批处理可以正常完成。现在,如果我将应用程序最小化,然后返回到 swing 应用程序,它将被冻结。

组件的基本轮廓和颜色将可见,大部分窗口将只是我为其设置的背景颜色(黑色),并且不会显示任何文本。杀死应用程序的唯一方法是终止进程,因为我单击“X”按钮不会关闭窗口。

这是一个常见问题吗?如何预防?

在批处理工作者内部循环:

for(int i=1; i<=maxDepth; i++){
    String[] result = getAllLists(database, i);
    for(int j=0; j<result.length; j++){
        String period=result[j];
        for(String name : names){
            System.out.println("New Query: "+name+ " " + period + " | " + "Loading " + (days) + " days x " + years + " years --- ");
            if(isValid(period,name)){
                List<TickHistory> queryResult = model.getByDaysMultiple(name,period,days+mod+daysHeadroom,years, false);
                getModelTableData(name, period, DatabaseHelpers.dateToString(lastCob), years,days,queryResult);
                populatePricesTable(queryResult, days, false);
                view.setNameText(name);
                view.setPeriodText(period);
            }else{
                System.out.println("query invalid");
            }
        }
    }
}

【问题讨论】:

  • 你能给我们看一些代码吗?可能你错过了SwingUtilities.invokeLater()。使用 jvisualvm 检查应用程序也会有所帮助。
  • 有什么例外吗?你使用publish & process 正确吗?
  • @TamasRev 我在创建主框架、控制器和用于连接数据库的对象的主进程中使用invokelater
  • @CatalinaIsland 我将检查异常,当我将所有控制台输出重定向到 GUI 文本框时,我看不到它们。我没有在我的代码中使用发布和处理。

标签: java swing swingworker


【解决方案1】:

我不会在代码中的任何地方使用publishprocess

这可能是问题的根源。 SwingWorker 依赖于在doInBackground() 中调用publish() 并使用process() 来更新事件调度线程上的TableModel。一个完整的例子检查here

【讨论】:

  • 我将批处理工作程序内部的循环添加到问题中。您可以看到方法 getByDaysMultiple 从 db 中提取数据,然后是 getModelTableData 触发另外几个请求,然后是 populatePricesTable 填充 JTable,以及下面的一些视图方法。这是我的第一个 Swing 应用程序,因此感谢您的解释。
  • 您不得从doInBackground() 更新TableModel。您必须将代码重构为publish() 中间结果,如turorial cited 所示。如果您有问题,请根据example cited 编辑您的问题以包含minimal reproducible example,以显示您的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多