Rumah > Java > javaTutorial > teks badan

Mengapakah aplikasi Java saya ketinggalan atau ditamatkan apabila menggunakan OSXAdapter untuk mengendalikan persatuan fail .jarbundlerproblem?

Patricia Arquette
Lepaskan: 2024-11-23 00:06:53
asal
751 orang telah melayarinya

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

JAR Bundler menggunakan OSXAdapter menyebabkan aplikasi ketinggalan atau ditamatkan

Anda telah mencipta aplikasi Java yang menambahkan baris baharu pada JTable setiap saat selama 10 saat berturut-turut. Ia terdiri daripada tiga kelas:

  1. Kelas utama yang dipanggil sebaik sahaja program dimulakan

    public class JarBundlerProblem {
     public static void main(String[] args)
     {
         System.err.println("Initializing controller");
         new Controller();
     }
    }
    Salin selepas log masuk
  2. 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();
             }
         }
     }
    }
    Salin selepas log masuk
  3. 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});
     }
    }
    Salin selepas log masuk

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.

Sekarang, untuk masalahnya

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();
    }
}
Salin selepas log masuk

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.

Bantuan

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan