首页 > 解决方案 > 如何响应鼠标单击形状

问题描述

我想创建一个小功能,我:

  1. 用户可以选择任意数量的对象(如线、圆等)进行偏移。
  2. 用户将右键单击他们想要垂直偏移的对象,并提供一个可输入的字段来指定偏移距离。
  3. 单击#2 中的“确定”按钮后,对象将从选定对象和空间的中心开始偏移指定距离,直到所有选定对象都已放置。

我是 Swing 框架的新手,我已经学会了如何创建对象和动作侦听器。请帮助我这样做。

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import javax.swing.JComponent;

public class Line extends JComponent {

   private final Point2D start, end;

    public Line( Point2D start, Point2D end){
        this.start = start;
        this.end = end;
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("mouse clicked");
            }
        });
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.BLACK);
        g2.setStroke(new BasicStroke(2.0F));
        g2.draw(new Line2D.Double(start,end));
    }
}

标签: javaswing

解决方案


在您通过将问题划分为较小的问题来解决问题。
您需要做的第一件事是识别鼠标在一行上的点击。
实现它的一种方法是拥有一个像这样的自定义组件:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import javax.swing.JComponent;

public class Line extends JComponent {

   private final Point2D start, end;

    public Line( Point2D start, Point2D end){
        this.start = start;
        this.end = end;
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("mouse clicked");
            }
        });
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.BLACK);
        g2.setStroke(new BasicStroke(2.0F));
        g2.draw(new Line2D.Double(start,end));
    }
}

尝试使用它在JPanel.
尝试画几条线并确定点击了哪条线。
之后尝试移动单击的行。


推荐阅读