2013-10-24 5 views
1

다른 클래스의 main 메소드를 호출 할 수있는 두 개의 버튼이있는 JFrame을 개발하려고합니다. 첫 번째 시도는 각 버튼의 actionPerformed에 직접 삽입하는 것이 었습니다. 이렇게하면 다른 클래스의 JFrame이 열리지만 제목 만 표시되고 프로그램이 추가로 고정 된 JPanel의 내용은 표시되지 않습니다. 닫는 버튼을 누르거나, 작업 관리자 나 일식으로 가서 죽여야합니다.) 두 번째 시도는 actionPerformed에 메소드 호출을 추가하고이 메소드가 이번에는 다른 클래스의 main 메소드를 호출하지만 동일한 결과 (프로그램 고정)를 추가합니다.JButton을 누를 때 다른 클래스의 Java 실행 메인 메소드

테스트 목적으로 다른 클래스의 main 메서드에 대한 호출을 배치했습니다.이 클래스의 main 메서드는 다른 클래스의 프레임이 JPanel의 모든 내용, 기능 등을 성공적으로 나타냈다는 것을 증명했습니다.

부울이 true로 설정 될 때까지 기다리는 것이 주된 방법으로 무한 루프를 만들 수 있다는 것을 알았지 만 그다지 비싸지 않은 방식으로 작동해야합니다. 그래서 여기 나는 너희들에게이 질문을하고있다.

다음은 두 번째 시도 코드입니다.

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 


    public class Chat { 
    public static void main (String[] args) { 


     JFrame window = new JFrame("Chat Selection"); 

     //Set the default operation when user closes the window (frame) 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     //Set the size of the window 
     window.setSize(600, 400); 
     //Do not allow resizing of the window 
     window.setResizable(false); 
     //Set the position of the window to be in middle of the screen when program is started 
     window.setLocationRelativeTo(null); 

     //Call the setUpWindow method for setting up all the components needed in the window 
     window = setUpWindow(window); 

     //Set the window to be visible 
     window.setVisible(true); 

    } 

    private static JFrame setUpWindow(JFrame window) { 
     //Create an instance of the JPanel object 
     JPanel panel = new JPanel(); 
     //Set the panel's layout manager to null 
     panel.setLayout(null); 

     //Set the bounds of the window 
     panel.setBounds(0, 0, 600, 400); 

     JButton client = new JButton("Run Client"); 
     JButton server = new JButton("Run Server"); 
     JLabel author = new JLabel("By xxx"); 

     client.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       //run client main 
       runClient(); 
      } 
     }); 

     server.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       //run server main 
      } 
     }); 

     panel.add(client); 
     client.setBounds(10,20,250,200); 
     panel.add(server); 
     server.setBounds(270,20,250,200); 
     panel.add(author); 
     author.setBounds(230, 350, 200, 25); 

     window.add(panel); 

     return window; 
    } 

    private static void runClient() { 

     String[] args1={"10"}; 
     ClientMain.main(args1); 
    } 
} 
+0

죄송합니다. 테스트 목적으로 "입증 된이 클래스 기본 메소드에서 곧바로"추가하는 것을 잊었습니다. 바로 수정하여 – Adrian

+0

메인 스레드를 차단하고 UI를 정지시킵니다. 스레딩을 사용하십시오. – Reji

답변

1

당신이 겪고있는 문제는 자바 스윙은 단일 스레드 것입니다. 하지만 다른 클래스의 주요 기능을 실행하고있을 때는 GUI가 돌아올 때까지 계속 실행되지 않습니다. 두 번째 기본 메서드를 호출하는 새 스레드를 시작하십시오.

private static void runClient() { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      String[] args1={"10"}; 
      ClientMain.main(args1); 
     } 
    }); 
} 

편집 : @ Radiodef의 제안에 따라 업데이트됩니다. 이 두 번째 클래스가 GUI에 표시해야한다고했을 때 맨 위에 표시되지 않았습니다. 확실히 invokeLater와 함께 가고 싶습니다.

+0

OP는 여전히 invokeLater를 사용하여 GUI를 생성해야합니다. 그들이 단지 이것을한다면 여전히 잘못하고있다. – Radiodef

+0

나에게 무서운 것은 이것이 선택된 대답이다. OP는 자바 프로그래밍에 대해 아무것도 배우지 않았고,하지 말아야 할 일을하는 쓰레드를 만드는 법만 배웠다. 제 짐작은 당신이 그 사실을 알고 있다는 것입니다. 그렇다면 좋은 직장이 될 것입니다. – Radiodef

+0

@ 라디 노드 (Radiodef), 그의 질문에 직접적으로 답변하기 위해 뭔가 대답하고 있습니다. 그리고 주된 방법을 부르는 것에는 정말로 잘못된 것이 없습니다. 그는 일반적으로 2 개의 애플리케이션의 주요 클래스 인 2 개의 클래스를 가질 수 있으며 이는 테스트 하네스 일뿐입니다. 또한 invokeLater는 주로 GUI를 수정하기위한 것입니다. GUI를 건드릴 필요가 없다면, 나는 그가 의심 스럽다. 그러면 자기 스레드를 시작하는 것이 좋다. 이것은 매우 잘 설명합니다 : http://www.ntu.edu.sg/home/ehchua/programming/java/J5e_multithreading.html ... 그 페이지는 또한 좋은 점을 가져옵니다. 루프가 있다면 "sleep"이 필요할 수도 있습니다. – sdanzig

2

응용 프로그램 당 하나의 기본 방법 만 허용됩니다. 솔직히 다른 클래스의 main을 호출 할 때 수행하려고하거나 생각한 것이 무엇인지 확신 할 수 없습니다. 다른 클래스에서 main을 호출 할 때는 main이라는 메소드를 호출하고 arg를 전달합니다. 제대로 스윙을 사용하지 않기 때문에 귀하의 동결은 아마도 :

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html