我是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 );
}
}
答案 0 :(得分:0)
我的建议是使用BufferedImage
,我相信你有一种方法getGraphics()
。使用此方法作为绘图图形,然后您可以发送BufferedImage
。