首頁 > Java > java教程 > 為什麼我的 macOS JAR 應用程式在使用 OSXAdapter 時會出現延遲或崩潰,如何修復它?

為什麼我的 macOS JAR 應用程式在使用 OSXAdapter 時會出現延遲或崩潰,如何修復它?

DDD
發布: 2024-12-01 01:54:09
原創
332 人瀏覽過

Why is my macOS JAR application lagging or crashing when using OSXAdapter, and how can I fix it?

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

使用OSXAdapter 處理與macOS 上的應用程式關聯的雙擊JAR 檔案時,您可能會遇到以下問題:滯後或應用程式終止。這可能是由於阻塞了事件調度執行緒 (EDT)。

解決方案:

要解決此問題,請考慮以下操作:

  1. 使用 S使用 S3wing或Runnable:

    • SwingWorker 是執行後台任務和更新 EDT 上的 UI 的便捷方法。
    • 或者,您可以使用自訂Runnable 來執行所需的操作,如程式碼片段所示
  2. 刪除EDT 上的休眠:

    • 您的控制器目前在EDT 上休眠10 秒。這可能會導致應用程式滯後。將睡眠操作移至後台執行緒或使用 SwingWorker 或 Runnable 以避免阻塞 EDT。

替代方法:

  1. 避免JAR捆綁程序:

    • 避免JARAR>
    考慮使用替代方法來捆綁適用於macOS 的應用程序,例如引用項目中顯示的方法。
  2. MVC架構:
    採用 MVC 架構來分離應用程式的模型、視圖和控制器元件。這有助於改善同步並解決潛在問題。

附錄:
  • 在您的應用程式中實作isDispatchThread() 方法可以協助確定EDEDT被阻止。
  • 連結的專案包括沒有 JAR Bundler 的 MVC 架構實作和套件建立的工作範例。
研究自動滾動 JTable 的其他方法,例如提供的程式碼片段中演示的方法。

程式碼片段:

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TableAddTest extends JPanel implements Runnable {

    private static final int N_ROWS = 8;
    private static String[] header = {"ID", "String", "Number", "Boolean"};
    private DefaultTableModel dtm = new DefaultTableModel(null, header);
    private JTable table = new JTable(dtm);
    private JScrollPane scrollPane = new JScrollPane(table);

    public TableAddTest() {
        this.setLayout(new BorderLayout());
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        this.add(scrollPane, BorderLayout.CENTER);
        JPanel panel = new JPanel();
        panel.add(new JButton(new AbstractAction("Add Row") {

            @Override
            public void actionPerformed(ActionEvent e) {
                EventQueue.invokeLater(TableAddTest.this);
            }
        }));
        this.add(panel, BorderLayout.SOUTH);
    }

    private void addRow() {
        dtm.addRow(new Object[]{
                Character.valueOf('A' + dtm.getRowCount()),
                Character.valueOf('A') + dtm.getRowCount(),
                Integer.valueOf(dtm.getRowCount()),
                Boolean.valueOf(dtm.getRowCount() % 2 == 0)
            });
    }

    @Override
    public void run() {
        addRow();
        table.scrollRectToVisible(table.getCellRect(dtm.getRowCount() - 1, 0, true));
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new TableAddTest());
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
                new Thread(new TableAddTest()).start();
            }
        });
    }
}
登入後複製
以下程式碼示範如何使用Runnable 來執行任務並避免阻塞EDT:

注意: 程式碼的突出顯示部分顯示如何使用EventQueue.invokeLater() 更新 EDT 上的 GUI,同時使用 Runnable 來更新 EDT 上的 GUI。執行任務。

以上是為什麼我的 macOS JAR 應用程式在使用 OSXAdapter 時會出現延遲或崩潰,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板