1

별도의 ActionListener 클래스에서 액션 리스너를 구현하는 방법을 모르겠습니다. 나는 몇 가지 수업으로 나누어 신청했다. Main 클래스는 Frame 클래스를 호출하여 모든 버튼이있는 GUI를 만듭니다. 이제 버튼을 누르면 작업을 수행 할 수 있도록 ActionListener 메소드에 데이터를 보내야합니다. 프레임 클래스에서 ActionListener를 추가하면 필요한 데이터를 전송할 수 없으므로 main() 메서드에서 ActionListener를 추가하면 Frame 클래스를 호출 한 후 서투른 느낌이 들게됩니다. 다음은 코드입니다 : 공용 클래스 홈페이지 {ActionListener implementetion

public static Client klijent; 

public static void main(String[] args) { 

    FrameBuilder frame= new FrameBuilder(); 
    frame.frameBuild(); 
    frame.send.addActionListener(new SendBttnListener(ClientBuilder(klijent,frame.txt.getText()))); 

    try { 
     frame.statLabel.setText(InetAddress.getLocalHost().getHostAddress()); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } 

    Udp udp; 
    // klijent = null; 

    while(true){ 
     klijent=new Client(); 
     udp=new Udp(); 

     klijent=udp.packageIN(); 
     if(klijent!=null){ 
      frame.statLabel.setText(""); 
      String str=new String(klijent.getBajt(),0,klijent.bajt.length); 
      str=str.trim(); 
      frame.statLabel.setText(str+"@[email protected]"+klijent.clientAddress.toString()+":"+klijent.clientPort+"-->Duljina:"+klijent.bajt.length); 
     } 
    } 
} 

public static Client ClientBuilder(Client klijent2, String str){ 

    klijent.setBajt(str.getBytes()); 

    return klijent2; 
} 

u는 클라이언트 오브젝트가 많은 (UDP 서버)를 변경할 수 있습니다 및 다음의 패키지를 기다리는 경우 삭제됩니다 볼 수 있듯이. 나중에 클라이언트의 일부 목록을 구현하고 프레임 클래스에서 Action 수신기를 추가하는 것이 어리석은 것으로 보입니다. 내가 GUI를 만들기 위해 separet 클래스를 만들 때 잘못 되었나요? 어떤 충고? 당신이 보낼 수있는 방법은 그것의 자신의 구현에 싸서해야

답변

3

사전에

감사합니다 .... 이것은 싱글 톤 구현이거나 랩핑 액션 리스너에 대한 참조로 전달 될 수 있습니다.

버튼 동작 리스너는 버튼 컨텍스트 내에서만 조작해야하며 발신자가 버튼 컨텍스트 외부에서 액세스 할 수 없어야합니다 (예 : frame.send.addActionListener(...)) 보내 요청이 어떻게 달성되는지 신경 쓰지 마라. ...

메시지를 "전송"할 수있는 방법을 제공 한 프레임에 전달할 수있는 클래스 나 인터페이스가 있어야한다. 프레임에서

public interface Sender { 
    public void sendMessage(String message); // Or what ever parameter you want... 
} 
나는 당신의 프레임에 구현의 참조를 전달 것

...

Sender sender = new ImplementationOfSender(); 
frame.setSender(sender); // It could also be passed to the constructor 

, 나는 버튼에 내 액션 청취자를 첨부 할 것이며, 트리거 될 때, 나는 액세스 할 송신자와 메시지를 보낼 ...

send.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     Sender sender = getSender(); 
     if (sender != null) { 
      sender.sendMessage(...); 
     } 
    } 
}); 

이제 ... 모두 ... 당신의 프로그램이 진짜 빨리 당신의 얼굴에 날려가는 것을 한

이것은 트랙이 프로그램을 멈추게하여 UI가 매달아 보이는 것처럼 보이게 만듭니다.

while(true){ 
    klijent=new Client(); 
    udp=new Udp(); 

    klijent=udp.packageIN(); 
    if(klijent!=null){ 
     frame.statLabel.setText(""); 
     String str=new String(klijent.getBajt(),0,klijent.bajt.length); 
     str=str.trim(); 
     frame.statLabel.setText(str+"@[email protected]"+klijent.clientAddress.toString()+":"+klijent.clientPort+"-->Duljina:"+klijent.bajt.length); 
    } 
} 

UI와의 모든 상호 작용은 Event Dispatching Thread (AKA EDT)의 컨텍스트 내에서 이루어져야합니다. 루프와 같은 차단 작업은 EDT의 컨텍스트 내에서 절대로 실행해서는 안됩니다

나는 Concurrency in Swing을 읽었을 것입니다.

당신이 프로그램을 만들었던 유일한 이유는 당신이 프로그램을 시작할 때 EDT에 UI 생성을 동기화하지 않았다는 것입니다. 당신은 Swing Single Threading Rule

+0

TNX의 읽기를하는 것 같아서

은 많은 도움이 ... – klo