Heim >Java >javaLernprogramm >Warum verzögert sich meine macOS-JAR-Anwendung oder stürzt ab, wenn ich OSXAdapter verwende, und wie kann ich das beheben?
Wenn Sie OSXAdapter zum Verarbeiten von Doppelklick-JAR-Dateien verwenden, die mit Ihrer Anwendung unter macOS verknüpft sind, können Probleme auftreten Verzögerungen auftreten oder die Anwendung beendet wird. Dies könnte an der Blockierung des Event-Dispatch-Threads (EDT) liegen.
Lösung:
Um dieses Problem zu beheben, beachten Sie Folgendes:
Verwenden Sie SwingWorker oder Runnable:
Entfernen Sie den Ruhezustand auf dem EDT:
Alternative Ansätze:
Vermeiden Sie JAR Bundler:
MVC-Architektur:
Nachtrag:
Code-Snippet:
Der folgende Code zeigt, wie Sie ein Runnable verwenden, um die Aufgabe auszuführen und das Blockieren zu vermeiden 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(); } }); } }
Hinweis: Die hervorgehobenen Teile des Codes zeigen, wie EventQueue.invokeLater() verwendet wird, um die GUI auf dem EDT zu aktualisieren, während ein Runnable zum Ausführen der Aufgabe verwendet wird.
Das obige ist der detaillierte Inhalt vonWarum verzögert sich meine macOS-JAR-Anwendung oder stürzt ab, wenn ich OSXAdapter verwende, und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!