我有一个带共享白板应用程序的多用户聊天室,我在其中使用 Jpanel 在特定客户端中绘制,然后通过服务器向其他客户端广播(通过 Java 套接字编程)。 我的问题是我想让绘图功能实时工作,因为只要在一个客户端的 JPanel 上完成绘图,其他客户端就应该可以看到它。我在 JPanel 的 mouseReleased 事件上编写了该函数,但只有在该客户端的 JPanel 上触发 mouseReleased 事件后,其他客户端才能看到它。 任何人都可以建议我可以使 Action 更好(实时)的东西吗?
@Override
public void mouseReleased(MouseEvent e) {
lineObject = new LineMessage();
lineObject.setImageMessage(DrawPanel.linelist);
ChatApplication_Client.Action_Paint(lineObject);
}
ChatApplication_Client.java
public void run(){
System.out.println("Listening for messages from server . . . ");
try{
while(!receivingdone){
object = myInputStream.readObject();
if(object instanceof LineMessage)
{
lineObject = (LineMessage) object;
WhiteBoardMessageReceive(lineObject);
}
}
}
//该方法负责客户端重绘和广播
private void WhiteBoardMessageReceive(LineMessage lineObject)
{
ArrayList<Line> linelist = (ArrayList)
lineObject.getImageMessage();
ChatClient_GUI.TA_ChatWindow.append(lineObject.Name+": "
+lineObject.Text + "\n" + "At ["
+DateUtils.now()+ "] " + "\n");
drawPanel.drawit(linelist);
}
//在 mouseReleased 事件上从 gui 调用以下方法
public static void Action_Paint(LineMessage lineObject)
{
try
{
myOutputStream.reset();
myOutputStream.writeObject(lineObject);
myOutputStream.flush();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
LineMessage.java
class LineMessage implements Serializable
{
ArrayList<Line> message;
Line line = new Line();
String Name =line.getName() ;
String Text ;
public void setImageMessage(Object message) {
this.message = (ArrayList) message;
}
public Object getImageMessage() {
return message;
}
}
class Line extends ChatMessage implements Serializable {
int startx, starty, endx, endy;
public Line() {
}
public Line(int sx, int sy, int ex, int ey)
{
setStartX(sx);
setStartY(sy);
setEndX(ex);
setEndY(ey);
}
public void setStartX(int sx) {
startx = sx;
}
public void setStartY(int sy) {
starty = sy;
}
public void setEndX(int ex) {
endx = ex;
}
public void setEndY(int ey) {
endy = ey;
}
public int getStartX() {
return startx;
}
public int getStartY() {
return starty;
}
public int getEndX() {
return endx;
}
public int getEndY() {
return endy;
}
}
最佳答案
List<Point> pointList = new ArrayList<>();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 500);
JPanel panel = new JPanel(){
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.BLACK);
Point l = null;
for(Point p : pointList){
if(l != null && p != null)
g.drawLine(l.x, l.y, p.x, p.y);
l = p;
}
}
};
frame.setContentPane(panel);
panel.addMouseMotionListener(new MouseMotionListener() {
boolean isDrawing = false;
@Override
public void mouseDragged(MouseEvent e) {
pointList.add(e.getPoint());
isDrawing = true;
panel.repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
if(isDrawing)
pointList.add(null); //null is a placeholder to mean line is finished
isDrawing = false;
}
});
frame.setVisible(true);
关于java - 在 JPanel 上绘制并将其广播到多个客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34246128/