【问题标题】:Rubber Banding without using Lines2D不使用 Lines2D 的橡皮筋
【发布时间】:2019-12-05 07:10:36
【问题描述】:

我正在尝试做橡皮筋,让我再解释一下,每次我画一条线并画另一条线时,它都会清除面板并且永远不会显示第一个绘制的线,我想保存所有绘制的线使用Lines2D 我想使用ArrayList 一个用于first 点,第二个用于second 点。

这是我的代码:

package rubberlines;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class RubberLinesPanel extends JPanel {
    private Point point1 = null, point2 = null;
    private ArrayList<Point> pt1 = new ArrayList<Point>();
    private ArrayList<Point> pt2 = new ArrayList<Point>();
//    private ArrayList<Point> pt3 = new ArrayList<Point>();


    RubberLinesPanel(){
        LineListener listener = new LineListener();
        addMouseListener(listener);
        addMouseMotionListener(listener);
        setBackground(Color.black);
    }

    public void paintComponent(Graphics page){
        super.paintComponent(page);
        page.setColor(Color.green);
        for(int i=0; i<pt1.size(); i++){
        if(point1 != null && point2 != null){
            page.drawLine(point1.x, point1.y, point2.x, point2.y);
        }
        }
    }

    private class LineListener implements MouseListener, MouseMotionListener{
        public void mousePressed(MouseEvent event){
            point1 = event.getPoint();
            pt1.add(point1);
        }

        public void mouseDragged(MouseEvent event){
//            point2 = event.getPoint();
//            repaint();
        }

    public void mouseClicked(MouseEvent event){}
    public void mouseReleased(MouseEvent event){
        point2 = event.getPoint();
        pt2.add(point2);
        repaint();
//            for(int i=0; i<pt2.size(); i++){
//            pt2.get(i);
//            }            
        }
    public void mouseEntered(MouseEvent event){}
    public void mouseExited(MouseEvent event){}
    public void mouseMoved(MouseEvent event){}

    }

}

【问题讨论】:

  • 您的意思类似于this for example。关于绘画(通常),您需要了解的一件事是它具有破坏性,因此您需要确保在调用 paintComponent 时,您可以完全重建您想要绘画的内容
  • 所以根据您的代码,您应该遍历单个 List 点,在它们之间画一条线
  • 我想使用 ArrayList one 作为第一个点,第二个作为第二个点。 - 那么你需要实际使用 get(...) 方法来获取每个点ArrayList 在您尝试在两点之间画一条线之前。

标签: java swing arraylist


【解决方案1】:

我想使用 ArrayList 一个作为第一个点,第二个作为第二个点。

那么你需要实际使用get(...) 方法从 ArrayList 中获取每个点,然后再尝试在两点之间画一条线。

类似:

for(int i = 0; i < pt1.size(); i++)
{
    Point point1 = pt1.get(i);
    Point point2 = pt2.get(i);

    if(point1 != null && point2 != null)
    {
        page.drawLine(point1.x, point1.y, point2.x, point2.y);
    }
}

【讨论】:

    【解决方案2】:

    所以,您基本上需要一个List 点数。然后,当paintComponent 被调用时,你只想循环遍历这些点,在每个点之间画一条线...

    基本概念可能类似于...

    List<Point> drawPoints = new ArrayList<>(points);
    Point startPoint = drawPoints.remove(0);
    while (!drawPoints.isEmpty()) {
        Point nextPoint = drawPoints.remove(0);
        g2d.draw(new Line2D.Double(startPoint, nextPoint));
        startPoint = nextPoint;
    }
    

    这基本上从一个初始点开始,获取下一个点,在它们之间画一条线。然后它将下一个点分配给初始点并重复。

    可运行示例...

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.geom.Line2D;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Test {
    
        public static void main(String[] args) {
            new Test();
        }
    
        public Test() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFrame frame = new JFrame();
                    frame.add(new RubberLinesPanel());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class RubberLinesPanel extends JPanel {
    
            private ArrayList<Point> points = new ArrayList<Point>();
            private Point dragPoint;
    
            RubberLinesPanel() {
                LineListener listener = new LineListener();
                addMouseListener(listener);
                addMouseMotionListener(listener);
                setBackground(Color.black);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 400);
            }
    
            @Override
            protected void paintComponent(Graphics page) {
                super.paintComponent(page);
                if (points.isEmpty()) {
                    return;
                }
                Graphics2D g2d = (Graphics2D) page.create();
                g2d.setColor(Color.green);
    
                List<Point> drawPoints = new ArrayList<>(points);
                Point startPoint = drawPoints.remove(0);
                while (!drawPoints.isEmpty()) {
                    Point nextPoint = drawPoints.remove(0);
                    g2d.draw(new Line2D.Double(startPoint, nextPoint));
                    startPoint = nextPoint;
                }
    
                if (dragPoint != null) {
                    g2d.setColor(Color.LIGHT_GRAY);
                    g2d.draw(new Line2D.Double(startPoint, dragPoint));
                }
    
                g2d.dispose();
            }
    
            private class LineListener extends MouseAdapter {
    
                @Override
                public void mousePressed(MouseEvent event) {
                    points.add(event.getPoint());
                    repaint();
                }
    
                @Override
                public void mouseDragged(MouseEvent event) {
                    dragPoint = event.getPoint();
                    repaint();
                }
    
                @Override
                public void mouseReleased(MouseEvent event) {
                    points.add(event.getPoint());
                    dragPoint = null;
                    repaint();
                }
    
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 2010-09-30
      • 2011-01-28
      • 2013-12-24
      • 2014-06-15
      • 1970-01-01
      相关资源
      最近更新 更多