0

我在屏幕中间创建了两条线,这是一个正号,我只想在单击它时拖动正号,但它仅在我单击屏幕上的任意位置时才有效,我希望拖动该符号只有当我点击它而不是当我点击屏幕上的其他任何地方时。我希望任何人都可以帮助我完成这项工作。这是下面的代码

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;

public class Main extends JPanel {
    public static void main(String args[]) throws Exception {
        JFrame f = new JFrame("Shapes");
        f.setSize(600, 600);
        f.setLocation(300, 300);

        f.setResizable(true);
        JPanel p = new JPanel() {
            Point pointStart = null;
            Point pointEnd = null;
            int x2 = 250;
            int y2 = 175;


            private Shape lineMp = null;
            private Shape lineMn = null;
            {

                lineMn = new Line2D.Double(235,175,265,175);
                lineMp = new Line2D.Double(250,160,250,190);

                Point newPoint = new Point();

                MouseAdapter mouseAdapter = new MouseAdapter() {
                    private Point prevPoint;
                    @Override
                    public void mousePressed(MouseEvent e) {
                        prevPoint = e.getPoint();
                        System.out.println("Prev Point=" + prevPoint.toString());
                        repaint();
                    }
                    @Override
                    public void mouseDragged(MouseEvent e) {
                        int dx = 0;
                        int dy = 0;
                        dx = (int) (prevPoint.x - e.getPoint().getX());
                        dy = (int) (prevPoint.y - e.getPoint().getY());
                        Line2D shapeMn = (Line2D) lineMn;
                        Line2D shapeMp = (Line2D) lineMp;


                        int nx2 = (int) (shapeMn.getX2() - dx);
                        int ny2 = (int) (shapeMn.getY2() - dy);

                        int px2 = (int) (shapeMp.getX2() - dx);
                        int py2 = (int) (shapeMp.getY2() - dy);

                        int x1 = (int) (shapeMn.getX1() - dx);
                        int y1 = (int) (shapeMn.getY1() - dy);

                        int px1 = (int) (shapeMp.getX1() - dx);
                        int py1 = (int) (shapeMp.getY1() - dy);

                        Point startPointMn = new Point(x1, y1);
                        Point endPointMn = new Point(nx2, ny2);
                        Point startPointMp = new Point(px1, py1);
                        Point endPointMp = new Point(px2, py2);

                        Point endPoint = new Point(x2, y2);
                        if (shapeMn != null) {
                            shapeMn.setLine(startPointMn, endPointMn);
                            prevPoint = e.getPoint();
                            repaint();
                        }
                        if (shapeMp != null) {
                            shapeMp.setLine(startPointMp, endPointMp);
                            prevPoint = e.getPoint();
                            repaint();
                        }
                    }
                    @Override
                    public void mouseReleased(MouseEvent e) {
                        repaint();
                    }
                };
                addMouseListener(mouseAdapter);
                addMouseMotionListener(mouseAdapter);
            }

            public void paint(Graphics g) {
                super.paint(g);
                Graphics2D g2d = (Graphics2D) g;
                g2d.setStroke(new java.awt.BasicStroke(2));
                g2d.drawRect(100,100,300,150);
            }

            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                g2d.setPaint(Color.BLUE);
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
                if (lineMn != null){
                    g2d.draw(lineMn);
                    g2d.draw(lineMp);
                    }
            }};
        f.add(p);
        p.setLayout(null);
        f.setVisible(true);

    }
}
4

3 回答 3

1

您“可能”有几种方法可以做到这一点,但对我来说,我会尝试将两条线组合成一个形状,这样您就可以计算它们的绑定框,然后进行简单的命中测试

例如...

@Override
public void mouseDragged(MouseEvent e) {

    GeneralPath gp = new GeneralPath();
    gp.append(lineMn, false);
    gp.append(lineMp, false);

    Point p = e.getPoint();

    if (!gp.getBounds().contains(p)) {
        return;
    }

现在,请注意,“这个”实现不是很有效。相反,我会在早期将线条组合成一个形状并继续移动它。

于 2019-12-20T00:42:34.027 回答
0

您可以尝试使用图像而不是线条并使用 WASD。我的游戏使用它。

于 2019-12-20T00:19:50.610 回答
0
ourFrame.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
    System.out.println("Key pressed code=" + e.getKeyCode() + ", char=" + e.getKeyChar());
    push = e.getKeyCode();

    if(push == 87){//w
         if(y > -9){//blocker
         picLabel.setBounds(x, y, 80, 40);
         y  = y + -10;
        // System.out.println("Cubie is going up at, " + x + "," + y);

    }}
    if(push == 65){//a
         if(x > -29){//blocker
         picLabel.setBounds(x, y, 80, 40);
         x  = x + -10;
        // System.out.println("Cubie is going left at, " + x + "," + y);
    }}
    if(push == 83){//s
         if(y < 421){//blocker
         picLabel.setBounds(x, y, 80, 40);
         y  = y + 10;
        // System.out.println("Cubie is going down at, " + x + "," + y);
    }}
    if(push == 68){//d
         if(x < 621){//blocker
         picLabel.setBounds(x, y, 80, 40);

        //System.out.println("Cubie is going right at, " + x + "," + y);
         x  = x + 10;
    }}
于 2019-12-20T00:26:46.080 回答