对多个动作使用相同的MouseListener事件,在JavaSwing中绘制

对多个动作使用相同的MouseListener事件,在JavaSwing中绘制,java,swing,draw,mouselistener,Java,Swing,Draw,Mouselistener,我还在学习java的过程中,所以我需要一些帮助。 我已经创建了一个弹出菜单,当我左键单击面板时打开。弹出菜单使用MouseListener读取需要打开的坐标。 现在,我想在弹出菜单打开的位置使用相同的x和y来绘制我从该位置的菜单中选择的形状(如果形状是一个点,它应该在菜单打开的位置绘制,如果我选择一条线,那么线的起点将在该位置)。以下是迄今为止的代码: public class PnlDrawing extends JPanel { public ArrayList<Shape> s

我还在学习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);
    }
}
公共类PnlDrawing扩展了JPanel{
public ArrayList shapes=new ArrayList();
公共PnlDrawing(){
设置大小(800600);
}
公共静态void main(字符串[]args){
JFrame=新JFrame(“PnlDrawing”);
框架设置尺寸(800600);
PnlDrawing drawing=新的PnlDrawing();
frame.getContentPane().add(绘图);
frame.setVisible(true);
最终JMenu子菜单=新JMenu(“添加”);
最终JMenuItem popPoint=新JMenuItem(“点”);
addActionListener(新ActionListener()){
已执行的公共无效操作(操作事件e){
}
});
最终JMenuItem popLine=新JMenuItem(“行”);
addActionListener(新ActionListener()){
已执行的公共无效操作(操作事件e){
}
});
最终JMenuItem popCircle=新JMenuItem(“圆”);
addActionListener(新的ActionListener(){
已执行的公共无效操作(操作事件e){
}
});
最终JMenuItem炸面圈=新的JMenuItem(“炸面圈”);
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
}
});
final JMenuItem popRectangle=新JMenuItem(“矩形”);
addActionListener(新建ActionListener()){
已执行的公共无效操作(操作事件e){
}
});
最终JMenuItem popMod=新JMenuItem(“修改”);
popMod.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
}
});
最终JMenuItem popRemove=新JMenuItem(“Remove”);
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
}
});
frame.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效MouseEvent(MouseEvent e){
if(SwingUtilities.isLeftMouseButton(e)){
JPopupMenu mainpoop=新的JPopupMenu();
子项添加(popPoint);
子项添加(popLine);
子项添加(popCircle);
子产品添加(炸面圈);
子种群添加(popRectangle);
主弹出窗口。添加(子弹出窗口);
mainpoop.addSeparator();
mainpoop.add(popMod);
mainpoop.add(popRemove);
show(e.getComponent(),e.getX(),e.getY());
}
}
});
}
@凌驾
公共空间涂料(图g){
对于(int i=0;i
}

我已经为每个shape和draw方法实现了类。我只需要将此菜单与绘图和鼠标位置连接起来,这样当我单击“添加->点”时,它就会显示在面板上。 如果你有其他的方法来做这一切,我很乐意听你这么说

  • main()方法中不应包含所有代码。main()方法所要做的就是创建框架,并将“DrawingPanel”的实例添加到框架中。为类使用描述性名称。没有理由使用“Pnl”作为缩写

  • main()方法中的所有其余逻辑都应移到DrawingPanel类中

  • 自定义绘制通过重写DrawingPanel类的paintComponent(…)方法完成。阅读Swing教程中关于工作示例的部分,开始学习。使用教程示例作为起点,因为它将为您的代码演示更好的结构,因此所有组件都是在
    事件调度线程(EDT)
    上创建的

  • 使用鼠标右键单击时,通常会显示弹出菜单。阅读上的教程中的部分

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

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

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