10초 동안 매초 JTable에 새 행을 추가하는 Java 애플리케이션을 생성했습니다. 세 가지 클래스로 구성됩니다.
프로그램이 시작되면 호출되는 메인 클래스
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 파일을 APP로 번들링해야 합니다. 이 작업을 성공적으로 수행하면 애플리케이션이 열리고 10까지 계산되며 매초마다 기록됩니다.
기본적으로 .jarbundler 문제를 두 번 클릭하고 파일을 연결합니다. 귀하의 응용 프로그램에서는 두 번 클릭한 파일을 응용 프로그램에 대한 인수로 전달하지 않습니다. 분명히 이것은 OS X에서 Java가 작동하는 것입니다.
어떤 파일이 더블클릭되었는지 확인해야 하므로 이를 위해 Apple에서 만든 Java 라이브러리인 OSXAdapter를 사용하고 있습니다. 이는 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와 대상 dist2를 통해 in situ 번들을 빌드하는 ant 파일이 포함되어 있습니다.
추가: 여기에 표시된 대체 접근 방식도 참조하세요.
위 내용은 .jarbundlerproblem 파일 연결을 처리하기 위해 OSXAdapter를 사용할 때 Java 애플리케이션이 지연되거나 종료되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!