Maison > Java > javaDidacticiel > Pourquoi mon application macOS JAR est-elle en retard ou plante-t-elle lors de l'utilisation d'OSXAdapter, et comment puis-je y remédier ?

Pourquoi mon application macOS JAR est-elle en retard ou plante-t-elle lors de l'utilisation d'OSXAdapter, et comment puis-je y remédier ?

DDD
Libérer: 2024-12-01 01:54:09
original
333 Les gens l'ont consulté

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

JAR Bundler utilisant OSXAdapter provoquant un retard ou une fermeture de l'application

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 :

  1. Utilisez SwingWorker ou Runnable :

    • SwingWorker est un moyen pratique d'effectuer des tâches en arrière-plan et de mettre à jour l'interface utilisateur sur l'EDT.
    • Vous pouvez également utiliser un Runnable personnalisé pour effectuer les actions requises. , comme indiqué dans l'extrait de code ci-dessous.
  2. Supprimez la veille sur l'EDT :

    • Votre contrôleur dort actuellement sur l'EDT pendant 10 secondes. Cela peut entraîner un retard de l'application. Déplacez l'opération de mise en veille vers un thread d'arrière-plan ou utilisez un SwingWorker ou Runnable pour éviter de bloquer l'EDT.

Approches alternatives :

  1. Éviter les JAR Bundler :

    • Envisagez d'utiliser une méthode alternative pour regrouper votre application pour macOS, comme l'approche présentée dans le projet référencé.
  2. Architecture MVC :

    • Utiliser l'architecture MVC pour séparer le modèle, la vue, et les composants du contrôleur de votre application. Cela peut aider à améliorer la synchronisation et à résoudre les problèmes potentiels.

Addendum :

  • Implémentation de la méthode isDispatchThread() dans votre Le contrôleur peut aider à déterminer si l'EDT est bloqué.
  • Le projet lié comprend un exemple fonctionnel d'implémentation d'une architecture MVC et création de bundles sans JAR Bundler.
  • Étudiez d'autres approches de défilement automatique d'une JTable, telles que celles démontrées dans l'extrait de code fourni.

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();
            }
        });
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal