使用 OSXAdapter 处理与 macOS 上的应用程序关联的双击 JAR 文件时,您可能会遇到以下问题:滞后或应用程序终止。这可能是由于阻塞了事件调度线程 (EDT)。
解决方案:
要解决此问题,请考虑以下操作:
使用 SwingWorker 或Runnable:
删除 EDT 上的休眠:
替代方法:
避免 JAR捆绑程序:
MVC架构:
附录:
代码片段:
以下代码演示了如何使用 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中文网其他相关文章!