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:
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(); } }
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(); } } } }
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.
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
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!