使用JPanel在java中绘图

时间:2015-04-21 18:29:04

标签: java jpanel paint

我制作了一个程序,你有一个服务器和一个客户端,想法是你在客户端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);
    }


}

我尝试通过搜索功能在此网站上找到其他人有同样问题,但我没有运气这样做:(如果我错过了它,请指导我这个主题! 如果有人能帮助我,我会非常感激!祝你有愉快的一天:)

1 个答案:

答案 0 :(得分:3)

假设客户端正在使用MouseListener(或MouseMotionListener):MouseListener只能以特定间隔快速启动。例如,当鼠标不断移动时,监听器将为每个间隔而不是每个像素接收一个MouseEvent。结果,快速移动鼠标可能导致绘制彼此不相邻的项目。 AFAIK,你不能提高速度,但是你可以在两个连续点之间绘制线条,使它们看起来是连续的(例如,通过使用每个事件位置的列表并在每个两个相邻点上使用 g.drawLine 列表)。

其他说明:

  1. 您应该覆盖paintComponent而不是paint方法。
  2. 我建议在此方法中调用super.paintComponent。这将清除组件(因此您的代码将只绘制最后一点 - 参见(3))
  3. 我建议保留一个用于绘图的位置列表,您可以迭代并绘制每个圆圈(或在相邻点之间画一条线)
  4. 在您的绘画方法中执行 NOT 调用重绘。这里的想法是,当从客户端收到新项目时,将其添加到(3)中的列表,然后调用重绘。