在JavaSwing中的菜单项上使用鼠标侦听器

在JavaSwing中的菜单项上使用鼠标侦听器,java,swing,mouseevent,mouselistener,Java,Swing,Mouseevent,Mouselistener,我感觉不到菜单项上的点击。我需要在“创建”菜单上单击“道路”菜单项时创建一条线,但单击它时什么也没有发生 import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import java.awt.e

我感觉不到菜单项上的点击。我需要在“创建”菜单上单击“道路”菜单项时创建一条线,但单击它时什么也没有发生

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JMenu;
import java.awt.Color;
public class trafficSimulator extends JFrame {
    private JPanel contentPane;
    /**
     * Launch the application.
     */

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    trafficSimulator frame = new trafficSimulator();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public trafficSimulator() {
        setTitle("STS - Simple Traffic Simulator");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 817, 458);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JPanel panel = new JPanel();
        panel.setBackground(Color.BLACK);
        panel.setBounds(10, 59, 777, 339);
        contentPane.add(panel);

        JMenuBar menuBar = new JMenuBar();
        menuBar.setBorderPainted(false);
        menuBar.setBounds(0, 0, 799, 36);
        contentPane.add(menuBar);

        JMenu mnCreate = new JMenu("Create");
        menuBar.add(mnCreate);

        JMenuItem mnıtmRoad = new JMenuItem("Road");
        mnıtmRoad.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                 DrawLine myline = new DrawLine();

                    panel.add(myline);  // this part doesn't work at all.
            }
        });





        mnCreate.add(mnıtmRoad);

        JMenuItem mnıtmRoundabout = new JMenuItem("Roundabout");
        mnCreate.add(mnıtmRoundabout);

        JMenuItem mnıtmNode = new JMenuItem("Node");
        mnCreate.add(mnıtmNode);

        JMenu mnDelete = new JMenu("Delete");
        menuBar.add(mnDelete);

        JMenu mnSave = new JMenu("Save");
        menuBar.add(mnSave);
    }


}
这是一个类,我将在鼠标侦听器中使用它的对象来创建一行

import java.awt.*;
import javax.swing.*;

public class DrawLine extends JPanel {

  public void paintComponent(Graphics g) {

     //vertical line
     g.setColor(Color.white);
     g.drawLine(20, 20, 20, 120);

  }}
在JavaSwing中的菜单项上使用鼠标侦听器

不要用鼠标听器

JMenuItem设计用于ActionListener

阅读上Swing教程中的部分,以获取更多信息和可下载并测试的工作示例

此外,由于使用空布局将构件添加到面板中,因此需要设置绘制线构件的大小,否则该大小将为(0,0),并且没有任何可绘制的内容

在JavaSwing中的菜单项上使用鼠标侦听器

不要用鼠标听器

JMenuItem设计用于ActionListener

阅读上Swing教程中的部分,以获取更多信息和可下载并测试的工作示例

此外,由于使用空布局将构件添加到面板中,因此需要设置绘制线构件的大小,否则该大小将为(0,0),并且没有任何可绘制的内容