首页 > Java > java教程 > 为什么我的 macOS JAR 应用程序在使用 OSXAdapter 时出现延迟或崩溃,如何修复它?

为什么我的 macOS JAR 应用程序在使用 OSXAdapter 时出现延迟或崩溃,如何修复它?

DDD
发布: 2024-12-01 01:54:09
原创
332 人浏览过

Why is my macOS JAR application lagging or crashing when using OSXAdapter, and how can I fix it?

使用 OSXAdapter 的 JAR Bundler 导致应用程序滞后或终止

使用 OSXAdapter 处理与 macOS 上的应用程序关联的双击 JAR 文件时,您可能会遇到以下问题:滞后或应用程序终止。这可能是由于阻塞了事件调度线程 (EDT)。

解决方案:

要解决此问题,请考虑以下操作:

  1. 使用 SwingWorker 或Runnable:

    • SwingWorker 是执行后台任务和更新 EDT 上的 UI 的便捷方法。
    • 或者,您可以使用自定义 Runnable 来执行所需的操作,如代码片段所示
  2. 删除 EDT 上的休眠:

    • 您的控制器当前在 EDT 上休眠 10 秒。这可能会导致应用程序滞后。将睡眠操作移至后台线程或使用 SwingWorker 或 Runnable 以避免阻塞 EDT。

替代方法:

  1. 避免 JAR捆绑程序:

    • 考虑使用替代方法来捆绑适用于 macOS 的应用程序,例如引用项目中显示的方法。
  2. 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板