Lorsque vous utilisez OSXAdapter pour gérer le double-clic sur les fichiers JAR associés à votre application sur macOS, vous pouvez rencontrer des problèmes avec décalage ou l'application se termine. Cela pourrait être dû au blocage du fil de répartition d'événements (EDT).
Solution :
Pour résoudre ce problème, considérez ce qui suit :
Utilisez SwingWorker ou Runnable :
Supprimez la veille sur l'EDT :
Approches alternatives :
Éviter les JAR Bundler :
Architecture MVC :
Addendum :
Extrait de code :
Le code suivant montre comment utiliser un Runnable pour effectuer la tâche et éviter de bloquer le 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(); } }); } }
Remarque : Les parties en surbrillance du code montrent comment utiliser EventQueue.invokeLater() pour mettre à jour l'interface graphique sur l'EDT tout en utilisant un Runnable pour effectuer la tâche.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!