如何使我的油漆组件光滑

时间:2015-10-25 02:44:03

标签: java swing graphics2d

在我的应用程序中,我有一个可以绘画的JPanel。这是通过记录鼠标单击和鼠标拖动事件中的三个点,然后在这三个点之间绘制折线来完成的。但是,如果我使用我的平板电脑绘制,线条不是很平滑。我看到的最大的问题是,如果我快速抚摸笔,该程序甚至不会划线。如果我走得有点慢,那么它就会划清界限,但它会落后,所以我无法看到它被绘制的线条。我怎样才能使这个变得更加流畅,就像在一张纸条中那样,无论我用笔划动多快,它都会画出我的线条?

以下是我一直在使用的代码,有人需要它

public class ScratchPad extends JPanel {

private Image image;
private Graphics2D graphics;
private ArrayList<Integer[]> coordinates = new ArrayList<>();

public ScratchPad() {

    setPreferredSize(new Dimension(1000, 500));
    addMouseListener(new MouseAdapter() {

        @Override
        public void mousePressed(MouseEvent me) {

            Integer[] coord = {me.getX(), me.getY()};
            coordinates.add(coord);
        }

        @Override
        public void mouseReleased(MouseEvent me) {
            coordinates.clear();
        }
    });
    addMouseMotionListener(new MouseMotionAdapter() {

        @Override
        public void mouseDragged(MouseEvent me) {

            Integer[] coord = {me.getX(), me.getY()};
            coordinates.add(coord);

            if (coordinates.size() >= 3) {
                if (graphics != null) {
                    drawLine();
                    repaint();
                }
            }
        }

    });

}

private void drawLine() {
    int[] x = {coordinates.get(0)[0], coordinates.get(1)[0], coordinates.get(2)[0]};
    int[] y = {coordinates.get(0)[1], coordinates.get(1)[1], coordinates.get(2)[1]};

    graphics.drawPolyline(x, y, 3);

    Integer[] temp = {coordinates.get(2)[0], coordinates.get(2)[1]};
    coordinates.clear();
    coordinates.add(temp);

}

@Override
protected void paintComponent(Graphics g) {
    if (image == null) {
        // image to draw null ==> we create
        image = createImage(getSize().width, getSize().height);
        graphics = (Graphics2D) image.getGraphics();
        // enable antialiasing
        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        // clear draw area
        clear();
    }

    g.drawImage(image, 0, 0, null);
}

public void clear() {
    graphics.setPaint(Color.white);
    // draw white on entire draw area to clear
    graphics.fillRect(0, 0, getSize().width, getSize().height);
    graphics.setPaint(Color.black);
    repaint();
}

}
编辑:添加图片以显示正在发生的事情。此图片的代码是MadProgrammer在下面的评论中的第二个例子。这里的主要问题是Java没有检测到鼠标拖动的一部分。我先绘制垂直线,然后从垂直线的顶部开始绘制水平线。正如您在图像中看到的那样,水平线并未立即从垂直线开始;它留下了一个空白。当我尝试用我的Wacom平板电脑而不是用鼠标绘图时,这个间隙才会出现。这是我此时试图解决的主要问题。我将在这个绘图工具中编写日文汉字,它具有根本不显示的小笔画!我必须让它们变得不必要,以便Java可以绘制它们。

enter image description here

1 个答案:

答案 0 :(得分:0)

如果您使用wacom笔在其他应用程序中是否相当快?,如果没有,请尝试以下修复程序:

https://boutiqueretouching.com/fix-wacom-lag/

A)Wacom首选项应用程序->映射->使用Windows墨水(关闭)

B)搜索->轻弹->打开和关闭轻弹->取消选中使用轻弹

C)转到Windows设置–>设备–>笔/“笔和触摸设置->关闭”显示视觉效果”和“显示光标”。