如何将MouseListener添加到Java Swing Canvas上的项目

我想创建一个Java面板,用于创建用户单击的对象。由于我的实际应用程序使用MVC方法,我也希望这些对象能够在模型更改时重新绘制自己,并提供更改其属性的菜单。


我认为控制x和y位置的最佳方法是采用基于画布的方法,从方法中JPanel调用这些对象的draw paintComponent方法。然而,这只会在画布上绘制形状,并且不会添加对象本身而失去控制对象属性的所有能力。如果有人能告诉我最适合自己想做的事情,我将非常感激。


我已经创建了一些示例代码,可以在下面看到。单击时,我希望圆圈改变颜色,这是使用MouseListener实现的(它基本上代表在这个小例子中更改模型属性)。此外,我还想确保放大/缩小仍然适用于任何示例代码/建议可以提供,所以我添加了按钮来放大和缩小对象作为快速测试。


import java.awt.*;

import java.awt.event.*;

import java.awt.geom.*;

import javax.swing.*;

import java.awt.geom.Ellipse2D;


public class Main  {


    public static void main(String args[]) {

        EventQueue.invokeLater(new Runnable() {


            @Override

            public void run() {

                JFrame frame = new JFrame();

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


                ExamplePanel panel = new ExamplePanel();


                frame.add(panel);

                frame.pack();

                frame.setVisible(true);

            }

        });

    }


    //I could not get this to with when it extended JLayeredPane

    private static class ExamplePanel extends JPanel {

        private static final int maxX = 500;

        private static final int maxY = 500;

        private static double zoom = 1;

        private static final Circle circle = new Circle(100, 100);

顺便说一句,我确实尝试使用JLayeredPane(有用,因为我也喜欢将我的对象分层),但无法让我的对象甚至渲染。我知道它没有默认的布局管理器所以尝试setBounds在构造函数中调用圆圈,但遗憾的是它没有用。我知道使用布局管理器更好,但似乎找不到适合我需求的布局管理器!


提前致谢。


守着一只汪
浏览 536回答 2
2回答

幕布斯7119047

我只想补充一点,我修复了缩放问题,而不是以答案建议的方式,而只是通过在ExamplePanelpaintComponent方法中保留应用缩放变换调用的行:g2.scale(zoom, zoom);我认为这是最好的实现,因为没有任何组件需要任何关于缩放的知识,它似乎比JLayer我只需要基本的缩放功能要简单得多。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java