繁体   English   中英

对多个动作使用相同的 MouseListener 事件,在 java swing 中绘图

[英]Using same MouseListener event for multiple actions, drawing in java swing

一般来说,我仍在学习 java,所以我可以使用一些帮助。 我创建了一个弹出菜单,当我在面板上单击鼠标左键时会打开它。 弹出菜单使用 MouseListener 读取需要打开的坐标。 现在我想在打开弹出菜单的地方使用相同的 x 和 y 来绘制我从该位置的菜单中选择的形状(如果形状是一个点,它应该在菜单打开的地方绘制,如果我选择一条线的话,线的起点将在该位置)。 这是到目前为止的代码:

public class PnlDrawing extends JPanel {
public ArrayList<Shape> shapes = new ArrayList<Shape>();

public PnlDrawing() {
    setSize(800,600);
}

public static void main(String[] args) {
    
    JFrame frame = new JFrame("PnlDrawing");
    frame.setSize(800, 600);
    PnlDrawing drawing = new PnlDrawing();
    frame.getContentPane().add(drawing);
    frame.setVisible(true);
    
    final JMenu subPopup = new JMenu("Add");
    
    final JMenuItem popPoint = new JMenuItem("Point");
    popPoint.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            
        }
    });
    final JMenuItem popLine = new JMenuItem("Line");
    popLine.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            
        }
    });
    final JMenuItem popCircle = new JMenuItem("Circle");
    popCircle.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            
        }
    });
    final JMenuItem popDonut = new JMenuItem("Donut");
    popDonut.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            
        }
    });
    final JMenuItem popRectangle = new JMenuItem("Rectangle");
    popRectangle.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            
        }
    });
    
    final JMenuItem popMod = new JMenuItem("Modify");
    popMod.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            
        }
    });
    final JMenuItem popRemove = new JMenuItem("Remove");
    popRemove.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            
        }
    });
    
    frame.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseReleased(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e)) {
                JPopupMenu mainPopup = new JPopupMenu();
                subPopup.add(popPoint);
                subPopup.add(popLine);
                subPopup.add(popCircle);
                subPopup.add(popDonut);
                subPopup.add(popRectangle);
                mainPopup.add(subPopup);
                mainPopup.addSeparator();
                mainPopup.add(popMod);
                mainPopup.add(popRemove);
                mainPopup.show(e.getComponent(), e.getX(), e.getY());
            
            }
        }
    });
}

@Override
public void paint(Graphics g) {
    for (int i = 0; i < shapes.size(); i++)
    {
        shapes.get(i).draw(g);
    }
}

}

我已经为每个形状和绘制方法实现了类。 我只需要将这个菜单与绘图和鼠标 position 连接起来,这样当我单击 Add -> Point 时它就会出现在面板上。 如果你有任何其他方式来做这一切,我很乐意听到。

  1. 您的所有代码都不应该包含在 main() 方法中。 main() 方法应该做的就是创建框架并将“DrawingPanel”的一个实例添加到框架中。 为您的课程使用描述性名称。 没有理由使用“Pnl”作为缩写。

  2. main() 方法中逻辑的所有 rest 应移动到绘图面板 class。

  3. 自定义绘画是通过覆盖 DrawingPanel class 的 paintComponent(...) 方法来完成的。 阅读 Swing 教程中关于自定义绘画的部分,以获取帮助您入门的工作示例。 使用教程示例作为起点,因为它将为您的代码演示更好的结构,因此所有组件都在Event Dispatch Thread (EDT)上创建。

  4. 当使用右键单击时,通常会显示一个弹出菜单。 阅读有关启动弹出菜单的教程部分。

  5. 不要每次都在 MouseListener 中重新创建弹出菜单。 在 class 的构造函数中创建弹出窗口,并在必要时显示它。

现在我想使用相同的 x 和 y 打开弹出菜单来绘制形状

在 class 中创建一个实例变量,如“mousePressed”。 然后是鼠标侦听器的 mousePressed 事件,您可以更新“mousePressed”变量以反映鼠标 position。 然后,在将 Shape 添加到列表时,您的所有 ActionListener 都将引用此变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM