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.