> Java > java지도 시간 > OSXAdapter를 사용할 때 macOS JAR 애플리케이션이 지연되거나 충돌하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

OSXAdapter를 사용할 때 macOS JAR 애플리케이션이 지연되거나 충돌하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

DDD
풀어 주다: 2024-12-01 01:54:09
원래의
331명이 탐색했습니다.

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. SwingWorker를 사용하거나 실행 가능:

    • SwingWorker는 백그라운드 작업을 수행하고 EDT에서 UI를 업데이트하는 편리한 방법입니다.
    • 또는 사용자 정의 Runnable을 사용하여 필요한 작업을 수행할 수 있습니다. , 코드 조각에 표시된 대로
  2. EDT에서 절전 모드 제거:

    • 컨트롤러가 현재 EDT에서 10초 동안 절전 모드로 유지됩니다. 이로 인해 애플리케이션이 지연될 수 있습니다. 절전 작업을 백그라운드 스레드로 이동하거나 SwingWorker 또는 Runnable을 사용하여 EDT 차단을 방지하세요.

대체 접근 방식:

  1. JAR 피하기 번들러:

    • 참조 프로젝트에 표시된 접근 방식과 같이 macOS용 애플리케이션을 번들링하는 대체 방법을 사용하는 것이 좋습니다.
  2. MVC 아키텍처:

    • MVC 아키텍처를 사용하여 애플리케이션의 모델, 뷰 및 컨트롤러 구성 요소를 분리합니다. 이는 동기화를 개선하고 잠재적인 문제를 해결하는 데 도움이 될 수 있습니다.

부록:

  • isDispatchThread() 메소드 구현 컨트롤러는 EDT가 차단되고 있는지 확인하는 데 도움이 됩니다.
  • 링크된 프로젝트 JAR Bundler 없이 MVC 아키텍처 구현 및 번들 생성의 작업 예제가 포함되어 있습니다.
  • 제공된 코드 조각에 설명된 것과 같이 JTable 자동 스크롤에 대한 다른 접근 방식을 조사해 보세요.

코드 조각:

다음 코드는 Runnable을 사용하는 방법을 보여줍니다. 작업을 수행하고 EDT 차단을 방지하려면:

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();
            }
        });
    }
}
로그인 후 복사

참고: 코드의 강조 표시된 부분은 EventQueue.invokeLater()를 사용하여 EDT에서 GUI를 업데이트하는 방법을 보여줍니다. Runnable을 사용하여 작업을 수행합니다.

위 내용은 OSXAdapter를 사용할 때 macOS JAR 애플리케이션이 지연되거나 충돌하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