首頁 >Java >java教程 >使用 OSXAdapter 處理 .jarbundlerproblem 檔案關聯時,為什麼我的 Java 應用程式會延遲或終止?

使用 OSXAdapter 處理 .jarbundlerproblem 檔案關聯時,為什麼我的 Java 應用程式會延遲或終止?

Patricia Arquette
Patricia Arquette原創
2024-11-23 00:06:53868瀏覽

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

使用OSXAdapter 的JAR Bundler 導致應用程式延遲或終止

您創建了一個Java 應用程序,該應用程式每秒向JTable 添加一個新行,持續10 秒。它由三個類別組成:

  1. 程式啟動後呼叫的主類別

    public class JarBundlerProblem {
     public static void main(String[] args)
     {
         System.err.println("Initializing controller");
         new Controller();
     }
    }
  2. 建立GUI 的控制器並透過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. 並且最後,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});
     }
    }

由於您正在為OS X 進行開發,並且您需要能夠將您的應用程式與某種檔案類型關聯起來(比方說.jarbundlerproblem),您必須使用Apple Jar Bundler 將JAR 檔案捆綁到應用程式中。您已成功完成此操作,您的應用程式打開,數到十,每秒寫出。

現在,針對問題

預設情況下,雙擊 .jarbundler 問題,然後關聯該文件對於您的應用程序,不會將我雙擊的文件作為參數傳遞給應用程式。顯然,這只是 OS X 上的 Java 工作。

由於您需要能夠查看雙擊的文件,因此您使用 OSXAdapter,這是 Apple 為此目的而製作的 Java 庫。您已經透過更改Controller 類別的建構子並添加了另一個方法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();
    }
}

來實現這一點,但是經過此(較小的)修改後,您的應用程式開始運行。有時,它無法打開,即使您可以在控制台中看到它剛剛啟動(已寫入初始化控制器),但經過幾次嘗試後,它最終會啟動,但視窗在前10 秒內將完全空白,之後將會新增10 行。

幫助

看起來您正在阻塞事件調度執行緒 (EDT)。 SwingWorker 會是更好的選擇,但這個範例實現了 Runnable。

順便說一句,這個範例展示了一種自動捲動 JTable 的方法。點擊拇指可暫停滾動;釋放以恢復。

附錄:您的應用程式在啟動時滯後 10 秒。由於這是控制器休眠的確切時間,因此它肯定在 EDT 上休眠。 sscce 將具有決定性作用。相反,在另一個執行緒上完成工作並在 EDT 上更新模型。 SwingWorker 有一個 process() 方法可以自動執行此操作,或者您可以使用 invokeLater() ,如下所示。在您的應用程式正確同步之前,讓 Apple 事件正常工作的希望很小。

附錄:您可以在控制器中呼叫 isDispatchThread() 進行檢查。引用的項目包括一個帶有 Mac 應用程式的 .dmg 和一個 ant 文件,該文件透過目標 dist2 原位建立捆綁包。

附錄:另請參閱此處顯示的替代方法。

以上是使用 OSXAdapter 處理 .jarbundlerproblem 檔案關聯時,為什麼我的 Java 應用程式會延遲或終止?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn