为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2019-09-18 10:20:18
我想创建一个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在构造函数中调用圆圈,但遗憾的是它没有用。我知道使用布局管理器更好,但似乎找不到适合我需求的布局管理器!提前致谢。
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

我只想补充一点,我修复了缩放问题,而不是以答案建议的方式,而只是通过在ExamplePanelpaintComponent方法中保留应用缩放变换调用的行:


g2.scale(zoom, zoom);

我认为这是最好的实现,因为没有任何组件需要任何关于缩放的知识,它似乎比JLayer我只需要基本的缩放功能要简单得多。


查看完整回答
反对 回复 2019-09-18
  • 2 回答
  • 0 关注
  • 535 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信