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, botów: 0