感应悬停在 JPanel 中 Path2D 圆的外边缘上[重复]

2024-01-11

因此,我有一个程序可以将 Path2D 圆绘制到 JPanel 上。我想要做的是当用户单击并拖动圆圈的右下角时调整圆圈的大小。所以,我想要的是检测它们何时在圆的右下角外边缘,而不是圆周围边界的右下角。基本上,我需要弄清楚如何做这样的事情:

我知道如何使用 getBounds() 对矩形执行此操作,但是当您在圆上使用 getBounds() 时,它将返回圆周围的正方形,而不是实际圆的边界。关于如何让它发挥作用有什么想法吗?谢谢!

这是我的程序的一个缩短的、可运行的版本:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Editor {

    public static void main(String[] args) {

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

class UMLWindow extends JFrame {
    Shapes shapeList = new Shapes();
    Panel panel;

    private static final long serialVersionUID = 1L;

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

    public void addMenus() {

        getContentPane().add(shapeList);

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

        shapeList.addCircle(100, 100);
    }
}

// Shapes class, used to draw the shapes on the panel
// as well as implements the MouseListener for dragging
class Shapes extends JPanel {
    private static final long serialVersionUID = 1L;

    private List<Path2D> shapes = new ArrayList<Path2D>();
    int currentIndex;

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

    public void addCircle(int width, int height) {
        Path2D circ = new Path2D.Double();
        circ.append(new Ellipse2D.Double(442, 269, width, height), true);
        shapes.add(circ);
        repaint();
    }

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

        Graphics2D g2 = (Graphics2D) g;
        g2.setStroke(new BasicStroke(2));
        for (Path2D shape : shapes) {
            g2.draw(shape);
        }
    }

    class MyMouseAdapter extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {

        }

        @Override
        public void mouseDragged(MouseEvent e) {
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }
    }
}

你会想要温习你的三角函数(或者像我一样进行谷歌搜索;))。基本概念“相对”简单,但我为我的所有工作创建了一个很好的方法......

这个方法...

public Point2D getPointOnEdge(float angel, Rectangle bounds) {

    float radius = Math.max(bounds.width, bounds.height) / 2;

    float x = radius;
    float y = radius;

    double rads = Math.toRadians((angel + 90));

    // Calculate the outter point of the line
    float xPosy = (float) (x + Math.cos(rads) * radius);
    float yPosy = (float) (y + Math.sin(rads) * radius);

    return new Point2D.Float(xPosy + bounds.x, yPosy + bounds.y);

}

将计算给定角度将出现在圆上的 x/y 点,请记住,这仅适用于圆!

然后我用另一种方法...

public Rectangle2D getActiveBounds(float angel, Rectangle bounds) {

    Point2D p = getPointOnEdge(angel, bounds);

    return new Rectangle2D.Double(p.getX() - 4, p.getY() - 4, 8, 8);

}

要计算我认为是底部/右侧区域的“鼠标区域”,因为很难找到单个像素并简单地使用Rectangle#contains,将当前鼠标位置传递给它...

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
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 UMLWindow();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setBounds(30, 30, 1000, 700);
                frame.getContentPane().setBackground(Color.white);
                frame.setVisible(true);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class UMLWindow extends JFrame {

        Shapes shapeList = new Shapes();
        Panel panel;

        private static final long serialVersionUID = 1L;

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

        public void addMenus() {

            getContentPane().add(shapeList);

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

            shapeList.addCircle(100, 100);
        }
    }

// 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<Path2D> shapes = new ArrayList<Path2D>();
        int currentIndex;

        private Point mousePoint;

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

        public void addCircle(int width, int height) {
            Path2D circ = new Path2D.Double();
            circ.append(new Ellipse2D.Double(442, 269, width, height), true);
            shapes.add(circ);
            repaint();
        }

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

            Graphics2D g2 = (Graphics2D) g;
            g2.setStroke(new BasicStroke(2));
            for (Path2D shape : shapes) {
                g2.setColor(Color.BLACK);
                g2.draw(shape);

                g2.setColor(Color.RED);
                Rectangle2D bottomRight = getActiveBounds(-45, shape.getBounds());

                g2.draw(bottomRight);
                if (mousePoint != null) {

                    if (bottomRight.contains(mousePoint)) {
                        g2.fill(bottomRight);
                    }

                }

            }
        }

        public Rectangle2D getActiveBounds(float angel, Rectangle bounds) {

            Point2D p = getPointOnEdge(angel, bounds);

            return new Rectangle2D.Double(p.getX() - 4, p.getY() - 4, 8, 8);

        }

        public Point2D getPointOnEdge(float angel, Rectangle bounds) {

            float radius = Math.max(bounds.width, bounds.height) / 2;

            float x = radius;
            float y = radius;

            double rads = Math.toRadians((angel + 90));

            // Calculate the outter point of the line
            float xPosy = (float) (x + Math.cos(rads) * radius);
            float yPosy = (float) (y + Math.sin(rads) * radius);

            return new Point2D.Float(xPosy + bounds.x, yPosy + bounds.y);

        }

        class MyMouseAdapter extends MouseAdapter {

            @Override
            public void mouseMoved(MouseEvent e) {
                mousePoint = e.getPoint();
                repaint();
            }

        }
    }

}

这个示例完成了 Paint 方法中的所有工作,因为我想查看“效果区域”,您可以轻松地使用相同的逻辑来更改 Paint 方法中的鼠标光标MouseMoitionListener

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

