1

我还在学习 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;
            }
        }
    }

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

4

2 回答 2

1

在我最初的评论中,您被要求将上一个问题中给出的工作代码与您在此处发布的代码进行比较,看看有什么区别。

不同之处在于您在 paintComponent() 方法中添加了 if/else 语句。

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

这没有任何意义。当您添加 if/else 语句时,这意味着只能完成一种类型的绘制,绘制曲线或绘制点,但您永远不能同时进行这两种绘制。

你总是想做这两个:

  1. 绘制在 mouseDragged() 事件中添加的点
  2. 绘制已添加到曲线中的所有旧点。

所以摆脱 if/else 语句。

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

于 2016-04-04T22:03:39.660 回答
0

根据 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;
            }
        }
    }
}
于 2016-04-05T00:10:45.990 回答