1

私はまだ Java の基礎を学んでいるので、この質問が基礎的なものでしたら申し訳ありません。私がやろうとしたことは、ポイントとラインを格納してからArrayListspaintComponent()メソッドにそれらを通過させ、呼び出されるたびに描画させることです。ポイントに同じ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

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 に答える