Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 拖动以在JPanel中移动Line2D_Java_Swing_Drag_Shapes - Fatal编程技术网

Java 拖动以在JPanel中移动Line2D

Java 拖动以在JPanel中移动Line2D,java,swing,drag,shapes,Java,Swing,Drag,Shapes,所以,我试着点击并拖动一条线。我就快到了,但我想我在计算用户拖动的线的位置时遇到了问题。当我点击并拖动时,它确实会移动,只是不会以我想象的方式移动。我想我对这个代码有问题: @Override public void mouseDragged(MouseEvent e) { Point p = e.getPoint(); if (resizing) { endPoint.x = p.x;

所以,我试着点击并拖动一条线。我就快到了,但我想我在计算用户拖动的线的位置时遇到了问题。当我点击并拖动时,它确实会移动,只是不会以我想象的方式移动。我想我对这个代码有问题:

       @Override
        public void mouseDragged(MouseEvent e) {
            Point p = e.getPoint();
            if (resizing) {
                endPoint.x = p.x;
                endPoint.y = p.y;
                double offsetX = endPoint.x - startPoint.x;
                double offsetY = endPoint.y - startPoint.y;
                int newX1 = (int)(lines.get(currentIndex).getX1() - offsetX);
                int newX2 = (int)(lines.get(currentIndex).getX2() - offsetX);
                int newY1 = (int)(lines.get(currentIndex).getY1() - offsetY);
                int newY2 = (int)(lines.get(currentIndex).getY2() - offsetY);

                lines.get(currentIndex).setLine(newX1, newY1, newX2, newY2);

                repaint();
            }
        }
你知道我怎样才能让它工作吗

MCVE

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Panel;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Editor {

    public static void main(String[] args) {
        new Editor();
    }

    public Editor() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager
                            .getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException
                        | IllegalAccessException
                        | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new UMLWindow2();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setBounds(30, 30, 1000, 700);
                frame.getContentPane().setBackground(Color.white);
                frame.setVisible(true);
                frame.setLocationRelativeTo(null);
            }
        });
    }

    public static class UMLWindow2 extends JFrame {

        Shapes shapeList = new Shapes();
        Panel panel;

        private static final long serialVersionUID = 1L;

        public UMLWindow2() {
            addMenus();
            panel = new Panel();
        }

        public void addMenus() {

            getContentPane().add(shapeList);

            setSize(300, 200);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(EXIT_ON_CLOSE);

            shapeList.addLine();
        }
    }

    // Shapes class, used to draw the shapes on the panel
    // as well as implements the MouseListener for dragging
    public static class Shapes extends JPanel {

        private static final long serialVersionUID = 1L;

        private List<Line2D.Double> lines = new ArrayList<Line2D.Double>();
        private Line2D.Double linePath;

        double phi = Math.toRadians(40);
        int barb = 20;

        Boolean hovering = false;
        Boolean resizing = false;

        public Shapes() {
            MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
            addMouseListener(myMouseAdapter);
            addMouseMotionListener(myMouseAdapter);
        }

        public void addLine() {
            linePath = new Line2D.Double(300, 300, 500, 500);
            lines.add(linePath);
            repaint();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2 = (Graphics2D) g;
            g2.setStroke(new BasicStroke(2));
            for (Line2D line : lines) {
                g2.setColor(Color.BLACK);
                Point sw = new Point((int) line.getX1(), (int) line.getY1());
                Point ne = new Point((int) line.getX2(), (int) line.getY2());
                g2.draw(line);
                drawArrowHead(g2, ne, sw, Color.BLACK);
            }
        }

        private void drawArrowHead(Graphics2D g2, Point tip, Point tail,
                Color color) {
            g2.setPaint(color);
            double dy = tip.y - tail.y;
            double dx = tip.x - tail.x;
            double theta = Math.atan2(dy, dx);
            double x, y, rho = theta + phi;
            for (int j = 0; j < 2; j++) {
                x = tip.x - barb * Math.cos(rho);
                y = tip.y - barb * Math.sin(rho);
                g2.draw(new Line2D.Double(tip.x, tip.y, x, y));
                rho = theta - phi;
            }
        }

        class MyMouseAdapter extends MouseAdapter {
            int currentIndex;
            Point2D.Double startPoint = new Point2D.Double();
            Point2D.Double endPoint = new Point2D.Double();

            @Override
            public void mousePressed(MouseEvent e) {
                Point p = e.getPoint();
                if (hovering) {
                    System.out.println("Starting to resize");
                    startPoint.x = p.x;
                    startPoint.y = p.y;
                    resizing = true;
                }
            }

            @Override
            public void mouseDragged(MouseEvent e) {
                Point p = e.getPoint();
                if (resizing) {
                    endPoint.x = p.x;
                    endPoint.y = p.y;
                    double offsetX = endPoint.x - startPoint.x;
                    double offsetY = endPoint.y - startPoint.y;
                    System.out.println("Point 1: "
                            + lines.get(currentIndex).getX1() + ", "
                            + lines.get(currentIndex).getY1() + " Point 2: "
                            + lines.get(currentIndex).getX2() + ", "
                            + lines.get(currentIndex).getY2());
                    int newX1 = (int) (lines.get(currentIndex).getX1() + offsetX);
                    int newX2 = (int) (lines.get(currentIndex).getX2() + offsetX);
                    int newY1 = (int) (lines.get(currentIndex).getY1() + offsetY);
                    int newY2 = (int) (lines.get(currentIndex).getY2() + offsetY);

                    lines.get(currentIndex).setLine(newX1, newY1, newX2, newY2);

                    repaint();
                }
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                if (resizing) {
                    System.out.println("Done resizing");
                    resizing = false;
                }
            }

            @Override
            public void mouseMoved(MouseEvent e) {
                Point p = e.getPoint();
                Rectangle2D.Double rect = new Rectangle2D.Double(p.x - 1,
                        p.y - 1, 3, 3);
                for (int i = 0; i < lines.size(); i++) {
                    Line2D line = lines.get(i);
                    if (line.intersects(rect)) {
                        setCursor(new Cursor(Cursor.HAND_CURSOR));
                        currentIndex = i;
                        hovering = true;
                    } else {
                        setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                        hovering = false;
                    }
                }
            }

        }

    }
}
import java.awt.BasicStroke;
导入java.awt.Color;
导入java.awt.Cursor;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Panel;
导入java.awt.Point;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.geom.Line2D;
导入java.awt.geom.Point2D;
导入java.awt.geom.Rectangle2D;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类编辑器{
公共静态void main(字符串[]args){
新编辑();
}
公共编辑(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager
.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化异常
|非法访问例外
|不受支持的LookandFeelEx){
例如printStackTrace();
}
JFrame-frame=new-UMLWindow2();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架.立根(30,30,1000,700);
frame.getContentPane().setBackground(颜色:白色);
frame.setVisible(true);
frame.setLocationRelativeTo(空);
}
});
}
公共静态类UMLWindow2扩展了JFrame{
形状shapeList=新形状();
专家组;
私有静态最终长serialVersionUID=1L;
公共UMLWindow2(){
添加菜单();
面板=新面板();
}
公共无效添加菜单(){
getContentPane().add(shapeList);
设置大小(300200);
setLocationRelativeTo(空);
setDefaultCloseOperation(关闭时退出);
shapeList.addLine();
}
}
//Shapes类,用于在面板上绘制形状
//以及实现用于拖动的鼠标侦听器
公共静态类形状扩展了JPanel{
私有静态最终长serialVersionUID=1L;
私有列表行=新的ArrayList();
专用Line2D。双线路径;
双φ=数学环面(40);
int倒钩=20;
布尔悬停=假;
布尔调整大小=假;
公共形状(){
MyMouseAdapter MyMouseAdapter=新的MyMouseAdapter();
addMouseListener(myMouseAdapter);
addMouseMotionListener(myMouseAdapter);
}
公共void addLine(){
linePath=新的Line2D.Double(300300500500);
行。添加(行路径);
重新油漆();
}
@凌驾
受保护组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
g2.设定行程(新基本行程(2));
用于(线条2D线条:线条){
g2.设置颜色(颜色为黑色);
点sw=新点((int)line.getX1(),(int)line.getY1());
点ne=新点((int)line.getX2(),(int)line.getY2());
g2.画(线);
牵引箭头(g2,东北,西南,彩色。黑色);
}
}
专用空心图纸箭头(图形2D g2、点尖、点尾、,
颜色(颜色){
g2.设置油漆(颜色);
双dy=尖端.y-尾部.y;
双dx=尖端x-尾部x;
双θ=Math.atan2(dy,dx);
双x,y,ρ=θ+φ;
对于(int j=0;j<2;j++){
x=尖端x-倒钩*数学cos(rho);
y=tip.y-barb*Math.sin(rho);
g2.绘制(新线2D.Double(尖端x,尖端y,x,y));
ρ=θ-φ;
}
}
类MyMouseAdapter扩展了MouseAdapter{
int-currentIndex;
Point2D.Double startPoint=新的Point2D.Double();
Point2D.Double端点=新的Point2D.Double();
@凌驾
公共无效鼠标按下(MouseEvent e){
点p=e.getPoint();
如果(悬停){
System.out.println(“开始调整大小”);
起点x=p.x;
起点y=p.y;
调整大小=真;
}
}
@凌驾
公共无效鼠标标记(鼠标事件e){
点p=e.getPoint();
如果(调整大小){
终点x=p.x;
终点y=p.y;
双偏移量x=端点.x-起点.x;
double offsetY=endPoint.y—startPoint.y;
System.out.println(“第1点:
+line.get(currentIndex.getX1()+“,”
+line.get(currentIndex.getY1()+“第2点:”
+line.get(currentIndex.getX2()+“,”
+get(currentIndex.getY2());
int newX1=(int)(lines.get(currentIndex.getX1()+offsetX);
int newX2=(int)(lines.get(currentIndex.getX2()+offsetX);
int newY1=(int)(lines.get(currentIndex.getY1()+offsetY);
int newY2=(int)(lines.get(currentIndex.getY2()+offsetY);
line.get(currentIndex).setLine(newX1,new
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.border.*;

public class ShapeComponentTest
{
    private static void createAndShowUI()
    {
        Border line = new LineBorder(Color.BLUE, 5);

        Polygon outer = new Polygon();
        outer.addPoint(0, 50);
        outer.addPoint(50, 25);
        outer.addPoint(0, 0);
        Polygon inner = new Polygon();
        inner.addPoint(0, 45);
        inner.addPoint(43, 25);
        inner.addPoint(0, 5);

        Area arrow = new Area(outer);
        arrow.subtract(new Area(inner));

        GeneralPath part1 = new GeneralPath();
        part1.moveTo(0, 50);
        part1.lineTo(50, 25);
        part1.lineTo(0, 0);

        ShapeComponent ball = new ShapeComponent( arrow ); // drags correctly
//      OutlineComponent ball = new OutlineComponent( part1, 3 ); // drags incorrectly
        ball.setForeground(Color.ORANGE);
        ball.setBorder( line );
        ball.setSize( ball.getPreferredSize() );

        OutlineComponent square = new OutlineComponent( new Rectangle(30, 30) );
        square.setForeground(Color.ORANGE);
        square.setLocation(50, 50);
        square.setBorder(line);
        square.setSize( square.getPreferredSize() );

        OutlineComponent star = new OutlineComponent( ShapeUtils.radiusShape(16, 20, 8) );

        star.setForeground(Color.ORANGE);
        star.setLocation(100, 100);
        star.setBorder(line);
        star.setSize( star.getPreferredSize() );

        ComponentMover cm = new ComponentMover();
        cm.registerComponent(star);
        cm.registerComponent(ball);
        cm.registerComponent(square);

        JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.add(ball);
        panel.add(square);
        panel.add(star);

        JFrame frame = new JFrame(); frame.add(panel);
        frame.setSize(200, 200); frame.setVisible(true);

        MouseListener ml = new MouseAdapter()
        {
            public void mouseClicked( MouseEvent e )
            {
                System.out.println( "clicked " );
            }
        };

        ball.addMouseListener( ml );
        square.addMouseListener( ml );
        star.addMouseListener( ml );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}