【问题标题】:Catching Polygons on JPanel在 JPanel 上捕捉多边形
【发布时间】:2015-04-21 15:23:53
【问题描述】:

我正在尝试制作一个支持不同角度矩形的地图编辑器(因此它使用多边形绘制矩形)。我想在不使用数学计算的情况下通过它们在框架上的位置来捕捉多边形。

有没有支持这种东西的命令?

我试图通过视觉表现来捕捉多边形:

public void mousePressed(MouseEvent e){
 Component component = getComponentAt(e.getX(), e.getY());
  if(component instanceof wall){

但它不起作用。

(如果我只是简单地绘制矩形,我会使用 JPanel 并使用 setbounds 命令来绘制矩形,但我认为我不能制作多边形形状的 JPanel)

【问题讨论】:

    标签: java swing jpanel polygon


    【解决方案1】:

    您首先需要创建一个列表,其中包含您要绘制的所有多边形:

    Shape circle = new Ellipse2D.Double(0, 0, 30, 30);
    List<Shape> shapes = new ArrayList<Shape>();
    shapes.add( circle );
    

    然后在您的 paintComponent() 方法中遍历列表中的所有形状:

    Graphics2D g2d = (Graphics2D)g.create();
    
    for (Shape shape : shapes)
    {
        g2d.draw( shape );
    }
    
    g2d.dispose();
    

    然后在 MouseListener 中遍历 List 以查看单击了哪个 Shape:

    public void mousePressed(MouseEvent e)
    {
        for (Shape shape : shapes)
        {
            if (shape.contains(e.getPoint())
                // do something
        }
    
    }
    

    如果我只是简单地绘制矩形,我会使用 JPanel 并使用 setbounds 命令来绘制矩形,但我认为我不能制作多边形形状的 JPanel

    对于使用组件的替代方法,请查看Playing With Shapes。那里的类​​允许您使用任何形状创建ShapeComponent

    【讨论】:

    • 谢谢你,先生,我现在对形状的工作原理有了更多的了解,希望我的代码能在你的帮助下工作:)
    【解决方案2】:

    您不会使用单独的 JPanel 来绘制每个多边形。您将使用扩展 JPanel 的单个类,然后覆盖 paintComponent() 方法来绘制多边形。更多信息here.

    将多边形绘制到 JPanel 后,您可以使用 Polygon.contains() 方法测试鼠标是否在 JPanel 内。更多信息请访问the API

    【讨论】:

    • 谢谢您的回答好先生,虽然 camickr 的回答似乎是做我想做的事情的“正确方式”,但您建议的方式将更容易实施,所以我会和这个一起去的:)
    • @Eren Camickr 和我提出了相同的解决方案。
    • 哦,所以 Polygons.contains 方法与 Shape.contains 方法相同,我明白了,谢谢。我认为 Polygons.contains 方法是 Polygon api 的特定代码 BTW 油漆组件和油漆之间是否存在显着差异,因为我使用油漆
    • @Eren 你应该使用paintComponent。我链接的教程解释了原因,但基本上 paint() 方法为您处理双缓冲之类的东西,所以您不应该弄乱它。
    • 谢谢你,我将在未来的日期查看教程,因为我现在要睡觉了,但我想告诉你,感谢你和 camickr,我设法让代码正常工作。跨度>
    猜你喜欢
    • 2011-09-14
    • 2020-11-11
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多