Java Swing:我通过鼠标拖动绘制的任何线只在下次拖动鼠标时显示

Java Swing:我通过鼠标拖动绘制的任何线只在下次拖动鼠标时显示,java,swing,repaint,line-drawing,Java,Swing,Repaint,Line Drawing,我还在学习Java的基础知识,如果这个问题是基本的,我很抱歉。我试图做的是将点和线存储到ArrayLists中,然后让paintComponent()方法遍历它们,并在每次调用时绘制它们。因为我对我的点使用相同的ArrayList,所以每次按下鼠标时我都会清除它,这样新行就不会与前一行连接 import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.BorderFactory; import java.awt.

我还在学习Java的基础知识,如果这个问题是基本的,我很抱歉。我试图做的是将点和线存储到
ArrayLists
中,然后让
paintComponent()
方法遍历它们,并在每次调用时绘制它们。因为我对我的点使用相同的
ArrayList
,所以每次按下鼠标时我都会清除它,这样新行就不会与前一行连接

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.util.ArrayList;


public class SwingPaintDemo2 {

    public static void main(String[] args) {
        JFrame f = new JFrame("Swing Paint Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(300,300);
        f.add(new MyPanel());
        f.setBackground(Color.WHITE);
        f.setVisible(true);
    }
}

class MyPanel extends JPanel {

    private int x;
    private int y;
    private int x2;
    private int y2;

   private ArrayList<Point> points = new ArrayList<Point>();
   private ArrayList<Curves> curvedLines = new ArrayList<Curves>();

    public MyPanel() {

        setBorder(BorderFactory.createLineBorder(Color.black));

        addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                points.add(new Point(e.getX(), e.getY()));
                repaint();
            }
        });

        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                points.clear();
                points.add(new Point(e.getX(), e.getY()));
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                ArrayList<Point> newPoints = new ArrayList<Point>();
                for (int i = 0; i < points.size(); i++) {
                    newPoints.add(points.get(i));
                }
                curvedLines.add(new Curves(newPoints));
            }
        });
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);


            for (int c = 0; c < points.size() - 1; c++) {
                x = (int) points.get(c).getX();
                y = (int) points.get(c).getY();
                x2 = (int) points.get(c + 1).getX();
                y2 = (int) points.get(c + 1).getY();
                g.drawLine(x, y, x2, y2);
            }


            for (int t = 0; t < curvedLines.size(); t++) {
                ArrayList<Point> iterator = curvedLines.get(t).points;
                for (int c = 0; c < iterator.size() - 1; c++) {
                    x = (int) iterator.get(c).getX();
                    y = (int) iterator.get(c).getY();
                    x2 = (int) iterator.get(c + 1).getX();
                    y2 = (int) iterator.get(c + 1).getY();
                    g.drawLine(x, y, x2, y2);
                }
            }

    }


        class Curves {
            private ArrayList<Point> points;

            public Curves(ArrayList<Point> points) {
                this.points = new ArrayList<Point>();
                this.points = points;
            }
        }
    }
import javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.BorderFactory;
导入java.awt.*;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseAdapter;
导入java.util.ArrayList;
公共类SwingPaintDemo2{
公共静态void main(字符串[]args){
JFrame f=新JFrame(“Swing Paint演示”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 设置大小(300300);
f、 添加(新的MyPanel());
f、 挫折地面(颜色:白色);
f、 setVisible(真);
}
}
类MyPanel扩展了JPanel{
私人INTX;
私营企业;
私人int x2;
私人互联网y2;
private ArrayList points=new ArrayList();
private ArrayList curvedLines=new ArrayList();
公共事务委员会(){
setboorder(BorderFactory.createLineBorder(Color.black));
addMouseMotionListener(新的MouseAdapter(){
@凌驾
公共无效鼠标标记(鼠标事件e){
添加(新点(e.getX(),e.getY());
重新油漆();
}
});
addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标按下(MouseEvent e){
点。清除();
添加(新点(e.getX(),e.getY());
}
@凌驾
公共无效MouseEvent(MouseEvent e){
ArrayList newPoints=新的ArrayList();
对于(int i=0;i

问题是,当我拖动鼠标时,没有画任何线,但它的点仍然被存储,因为当我再次拖动鼠标时,线出现了。是什么导致了这种明显的延迟?

在我的原始评论中,您被要求将上一个问题中给出的工作代码与您在此处发布的代码进行比较,以了解区别

区别在于您在paintComponent()方法中添加了if/else语句

我添加了if/else语句,因为paintComponenet不会绘制任何内容

那没有任何意义。添加if/else语句时,意味着只能进行一种类型的绘制,要么绘制曲线,要么绘制点,但不能同时进行这两种绘制

您始终希望同时执行以下两项操作:

  • 在mouseDragged()事件中添加点时绘制点
  • 绘制已添加到曲线的所有旧点
  • 因此,去掉if/else语句


    此外,将来当您发布代码并发布适当的se时,我们可以执行代码。这里发布的代码没有main()方法或JFrame,因此无法编译和测试。

    根据camickr的建议,它对我来说很好

    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class SwingPaintDemo2 {
    
        public static void main(String[] args) {
            new SwingPaintDemo2();
        }
    
        public SwingPaintDemo2() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new MyPanel());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        class MyPanel extends JPanel {
    
            private int x;
            private int y;
            private int x2;
            private int y2;
    
            private ArrayList<Point> points = new ArrayList<Point>();
            private ArrayList<Curves> curvedLines = new ArrayList<Curves>();
    
            public MyPanel() {
    
                setBorder(BorderFactory.createLineBorder(Color.black));
    
                addMouseMotionListener(new MouseAdapter() {
                    @Override
                    public void mouseDragged(MouseEvent e) {
                        points.add(new Point(e.getX(), e.getY()));
                        repaint();
                    }
                });
    
                addMouseListener(new MouseAdapter() {
                    @Override
                    public void mousePressed(MouseEvent e) {
                        points.clear();
                        points.add(new Point(e.getX(), e.getY()));
                    }
    
                    @Override
                    public void mouseReleased(MouseEvent e) {
                        ArrayList<Point> newPoints = new ArrayList<Point>();
                        for (int i = 0; i < points.size(); i++) {
                            newPoints.add(points.get(i));
                        }
                        curvedLines.add(new Curves(newPoints));
                        repaint();
                    }
                });
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.BLACK);
    
                for (int c = 0; c < points.size() - 1; c++) {
                    x = (int) points.get(c).getX();
                    y = (int) points.get(c).getY();
                    x2 = (int) points.get(c + 1).getX();
                    y2 = (int) points.get(c + 1).getY();
                    g.drawLine(x, y, x2, y2);
                }
                for (int t = 0; t < curvedLines.size(); t++) {
                    ArrayList<Point> iterator = curvedLines.get(t).points;
                    for (int c = 0; c < iterator.size() - 1; c++) {
                        x = (int) iterator.get(c).getX();
                        y = (int) iterator.get(c).getY();
                        x2 = (int) iterator.get(c + 1).getX();
                        y2 = (int) iterator.get(c + 1).getY();
                        g.drawLine(x, y, x2, y2);
                    }
                }
            }
    
            class Curves {
    
                private ArrayList<Point> points;
    
                public Curves(ArrayList<Point> points) {
                    this.points = new ArrayList<Point>();
                    this.points = points;
                }
            }
        }
    }
    
    导入java.awt.Color;
    导入java.awt.EventQueue;
    导入java.awt.Graphics;
    导入java.awt.Point;
    导入java.awt.event.MouseAdapter;
    导入java.awt.event.MouseEvent;
    导入java.util.ArrayList;
    导入javax.swing.BorderFactory;
    导入javax.swing.JFrame;
    导入javax.swing.JPanel;
    导入javax.swing.UIManager;
    导入javax.swing.UnsupportedLookAndFeelException;
    公共类SwingPaintDemo2{
    公共静态void main(字符串[]args){
    新SwingPaintDemo2();
    }
    公共SwingPaintDemo2(){
    invokeLater(新的Runnable(){
    @凌驾
    公开募捐{
    试一试{
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
    例如printStackTrace();
    }
    JFrame=新JFrame(“测试”);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(新的MyPanel());
    frame.pack();
    frame.setLocationRelativeTo(空);
    frame.setVisible(true);
    }
    });
    }
    类MyPanel扩展了JPanel{
    私人INTX;
    私营企业;
    私人int x2;
    私人互联网y2;
    private ArrayList points=new ArrayList();
    private ArrayList curvedLines=new ArrayList();