我制作了一个程序,你有一个服务器和一个客户端,想法是你在客户端jpanel上绘制,然后坐标将被发送到服务器,这将模仿绘图。我已经做到了,但问题是现在,我的绘图机制非常糟糕。现在我只是使用在鼠标坐标上反复绘制的椭圆,如果你移动鼠标太快,有时会在椭圆之间留下空格。
为了更好地说明,这里是SS:http://gyazo.com/6ed1017e9efd6beaa4b5d56052fda260
正如您所看到的,只有当您将鼠标移动得相对较慢时,它才会保持一致,但只要您快速移动它,就会留下空格。
如何防止这种情况发生?
现在客户端只发送x和y坐标,所以这里是服务器端代码:
package com.company;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server extends JPanel{
static MouseData mouseReceive;
static Draw draw;
static int x;
static int y;
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Server server = new Server();
JFrame frame = new JFrame("Server");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(server);
frame.setSize(1024, 600);
frame.setVisible(true);
draw = new Draw(x,y);
ServerSocket serverSock = new ServerSocket(1234);
Socket s = serverSock.accept();
ObjectInputStream in = new ObjectInputStream(s.getInputStream());
while(true) {
mouseReceive = (MouseData) in.readObject();
draw = new Draw(mouseReceive.mouseX,mouseReceive.mouseY);
}
}
public void paint(Graphics g){
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
draw.display(g);
repaint();
}
}
这是我的抽奖课程:
package com.company;
import java.awt.*;
/**
* Created by John on 21/04/2015.
*/
public class Draw {
int xLoc;
int yLoc;
Draw(int x, int y){
xLoc = x;
yLoc = y;
}
public void display(Graphics g){
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.fillOval(xLoc,yLoc,7,7);
}
}
我尝试通过搜索功能在此网站上找到其他人有同样问题,但我没有运气这样做:(如果我错过了它,请指导我这个主题! 如果有人能帮助我,我会非常感激!祝你有愉快的一天:)
答案 0 :(得分:3)
假设客户端正在使用MouseListener(或MouseMotionListener):MouseListener只能以特定间隔快速启动。例如,当鼠标不断移动时,监听器将为每个间隔而不是每个像素接收一个MouseEvent。结果,快速移动鼠标可能导致绘制彼此不相邻的项目。 AFAIK,你不能提高速度,但是你可以在两个连续点之间绘制线条,使它们看起来是连续的(例如,通过使用每个事件位置的列表并在每个两个相邻点上使用 g.drawLine 列表)。
其他说明: