Java 如何使我的油漆部件光滑

Java 如何使我的油漆部件光滑,java,swing,graphics2d,Java,Swing,Graphics2d,在我的应用程序中,我有一个可以画画的JPanel。这是通过记录鼠标单击和鼠标拖动事件中的三个点,然后在这三个点之间绘制多段线来完成的。但是如果我用我的平板电脑画画,线条不是很平滑。我看到的最大问题是,如果我快速笔划,程序甚至不会画线。如果我走得有点慢,它就会画线,但是它落后了,所以我看不到画线的时候的线。我怎样才能使它更平滑,比如在一个音符中,无论我的笔划得多快,它都会画出我的线条 这是我一直在使用的代码,以防有人需要它 public class ScratchPad extends JPane

在我的应用程序中,我有一个可以画画的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();
}

}
公共类草稿行扩展了JPanel{
私有图像;
私有图形2D图形;
私有ArrayList坐标=新ArrayList();
公共草稿行(){
setPreferredSize(新尺寸(1000500));
addMouseListener(新的MouseAdapter(){
@凌驾
public void mousePressed(MouseEvent me){
整数[]坐标={me.getX(),me.getY()};
坐标。添加(坐标);
}
@凌驾
公共无效MouseEvent me(MouseEvent me){
坐标。清除();
}
});
addMouseMotionListener(新的MouseMotionAdapter(){
@凌驾
公共无效鼠标标记(MouseEvent me){
整数[]坐标={me.getX(),me.getY()};
坐标。添加(坐标);
如果(坐标.size()>=3){
如果(图形!=null){
抽绳();
重新油漆();
}
}
}
});
}
专用抽绳(){
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]};
绘图多段线(x,y,3);
整数[]temp={coordinates.get(2)[0],coordinates.get(2)[1]};
坐标。清除();
坐标。添加(临时);
}
@凌驾
受保护组件(图形g){
if(image==null){
//要绘制的图像空==>我们创建
image=createImage(getSize().width,getSize().height);
graphics=(Graphics2D)image.getGraphics();
//启用抗锯齿
graphics.setRenderingHint(RenderingHints.KEY\u抗锯齿,RenderingHints.VALUE\u抗锯齿开);
//净绘图区
清除();
}
g、 drawImage(image,0,0,null);
}
公共空间清除(){
图形.setPaint(颜色.白色);
//在整个绘图区域上绘制白色以清除
graphics.fillRect(0,0,getSize().width,getSize().height);
图形。setPaint(颜色。黑色);
重新油漆();
}
}
编辑:添加图像以显示正在发生的事情。此图像的代码取自下面注释中程序员的第二个示例。这里的主要问题是Java没有检测到鼠标拖动的一部分。我先画垂直线,然后从垂直线的顶端开始画水平线。正如您在图像中看到的,水平线并不是从垂直线开始的;它留下了一个缺口。只有当我尝试使用Wacom平板电脑(而不是鼠标)绘图时,才会出现这种差距。这是我目前试图解决的主要问题。我将在这个绘图工具中书写日文汉字,它的笔划很小,一点也不显示!我必须使它们变得不必要的大,以便Java能够绘制它们


如果您在其他应用程序中使用wacom笔,速度是否合理?如果不是,请尝试以下修复方法:

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

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


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

如果您在其他应用程序中使用wacom笔,速度是否合理?如果没有,请尝试以下修复方法:

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

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


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

尽可能记录每个点,然后在点之间画线。您需要设置一些渲染提示以提高渲染效果rendering@MadProgrammer我正在记录点,我将3个点存储在arraylist中,然后使用这三个点绘制一条多段线。然后清除arraylist并将第一个点设置为创建列表之前的最后一个点明白了。但是如果我笔划得很快,它仍然没有画出界限。如果我花时间记录更多的点,那么这条线会比我的笔更慢。“如果”你想做的是“平滑”点的大距离之间的线,可以引入更多生成曲线的点,也可以绘制某种曲线,可以使用某种类型的
GeneralPath
,记住paintComponent必须调用
super.paintComponent(g)
在执行任何其他操作之前。如果忽略这一点,您的组件可能无法正确绘制。@Mad程序员我使用线性插值在三个点之间再获得两个点,这条线看起来更平滑。但是,它会滞后一点,如果我将笔移动得太快,则无法绘制。如果没有其他解决方案,我可能无法绘制o去学习OpenGL或其他东西。我就快完成这个项目了。记录下你能记录的每个点,然后在点之间画线。你会想设置一些渲染提示来提高渲染效果rendering@MadProgrammer我正在记录点,我将3个点存储在一个arraylist中,然后用这三个点绘制一条多段线r数组列表,并在清除列表之前将第一个点设置为最后一个点。但如果我笔划得很快,它仍然无法画出界限。如果我花时间记录更多的点,那么这条线将比我的更慢