Dostęp do komponentów Swing z poziomu Maina

0

Witam, piszę aplikację klient-serwer i mam problem z dostępem do kontrolek w gui.
Program składa się z forma (guiclient) który wywołuje klasę client , która łączy się z serwerem.
Sam proces łączenia się z serwerem wykonuję się w mainie , z racji tego że klasa ta musi być wywołana w terminalu za pomocą odpowiedniej komendy uwzgledniającej plik policy.
Sam main wykonuję się prawidłowo , klient wywołuje metodę za pomocą której odbiera z serwera ciąg znaków podtwierdzający połączenie.
Ciąg znaków przypisuje do zmiennej w mainie i teraz pytanie, jak to wysłać do Gui ?.
Klasę klient wywołuje z konstruktorem który przyjmuje obiekt klasy guiclient , ale z poziomu maina nie mam dostępu do tego obiektu, mogę co najwyżej stworzyć nowy.
Ustawienie stringa jako statyczny też nie przynosi rezultatów. Z poziomu maina jest okej , wypisuje w terminalu to co przysłał serwer.
Tutaj zamieszczam klasę guiclient. W sumie zabiera 2 kontrolki + zdarzenie do przycisku.

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextField;
public class guiclient 
	{
	private JFrame frame;
	public JTextField textField;
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					guiclient window = new guiclient();
					window.frame.setVisible(true);
					
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	public guiclient() {
	
		initialize();
	}
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 350, 144);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);	
		JButton btnSprawdzSerwer = new JButton("Sprawdz serwer");
		Client Sprawdzanieserwera=new Client(this);
		btnSprawdzSerwer.addMouseListener(Sprawdzanieserwera);
		btnSprawdzSerwer.setBounds(94, 66, 150, 32);
		frame.getContentPane().add(btnSprawdzSerwer);
		textField = new JTextField();
		textField.setEditable(false);
		textField.setBounds(12, 12, 316, 42);
		frame.getContentPane().add(textField);
		textField.setColumns(10);
	}
}

Tutaj wrzucam klasę klienta.

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.rmi.*;
import java.rmi.registry.*;
public class Client implements  MouseListener{
	
	public static guiclient d=null;
	public Client(guiclient r)
	{
		setD(r);
	}
	public void run() throws InterruptedException, IOException  {	        
        	Runtime r = Runtime.getRuntime();
		    String myScript = "javac Client.java ; java -Djava.security.policy=java.policy Client";
		    String[] cmdArray = {"xterm", "-e","cd ~/workspace/CLientRMI/src/ ;"+ myScript +" ; le_exec"};
            r.exec(cmdArray);				       	
	}
	public static void main(String[] args) throws RemoteException
	{
		 Registry reg;
			try
			{
				String kom=null;
				if (System.getSecurityManager() == null) 
	            System.setSecurityManager(new RMISecurityManager());
				reg = LocateRegistry.getRegistry(1112);
				Hello h = (Hello)reg.lookup("server");	
				kom=h.hello();			//metoda serwera
				System.out.println(kom);
				Client.getD().textField.setText(kom);			
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
	}
	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub
		try {
			this.run();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	public static guiclient getD() {
		return d;
	}
	public static void setD(guiclient d) {
		Client.d = d;
	}
}

No tak jak pisałem komunikacja po stronie serwera wzorowo, println też wyświetla się prawidłowo, problem do dotarcia do kontrolki aktualnie otwartego gui (klasy która go wywołała).
W javie siedzę od niedawna więc może przeoczyłem jakiś sposób.
Jeśli ktoś zna rozwiązanie problemu , to bardzo prosiłbym o pomoc i ewentualne wytłumaczenie ( nie odsyłanie do angielskich stron itp).
Swinga robiłem w Eclipsie za pomocą wtyczki WindowsBuilder Pro jeśli to ma znaczenie.
Z góry dziękuje za pomoc.

0

To co tutaj pokazałeś to jest jakaś masakra. Lekcje na dziś:

  • zasada jednej odpowiedzialności
  • zasada separacji interfejsów
  • wzorzec projektowy MVC

Sam proces łączenia się z serwerem wykonuję się w mainie , z racji tego że klasa ta musi być wywołana w terminalu za pomocą odpowiedniej komendy uwzgledniającej plik policy.

Ale PO CO? Nie dalo sie po prostu gui clienta wywołac z podanym plikiem policy?
Ale odpowiadając na pytanie:
Nie da się w żaden sposób wysłać tego co dostajesz z serwera do gui clienta bez jakichś chorych pomysłów typu wpychanie tutaj singletona.

Kod jest na tyle krótki ze proponuje napisać go jeszcze raz, ale tym razem z głową.

  • gui client moze od biedy zostać taki jaki jest, chociaż piękne to nie jest
  • client ma pracować za pomocą normalnych metod i wątków a nie za pomocą jakiegoś chorego wywołania za pomocą exec! To co teraz leży ci w main() wrzucić w jakas metodę, a to co masz w run niech zniknie w niebycie bo woła o pomstę do nieba.
0

Ale PO CO? Nie dalo sie po prostu gui clienta wywołac z podanym plikiem policy?

No właśnie tylko jak to zrobić ? . Z góry mówię , że cały proces odpalania chcę mieć zautomatyzowany, bez wpisywania bzdur do konsoli. Dlatego posłużyłem się exec.
Odnośnie Klienta RMI to we wszystkich przykładach i wykładach jakie czytałem zawsze uruchamiali go z maina i uruchamiali z terminala , więc dlatego tak troche pomotałem z tym.
Bardzo byłoby fajnie jakby dało się za pomocą zwykłych metod połączyć , tylko w jaki sposób kazać się klasie klienta posługiwać plikem police ?? Tutaj nie mam pomysłu więc jakby ktoś mógł przykładowo napisać mały fragment kodu , z tą implenetacją pliku policy to byłbym bardzo wdzięczny.
Tak jak mówłem z Java mam kontakt od niedawna więc proszę o wyrozumiałość ;p
Co do guiclienta to jednak klasa została automatycznie wygenerowana ja tylko dodałem obsługe przycisku więc czy brzydko czy ładnie tak to zostawiam bo ta klasa jest mało ważna chwilowo.

0

Ok, rozumiem że chcesz uruchomić klienta bez potrzeby wpisywania info o policy w konsoli? To napisz sobie skrypt startujący ten program. Tzn cały skrypt to będzie po prostu:

java -Djava.security.policy=java.policy guiclient

Uruchomisz po prostu ten skrypt a on wystartuje ci jvm z użyciem tego policy, więc i guiclient i client będą miały do niego dostęp.

0

Dziękuje Ci bardzo Shalom
Rzeczywiście ze skryptem wszystko działa i ten cały Main był nie potrzebny.
A odnośnie rad , które udzieliłeś z wzorcami projektowymi to postaram się nadrobić zaległości :)

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