JPanel senden ?

  • Java

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Luca.

    JPanel senden ?

    Hi, ich switche mal wieder die Programmiersprache und mach jz ein kleines Projekt in Java. Es ist ein Client/Server Projekt. Der Server ist durch Addons (externe Jars) erweiterbar. So weit so gut, aber wenn ich jz ein Addon hinzufüge, möchte ich, dass der Client weiß wie das Layout aussieht. Da ich es vermeiden möchte eine addon_client.jar und eine addon_server.jar zu machen, gibt es im Addon ein JPanel, das der Server abrufen kann. Da ich es aber beim Client brauche, muss ich das irgendwie senden. Mit einem ObjectStream habe ich es nicht geschafft (kp, ob ich zu inkompetent bin oder das nicht geht). Hat da jemand eine Idee, wie man ein Layout senden kann ?

    MfG Luca

    Mein Code:

    Layout:
    Spoiler anzeigen

    Quellcode

    1. import javax.swing.JPanel;
    2. import javax.swing.JLabel;
    3. public class Layout extends JPanel {
    4. private static final long serialVersionUID = 1L;
    5. public Layout() {
    6. setLayout(null);
    7. JLabel lblHallo = new JLabel("Hallo :>");
    8. lblHallo.setBounds(39, 38, 46, 14);
    9. add(lblHallo);
    10. }
    11. }


    Server:
    Spoiler anzeigen

    Java-Quellcode

    1. import java.io.IOException;
    2. import java.io.ObjectOutputStream;
    3. import java.net.ServerSocket;
    4. import java.net.Socket;
    5. import javax.swing.JPanel;
    6. public class Server {
    7. public static void main(String[] args) {
    8. new Server();
    9. }
    10. public Server() {
    11. try {
    12. @SuppressWarnings("resource")
    13. ServerSocket server = new ServerSocket( 40040 );
    14. System.out.println( "Server online on Port: " + server.getLocalPort() );
    15. while ( !server.isClosed() )
    16. handleConnection( server.accept() );
    17. } catch ( IOException e ) { e.printStackTrace(); }
    18. }
    19. private void handleConnection( Socket client ) {
    20. try {
    21. ObjectOutputStream oos = new ObjectOutputStream( client.getOutputStream() );
    22. System.out.println( "Client connected: " + client.getInetAddress() + ":" + client.getPort() );
    23. JPanel pLayout = new Layout();
    24. oos.writeObject( pLayout ); oos.flush();
    25. oos.close();
    26. } catch ( IOException e ) { e.printStackTrace(); }
    27. }
    28. }


    Client:
    Spoiler anzeigen

    Java-Quellcode

    1. import java.io.IOException;
    2. import java.io.ObjectInputStream;
    3. import java.net.Socket;
    4. import javax.swing.JFrame;
    5. import javax.swing.JPanel;
    6. public class Client {
    7. public static void main(String[] args) {
    8. new Client();
    9. }
    10. public Client() {
    11. try {
    12. @SuppressWarnings("resource")
    13. Socket server = new Socket( "", 40040 );
    14. ObjectInputStream ois = new ObjectInputStream( server.getInputStream() );
    15. System.out.println( "Connected with Server: " + server.getInetAddress() + ":" + server.getPort() );
    16. JFrame frame = new JFrame( "Client" );
    17. JPanel playout = (JPanel) ois.readObject();
    18. frame.setSize( 800, 600 );
    19. frame.add( playout );
    20. frame.setVisible( true );
    21. ois.close();
    22. } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); }
    23. }
    24. }


    Mein Fehler (Client):
    Spoiler anzeigen

    Quellcode

    1. java.lang.ClassNotFoundException: de.multiSync.Server.src.Layout
    2. at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    3. at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    4. at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    5. at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    6. at java.lang.Class.forName0(Native Method)
    7. at java.lang.Class.forName(Class.java:348)
    8. at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626)
    9. at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
    10. at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
    11. at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
    12. at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
    13. at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
    14. at de.MultiSync.Client.src.Client.<init>(Client.java:26)
    15. at de.MultiSync.Client.src.Client.main(Client.java:12)


    Ich check nicht ganz warum er die Layout Klasse sendet, obwohl ich sie zu einem JPanel gecastet habe :/

    Edit: Es geht wenn man nur ein new JPanel() sendet, aber ich möchte eigentlich alles senden...

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Luca“ ()

    Habs durch probieren alleine geschafft :D
    (aber denkt nicht, dass ich nur 10 min das versucht hab oder so... Sitze da schon länger dran :/)

    Mein funktionierender Code:

    Layout ist gleich geblieben...

    Client
    Spoiler anzeigen

    Java-Quellcode

    1. import java.io.IOException;
    2. import java.io.ObjectInputStream;
    3. import java.net.Socket;
    4. import javax.swing.JFrame;
    5. import javax.swing.JPanel;
    6. public class Client
    7. {
    8. public static void main(String[] args)
    9. {
    10. new Client();
    11. }
    12. public Client()
    13. {
    14. Socket server = null;
    15. try {
    16. server = new Socket( "", 40040 );
    17. ObjectInputStream ois = new ObjectInputStream( server.getInputStream() );
    18. System.out.println( "Connected with Server: " + server.getInetAddress() + ":" + server.getPort() );
    19. JFrame frame = new JFrame( "Client" );
    20. JPanel playout = (JPanel) ois.readObject();
    21. frame.setSize( 800, 600 );
    22. frame.add( playout );
    23. frame.setVisible( true );
    24. ois.close();
    25. } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); }
    26. finally {
    27. try {
    28. server.close();
    29. } catch ( IOException | NullPointerException e ) { e.printStackTrace(); }
    30. }
    31. }
    32. }


    Server
    Spoiler anzeigen

    Java-Quellcode

    1. import java.awt.Component;
    2. import java.io.IOException;
    3. import java.io.ObjectOutputStream;
    4. import java.net.ServerSocket;
    5. import java.net.Socket;
    6. import javax.swing.JPanel;
    7. public class Server
    8. {
    9. public static void main(String[] args)
    10. {
    11. new Server();
    12. }
    13. public Server()
    14. {
    15. ServerSocket server = null;
    16. try {
    17. server = new ServerSocket( 40040 );
    18. System.out.println( "Server online on Port: " + server.getLocalPort() );
    19. while ( !server.isClosed() )
    20. handleConnection( server.accept() );
    21. } catch ( IOException e ) { e.printStackTrace(); }
    22. finally {
    23. try {
    24. server.close();
    25. } catch ( IOException | NullPointerException e ) { e.printStackTrace(); }
    26. }
    27. }
    28. private void handleConnection( Socket client )
    29. {
    30. try {
    31. ObjectOutputStream oos = new ObjectOutputStream( client.getOutputStream() );
    32. System.out.println( "Client connected: " + client.getInetAddress() + ":" + client.getPort() );
    33. JPanel pLayout = new JPanel();
    34. Layout layout = new Layout();
    35. for ( Component comp : layout.getComponents() )
    36. pLayout.add( comp );
    37. oos.writeObject( pLayout ); oos.flush();
    38. oos.close();
    39. } catch ( IOException e ) { e.printStackTrace(); }
    40. }
    41. }