为什么我的 macOS JAR 应用程序在使用 OSXAdapter 时出现延迟或崩溃,如何修复它?
Dec 01, 2024 am 01:54 AM使用 OSXAdapter 的 JAR Bundler 导致应用程序滞后或终止
使用 OSXAdapter 处理与 macOS 上的应用程序关联的双击 JAR 文件时,您可能会遇到以下问题:滞后或应用程序终止。这可能是由于阻塞了事件调度线程 (EDT)。
解决方案:
要解决此问题,请考虑以下操作:
-
使用 SwingWorker 或Runnable:
- SwingWorker 是执行后台任务和更新 EDT 上的 UI 的便捷方法。
- 或者,您可以使用自定义 Runnable 来执行所需的操作,如代码片段所示
-
删除 EDT 上的休眠:
- 您的控制器当前在 EDT 上休眠 10 秒。这可能会导致应用程序滞后。将睡眠操作移至后台线程或使用 SwingWorker 或 Runnable 以避免阻塞 EDT。
替代方法:
-
避免 JAR捆绑程序:
- 考虑使用替代方法来捆绑适用于 macOS 的应用程序,例如引用项目中显示的方法。
-
MVC架构:
- 采用 MVC 架构来分离应用程序的模型、视图和控制器组件。这有助于改善同步并解决潜在问题。
附录:
- 在您的应用程序中实现 isDispatchThread() 方法控制器可以帮助确定 EDT 是否被阻止。
- 链接的项目包括没有 JAR Bundler 的 MVC 架构实现和包创建的工作示例。
- 研究自动滚动 JTable 的其他方法,例如提供的代码片段中演示的方法。
代码片段:
以下代码演示了如何使用 Runnable 来执行任务并避免阻塞 EDT:
import java.awt.EventQueue; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class TableAddTest extends JPanel implements Runnable { private static final int N_ROWS = 8; private static String[] header = {"ID", "String", "Number", "Boolean"}; private DefaultTableModel dtm = new DefaultTableModel(null, header); private JTable table = new JTable(dtm); private JScrollPane scrollPane = new JScrollPane(table); public TableAddTest() { this.setLayout(new BorderLayout()); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); this.add(scrollPane, BorderLayout.CENTER); JPanel panel = new JPanel(); panel.add(new JButton(new AbstractAction("Add Row") { @Override public void actionPerformed(ActionEvent e) { EventQueue.invokeLater(TableAddTest.this); } })); this.add(panel, BorderLayout.SOUTH); } private void addRow() { dtm.addRow(new Object[]{ Character.valueOf('A' + dtm.getRowCount()), Character.valueOf('A') + dtm.getRowCount(), Integer.valueOf(dtm.getRowCount()), Boolean.valueOf(dtm.getRowCount() % 2 == 0) }); } @Override public void run() { addRow(); table.scrollRectToVisible(table.getCellRect(dtm.getRowCount() - 1, 0, true)); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new TableAddTest()); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); new Thread(new TableAddTest()).start(); } }); } }
登录后复制
注意: 代码的突出显示部分显示了如何使用 EventQueue.invokeLater() 更新 EDT 上的 GUI,同时使用 Runnable 来更新 EDT 上的 GUI。执行任务。
以上是为什么我的 macOS JAR 应用程序在使用 OSXAdapter 时出现延迟或崩溃,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前
By 尊渡假赌尊渡假赌尊渡假赌

热门文章
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前
By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

2025年的前4个JavaScript框架:React,Angular,Vue,Svelte

如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案?

如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存?

Spring Boot Snakeyaml 2.0 CVE-2022-1471问题已修复
