在客户端对象之间共享JPanel

时间:2014-05-20 18:35:19

标签: java jpanel drawing client-server

我是Java的新手,但我需要为学校做点什么。我试图做一个Server-Client Puns游戏。我有聊天的客户端和服务器类,我有一个类通过鼠标在JPanel上绘制图像,但我不知道如何与其他客户端共享该图片。你能给我一些想法吗?谢谢!

客户代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.rmi.registry.*;
import java.util.*;

public class PunsClient extends JFrame {

    //GUI
    private JButton polacz, rozlacz;
    private JPanel topPanel;
    private JPanel centerPanel;
    private Painter painter;
    private JTextField host, wiadomosc;
    private JTextArea komunikaty;
    private JList<String> zalogowani;
    private DefaultListModel<String> listaZalogowanych;
    //Klient
    private String nazwaSerwera = "localhost";
    private Klient watekKlienta;
    private PunsClient instancjaKlienta;
    private Puns serwer;
    private ClientImpl klient;

    public PunsClient() {
        super("Klient");

        instancjaKlienta = this;

        setSize(800, 600);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setLayout(new BorderLayout());

        topPanel = new JPanel(new FlowLayout());
        centerPanel = new JPanel(new FlowLayout());
        painter = new Painter();
        komunikaty = new JTextArea(20,12);
        komunikaty.setLineWrap(true);
        komunikaty.setEditable(false);

        wiadomosc = new JTextField();

        host = new JTextField(nazwaSerwera, 12);
        polacz = new JButton("Połącz");
        rozlacz = new JButton("Rozłącz");
        rozlacz.setEnabled(false);

        listaZalogowanych = new DefaultListModel<String>();
        zalogowani = new JList<String>(listaZalogowanych);
        zalogowani.setFixedCellWidth(120);

        ObslugaZdarzen obsluga = new ObslugaZdarzen();

        polacz.addActionListener(obsluga);
        rozlacz.addActionListener(obsluga);

        wiadomosc.addKeyListener(obsluga);

        addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {
                rozlacz.doClick();
                setVisible(false);
                System.exit(0);
            }
        });

        topPanel.add(new JLabel("Serwer RMI: "));
        topPanel.add(host);
        topPanel.add(polacz);
        topPanel.add(rozlacz);

        centerPanel.add(painter);
        centerPanel.add(new JScrollPane(komunikaty), BorderLayout.EAST);

        add(topPanel, BorderLayout.NORTH);
        add(centerPanel, BorderLayout.CENTER);
        //add(painter, BorderLayout.CENTER);
        //add(new JScrollPane(komunikaty), BorderLayout.EAST);
        //add(new JScrollPane(zalogowani), BorderLayout.EAST);
        add(wiadomosc, BorderLayout.SOUTH);

        setVisible(true);

    }

    private class ObslugaZdarzen extends KeyAdapter implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().equals("Połącz")) {
                wyswietlKomunikat("Łączę z: " + nazwaSerwera + "...");
                polacz.setEnabled(false);
                rozlacz.setEnabled(true);
                host.setEnabled(false);
                watekKlienta = new Klient();
                watekKlienta.start();
            }
            if (e.getActionCommand().equals("Rozłącz")) {
                listaZalogowanych.clear();
                try {
                    serwer.opusc(klient);
                } catch (Exception ex) {
                    System.out.println("Błąd: " + ex);
                }
                rozlacz.setEnabled(false);
                polacz.setEnabled(true);
                host.setEnabled(true);
            }
        }

        public void keyReleased(KeyEvent e) {
            if (e.getKeyCode() == 10) {
                try {
                    serwer.wiadomosc(klient, wiadomosc.getText());
                    wiadomosc.setText("");
                } catch (Exception ex) {
                    System.out.println("Błąd: " + ex);
                }
            }
        }
    }

    private class Klient extends Thread {

        public void run() {
            try {
                Registry rejestr = LocateRegistry.getRegistry(host.getText());
                serwer = (Puns) rejestr.lookup("RMICzat");
                wyswietlKomunikat("Połączyłem się z serwerem.");
                String nick = JOptionPane.showInputDialog(null, "Podaj nick: ");
                klient = new ClientImpl(instancjaKlienta, nick);
                serwer.dolacz(klient);

            } catch (Exception e) {
                System.out.println("Błąd połączenia: " + e);
            }
        }
    }

    public void wyswietlKomunikat(String tekst) {
        komunikaty.append(tekst + "\n");
        komunikaty.setCaretPosition(komunikaty.getDocument().getLength());
    }

    public void odswiezListe(Vector<Client> lista) {

                listaZalogowanych.clear();

                for (Client n : lista) {
                    try {
                        listaZalogowanych.addElement(n.pobierzNicka());
                        System.out.println(n.pobierzNicka());
                    } catch (Exception e) {
                        System.out.println("Błąd: " + e);
                    }
                }
    }

    public static void main(String[] args) {
        new PunsClient();
    }
}

画家代码:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class Painter extends JPanel {

    private static final long serialVersionUID = 1L;
    int xvalue = -10, yvalue = -10;

   public Painter() { 
      setPreferredSize(new Dimension(400, 400));
      addMouseMotionListener(new MouseMotionAdapter() {

          public void mouseDragged( MouseEvent event ) {
              xvalue = event.getX();
              yvalue = event.getY();
              repaint();
              }
          });
      }

   public void paint ( Graphics g ) {
       g.fillOval( xvalue, yvalue, 10, 10 );
       }
   }

1 个答案:

答案 0 :(得分:0)

我的建议是使用BufferedImage,我相信你有一种方法getGraphics()。使用此方法作为绘图图形,然后您可以发送BufferedImage