感应悬停在 JPanel 中 Path2D 圆的外边缘上[重复] 的相关文章

  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • boto 和“In”比较器

    我正在尝试将 In 比较器与 boto 一起使用来指定 Mechanical Turk 作业的多个区域设置 这个答案 https stackoverflow com a 25122804 1599229说这是可能的 也是如此AMT 文档 h
  • Socket.Shutdown 抛出 SocketException

    我正在尝试为我的项目实现异步套接字 这是代码 public void Start int listeningPort var ipHostInfo Dns Resolve Dns GetHostName var ipAddress ipHo
  • 正则表达式蛋白质消化

    因此 我正在用一种酶 出于你的好奇心 Asp N 消化蛋白质序列 该酶在单字母编码序列中 B 或 D 编码的蛋白质之前进行切割 我的实际分析使用String scan用于捕获 我试图找出为什么以下正则表达式不能正确消化它 w BD b 先行
  • 如何在vscode终端中将i386 arch更改为arm64?

    如何在vscode终端中将i386 arch更改为arm64 m2 Pro 硅 我问因为yarn and npm无法在 vscode 终端中工作 但在外部终端 iterm2 终端 中完美工作 vscode 终端 https i stack
  • Rust 链接器寻找 LIB,而不是 DLL

    我正在 Windows 上尝试 Rust 我的代码声明并调用外部库中的函数 声明是这样的 link name Rvea0326nc 64 extern C fn WeibullSpeedProbability wa f32 wk f32 q
  • 无休止的动画、requestAnimationFrame 和调用堆栈限制

    我正在开发一个小项目 该项目使用 Twitter 流 API 并从中制作一些画布动画 鉴于 Twitter 流 API 没有结束 动画可能会无限期地继续下去 问题就在于此 requestAnimationFrame似乎是通过递归进行操作的
  • 使用 shell 迭代文件

    我有两个输入文件 每行都有名单 mm dd 形式 使用持续时间和其他主机名内容 另一个是我生成的 每行都有一组不重复的名单 我正在尝试编写一个 shell 命令来遍历带有名单的文件 将它们存储为变量并检查其他文件以匹配名称 然后输出每个人的
  • xna 中 spritebatch.draw 中的源矩形是什么

    SpriteBatch Draw 方法中源矩形参数的用途是什么 MSDN 说 A rectangle that specifies in texels the source texels from a texture Use null to
  • 使用 Adob​​e AIR 开发 Android 移动应用程序

    谁能提供使用 Eclipse SDK 和 Adob e AIR 开发 Android 移动应用程序之间的比较信息 请任何已经有使用 Adob e AIR 开发 Android 移动应用程序经验的人分享您的意见 我已经阅读了有关开发 Adob
  • 可以请求从 htmlhelper 访问查询字符串

    你好 可以在 HTMLHelper 扩展方法中访问查询字符串 我们需要根据请求中的查询字符串进行不同的渲染 是的 通过当前上下文 这是 HTML Helper 上的一个属性 public static string DoThis this
  • Three.JS Orbit Controls - 启用和禁用,无需位置跳跃

    我正在使用 Three JS 创建一个几何操作原型 我正在使用 OrbitControls JS 来操作相机 但在启用和禁用控件时遇到问题 这是我的演示 http moczys com webGL Prototype V02 05 html
  • 标头位置无法正常工作

    我的网址是 1006 我这里有一个没有任何操作的表格
  • 如何使 is_pod 测试在编译期间执行而不是执行期间执行?

    这可能是一个简单的问题 我根本不掌握 C 11 模板 我有一个通用向量类 但不是std vector
  • jQuery - 轮询作业队列

    我有一个包含作业队列的数据库表 一个单独的程序处理这些作业 我想提供一个网页供用户观看队列的进度 用于查询表并以 JSON 格式返回的服务器端脚本没有问题 我读过一些关于 jQuery 和期刊更新插件 http enfranchisedmi
  • 为什么片段类可能无效?

    我刚刚使用 AndroidStudio 向导创建了一个 PreferenceActivity 运行它引发了一个奇怪的异常 java lang RuntimeException Subclasses of PreferenceActivity
  • 使用下面的 uiimagePickerController Delegate 函数时获得不明确的引用:

    我试图覆盖 UIImagePickerControllerDelegate 中的 uiimagePickerController 函数 但是 我似乎收到错误 Ambiguous reference to member subscript 我
  • Android简单的警报对话框[重复]

    这个问题在这里已经有答案了 我需要向点击我的 Android 应用程序上的按钮的用户显示一条小短信 在 IOS 上我只需要创建一个 AlertView 它使用起来很简单 但在 Android 上我很困难 因为解决方案似乎困难十倍 我看到我需
  • IIS7:如何定义Windows身份验证已打开?

    IIS7 如何定义Windows身份验证已打开 我知道IIS7 集成模式不支持两阶段身份验证 https stackoverflow com questions 436169 iis7 setup integrated windows au
  • 从bind返回的结果和使用function()的结果有什么区别

    bind 的返回值与通过 function 创建等效值的结果有什么区别 有什么有效的区别吗 我不是在问上下文保留属性bind 是否有任何技术 性能原因导致您可能更喜欢一种方法 i e var myFunc foo bind undefine
  • 感应悬停在 JPanel 中 Path2D 圆的外边缘上[重复]

    这个问题在这里已经有答案了 因此 我有一个程序可以将 Path2D 圆绘制到 JPanel 上 我想要做的是当用户单击并拖动圆圈的右下角时调整圆圈的大小 所以 我想要的是检测它们何时在圆的右下角外边缘 而不是圆周围边界的右下角 基本上 我需