在Java-swing中的菜单项上使用鼠标监听器

时间:2017-05-10 15:52:19

标签: java swing mouseevent mouselistener

我在检测菜单项上的点击时遇到问题。我需要在“创建菜单”上单击“Road”menuItem时创建一条线,但是当我点击它时没有任何反应。

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);

  }}

1 个答案:

答案 0 :(得分:1)

  

在Java-swing

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

不要使用MouseListener!

JMenuItem旨在与ActionListener一起使用。

阅读How to Use Menus上Swing教程中的部分,了解可下载和测试的更多信息和工作示例。

此外,由于使用null布局将组件添加到面板,因此需要设置DrawLine组件的大小,否则大小将为(0,0)并且不会绘制任何内容。