Anda telah mencipta aplikasi Java yang menambahkan baris baharu pada JTable setiap saat selama 10 saat berturut-turut. Ia terdiri daripada tiga kelas:
Kelas utama yang dipanggil sebaik sahaja program dimulakan
public class JarBundlerProblem { public static void main(String[] args) { System.err.println("Initializing controller"); new Controller(); } }
Pengawal yang mencipta GUI dan mengubahnya melalui 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(); } } } }
Dan akhirnya, 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}); } }
Memandangkan anda sedang membangun untuk OS X, dan anda perlu boleh mengaitkan aplikasi anda dengan jenis fail tertentu (katakan .jarbundlerproblem), anda perlu ikat fail JAR anda ke dalam APP menggunakan Apple Jar Bundler. Anda telah berjaya melakukannya, aplikasi anda dibuka, dikira hingga sepuluh, menulis setiap saat.
Secara lalai, klik dua kali pada .jarbundlerproblem dan mengaitkan fail dengan permohonan anda, tidak akan menghantar fail yang saya klik dua kali sebagai hujah kepada aplikasi. Nampaknya, ini hanyalah Java pada OS X yang berfungsi.
Memandangkan anda perlu dapat melihat fail yang diklik dua kali, anda menggunakan OSXAdapter yang merupakan perpustakaan Java yang dibuat oleh Apple untuk tujuan tersebut. Ini, anda telah melaksanakan dengan mengubah pembina kelas Pengawal anda dan menambah kaedah lain registerForMacOSXEvents():
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(); } }
Tetapi selepas pengubahsuaian (kecil) ini, aplikasi anda mula bertindak. Kadang-kadang, ia tidak dibuka, walaupun anda dapat melihat dalam Konsol bahawa ia baru bermula (Pengawal permulaan ditulis), tetapi selepas beberapa percubaan, ia akhirnya akan bermula, tetapi tetingkap akan kosong sepenuhnya untuk 10 saat pertama , dan selepas itu, 10 baris akan ditambahkan.
Nampaknya anda sedang menyekat urutan penghantaran acara (EDT). SwingWorker akan menjadi pilihan yang lebih baik, tetapi contoh ini melaksanakan Runnable.
Selain itu, contoh ini menunjukkan satu pendekatan untuk menatal automatik JTable. Klik pada ibu jari untuk menangguhkan penatalan; lepaskan untuk menyambung semula.
Tambahan: Permohonan anda ketinggalan selama 10 saat semasa permulaan. Memandangkan ini adalah masa yang tepat untuk Pengawal tidur, ia pasti tidur pada EDT. Sscce akan menjadi dispositif. Sebaliknya, lakukan kerja pada urutan lain dan kemas kini model pada EDT. SwingWorker mempunyai kaedah process() yang melakukannya secara automatik, atau anda boleh menggunakan invokeLater() seperti yang ditunjukkan di bawah. Sehingga aplikasi anda disegerakkan dengan betul, terdapat sedikit harapan untuk membolehkan acara Apple berfungsi.
Tambahan: Anda boleh menggunakan isDispatchThread() dalam Pengawal untuk menyemak. Projek yang dipetik termasuk .dmg dengan aplikasi Mac dan fail semut yang membina berkas in situ melalui sasaran dist2.
Tambahan: Lihat juga pendekatan alternatif yang ditunjukkan di sini.
Atas ialah kandungan terperinci Mengapakah aplikasi Java saya ketinggalan atau ditamatkan apabila menggunakan OSXAdapter untuk mengendalikan persatuan fail .jarbundlerproblem?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!