您創建了一個Java 應用程序,該應用程式每秒向JTable 添加一個新行,持續10 秒。它由三個類別組成:
程式啟動後呼叫的主類別
public class JarBundlerProblem { public static void main(String[] args) { System.err.println("Initializing controller"); new Controller(); } }
建立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(); } } } }
並且最後,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中文網其他相關文章!