Uruchamianie metody przez przycisk

0

Nie wiem czemu gdy wywołuję funkcję uruchamiająca nasłuch serwera przez button aplikacja zawiesza się. Nie ma tego problemy gdy wywołują ją na rzecz obiektu w mainie:

void uruchom() throws IOException{     
    	
    		ConnectorS = new ServerSocket(port);
    	    dialog.append("Serwer uruchomiony\n"); 
    	    	   		
    		try{
    		    while(true){    		  
    			  SerwerG = ConnectorS.accept();
    			  dialog.append("Przyjęto połączenie z - "+ SerwerG +"\n"); 
    		    
    		try{
    			new SerwerA(SerwerG);
    		}catch(IOException e){
    			System.err.println(e.getMessage());
    			SerwerG.close();
    		}
    		    }
    		}finally{    		
    		 ConnectorS.close();
    		 System.out.println("Zamykanie połączenia");
    	     }    
    }

Przycisk oczywiście jest nasłuchiwany

public void actionPerformed(ActionEvent event){
    	Object zrodlo = (JMenuItem) event.getSource();
    	if(zrodlo == i1)
    	  try{    	  
    		this.uruchom();
    	  }catch(IOException e){
    	  	System.err.println("Wyjątek w trakcie uruchmiania usługi");
    	  };
}

Ale metoda działa tylko przy wywołaniu z funkcji main np.
Serwer s = new Serwer();
s.uruchom();

0

Aplikacja wiesza się na SerwerG = ConnectorS.accept();

W uproszczeniu mówiąc w programie swingowym są dwa wątki.
Jeden, to ten, który odpala main, drugi jest odpowiedzialny za rozsyłanie eventów.

Jeżeli wykonasz akcję w main, to jest OK, bo drugi wątek dalej działa.

Natomiast jeżeli wywołasz to w akcji po naciśnięciu przycisku, to zawiesisz wątek do rozsyłanie zdarzeń przez co zawiesisz całą aplikację.

Poprawnym rozwiązaniem jest stworzenie oddzielnego wątku, w którym działałby serwer.

1 użytkowników online, w tym zalogowanych: 0, gości: 1