Heim  >  Artikel  >  Java  >  Warum verzögert sich meine Java-Anwendung oder wird beendet, wenn ich OSXAdapter zur Verarbeitung von .jarbundlerproblem-Dateizuordnungen verwende?

Warum verzögert sich meine Java-Anwendung oder wird beendet, wenn ich OSXAdapter zur Verarbeitung von .jarbundlerproblem-Dateizuordnungen verwende?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-23 00:06:53773Durchsuche

Why does my Java application lag or terminate when using OSXAdapter to handle .jarbundlerproblem file associations?

JAR Bundler verwendet OSXAdapter, wodurch die Anwendung verzögert oder beendet wird

Sie haben eine Java-Anwendung erstellt, die 10 aufeinanderfolgende Sekunden lang jede Sekunde eine neue Zeile zu einer JTable hinzufügt. Es besteht aus drei Klassen:

  1. Die Hauptklasse, die aufgerufen wird, sobald das Programm gestartet wird

    public class JarBundlerProblem {
     public static void main(String[] args)
     {
         System.err.println("Initializing controller");
         new Controller();
     }
    }
  2. Ein Controller, der die GUI erstellt und ändert es durch doWork()

    public class Controller {
     public Controller()
     {
         doWork(null);
     }
     public static void doWork(String s)
     {
         GUI gui = new GUI();
         
         for (int i=0; i<10; i++)
         {
             gui.addRow("Line " + (i+1));
             try {
                 Thread.sleep(1000);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
     }
    }
  3. Und schließlich das GUI

    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    
    public class GUI {
     private JFrame frame = new JFrame();
     private DefaultTableModel model = new DefaultTableModel();
     private JTable table = new JTable(model);
     private JScrollPane pane = new JScrollPane(table);
     
     public GUI()
     {
         model.addColumn("Name");
         
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.add(pane);
         frame.pack();
         frame.setVisible(true);
     }
     public void addRow(String name)
     {
         model.addRow(new Object[]{name});
     }
    }

Da Sie für OS Bündeln Sie Ihre JAR-Datei mit Apple Jar Bundler in einer APP. Sie haben dies erfolgreich durchgeführt, Ihre Anwendung wird geöffnet, zählt bis zehn und schreibt jede Sekunde etwas aus.

Nun zum Problem

Standardmäßig doppelklicken Sie auf ein .jarbundlerproblem und verknüpfen die Datei mit Ihrer Anwendung wird die Datei, auf die ich doppelgeklickt habe, nicht als Argument an die Anwendung übergeben. Anscheinend funktioniert das nur mit Java unter OS Dies haben Sie implementiert, indem Sie den Konstruktor Ihrer Controller-Klasse geändert und eine weitere Methode registerForMacOSXEvents() hinzugefügt haben:

Aber nach dieser (geringfügigen) Änderung beginnt Ihre Anwendung zu funktionieren. Manchmal wird es nicht geöffnet, obwohl Sie in der Konsole sehen können, dass es gerade erst gestartet wurde (Initialisierung des Controllers steht geschrieben), aber nach ein paar Versuchen startet es schließlich, aber die Fenster bleiben in den ersten 10 Sekunden völlig leer , und danach werden die 10 Zeilen hinzugefügt.
public Controller()
{
    registerForMacOSXEvents();
    //doWork(null);
}
public void registerForMacOSXEvents() {
    try {
        OSXAdapter.setFileHandler(this, getClass().getDeclaredMethod("doWork", new Class[] { String.class }));
    } catch (Exception e) {
        System.err.println("Error while loading the OSXAdapter:");
        e.printStackTrace();
    }
}

Hilfe

Es sieht so aus, als würden Sie den Event-Dispatch-Thread (EDT) blockieren. SwingWorker wäre eine bessere Wahl, aber dieses Beispiel implementiert Runnable.

Nebenbei zeigt dieses Beispiel einen Ansatz zum automatischen Scrollen einer JTable. Klicken Sie auf den Daumen, um das Scrollen anzuhalten; Lassen Sie es los, um fortzufahren.

Nachtrag: Ihre Anwendung verzögert sich beim Start um 10 Sekunden. Da dies genau die Zeit ist, für die der Controller schläft, schläft er sicherlich im EDT. Ein SSCCE wäre dispositiv. Führen Sie die Arbeit stattdessen in einem anderen Thread durch und aktualisieren Sie das Modell im EDT. SwingWorker verfügt über eine Process()-Methode, die dies automatisch erledigt, oder Sie können invokeLater() verwenden, wie unten gezeigt. Bis Ihre Anwendung korrekt synchronisiert ist, besteht wenig Hoffnung, dass Apple-Ereignisse funktionieren.

Nachtrag: Sie können isDispatchThread() im Controller aufrufen, um dies zu überprüfen. Das zitierte Projekt umfasst eine .dmg mit einer Mac-Anwendung und einer Ant-Datei, die das Bundle

in situ

über Ziel dist2 erstellt.Nachtrag: Siehe auch die hier gezeigten alternativen Ansätze.

Das obige ist der detaillierte Inhalt vonWarum verzögert sich meine Java-Anwendung oder wird beendet, wenn ich OSXAdapter zur Verarbeitung von .jarbundlerproblem-Dateizuordnungen verwende?. 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