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?

Warum verzögert sich meine macOS-JAR-Anwendung oder stürzt ab, wenn ich OSXAdapter verwende, und wie kann ich das beheben?

DDD
DDDOriginal
2024-12-01 01:54:09342Durchsuche

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

JAR Bundler, der OSXAdapter verwendet, führt zu Verzögerungen oder Beendigung der Anwendung

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:

  1. Verwenden Sie SwingWorker oder Runnable:

    • SwingWorker ist eine praktische Möglichkeit, Hintergrundaufgaben auszuführen und die Benutzeroberfläche auf dem EDT zu aktualisieren.
    • Alternativ können Sie ein benutzerdefiniertes Runnable verwenden, um die erforderlichen Aktionen auszuführen , wie im Codeausschnitt gezeigt unten.
  2. Entfernen Sie den Ruhezustand auf dem EDT:

    • Ihr Controller schläft derzeit 10 Sekunden lang auf dem EDT. Dies kann zu Verzögerungen bei der Anwendung führen. Verschieben Sie den Schlafvorgang in einen Hintergrundthread oder verwenden Sie einen SwingWorker oder Runnable, um ein Blockieren des EDT zu vermeiden.

Alternative Ansätze:

  1. Vermeiden Sie JAR Bundler:

    • Erwägen Sie die Verwendung einer alternativen Methode zum Bündeln Ihrer Anwendung für macOS, z. B. den im referenzierten Projekt gezeigten Ansatz.
  2. MVC-Architektur:

    • Verwenden Sie die MVC-Architektur, um Modell, Ansicht, und Controller-Komponenten Ihrer Anwendung. Dies kann dazu beitragen, die Synchronisierung zu verbessern und potenzielle Probleme zu lösen.

Nachtrag:

  • Implementierung der isDispatchThread()-Methode in Ihrem Der Controller kann dabei helfen, festzustellen, ob der EDT blockiert wird.
  • Das verknüpfte Projekt enthält ein funktionierendes Beispiel einer MVC-Architekturimplementierung und Bundle-Erstellung ohne JAR-Bundler.
  • Untersuchen Sie andere Ansätze zum automatischen Scrollen einer JTable, wie beispielsweise die im bereitgestellten Code-Snippet demonstrierten.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn