OSXAdapter를 사용하여 macOS에서 애플리케이션과 연결된 JAR 파일 두 번 클릭을 처리하는 경우 다음과 같은 문제가 발생할 수 있습니다. 지연 또는 응용 프로그램이 종료됩니다. 이는 EDT(이벤트 디스패치 스레드) 차단으로 인해 발생할 수 있습니다.
해결책:
이 문제를 해결하려면 다음을 고려하십시오.
SwingWorker를 사용하거나 실행 가능:
EDT에서 절전 모드 제거:
대체 접근 방식:
JAR 피하기 번들러:
MVC 아키텍처:
부록:
코드 조각:
다음 코드는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!