小布菌sama 2021-10-23 12:11 采纳率: 71.4%
浏览 15
已结题

Java菜单事件无响应有时候又行

UI类


import javax.swing.*;

public class NotepadFrame extends JFrame {
    MainPanel panel;

    /*JMenu menu[]=new JMenu[3];*/

    JMenuItem menuItem;
    NotepadListener listener;

    public NotepadFrame() {
        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("文件");
        // 实例化监听类
        listener = new NotepadListener();
        this.setJMenuBar(menuBar);
       /* // 菜单条选项
        String[] menuBarItem = {"文件","格式","帮助"};
        menuBar.setBackground(Color.white);
        for (int i = 0; i < menuBarItem.length; i++) {
            menu[i] = new JMenu(menuBarItem[i]);
            menuBar.add(menu[i]);
        }*/

        menuBar.add(fileMenu);
        // 文件菜单项
        String[] fileItem = {"新建", "打开", "保存", "另存为", "退出"};

        // 分隔线位置
        int size = fileItem.length - 1;

        System.out.println(size);
        for (int i = 0; i < fileItem.length; i++) {
            menuItem = new JMenuItem(fileItem[i]);
            // 设置分隔线
            if (i == size) {
                fileMenu.addSeparator();
            }
            fileMenu.add(menuItem);
            menuItem.addActionListener(listener);
        }

        // 添加用于编辑文本的面板
        panel = new MainPanel();
        this.add(panel);

        // 窗体设置

        this.setTitle("简易记事本");
        this.setSize(600, 600);
        this.setVisible(true);
        this.addMouseListener(listener);
    }

    public static void main(String[] args) {
        new NotepadFrame();
    }
}

事件类

import java.awt.event.*;

public class NotepadListener extends MouseAdapter implements ActionListener, MouseListener {

    // 接收的指令文本
    String str;

    @Override
    public void actionPerformed(ActionEvent e) {
        str=e.getActionCommand();
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if("新建".equals(str)){
            System.out.println("新建测试");
        }
        /*if ("打开".equals(str)) {
            System.out.println("打开测试");
        }
        if ("保存".equals(str)) {
            System.out.println("保存测试");
        }
        if ("另存为".equals(str)) {
            System.out.println("另存为测试");
        }*/
        if ("退出".equals(str)) {
            System.out.println("退出测试");
            System.exit(0);
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {
        if ("新建".equals(str)) {
            System.out.println("测试新建");
        }
    }
}


接受文本类(没写完)


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

public class MainPanel extends JPanel {
    JTextArea textArea=null;

    // 主面板设置
    public MainPanel() {

        textArea=new JTextArea(30,58);
        // 自动换行
        textArea.setLineWrap(true);
        // 换行不断字
        textArea.setWrapStyleWord(true);
        this.add(textArea);
        this.setBackground(Color.white);
    }

}
  • 写回答

1条回答 默认 最新

  • 唯一的小彬哥 2021-10-25 10:49
    关注

    现在做swing的不多了啊。swing我也研究好了好多年,虽然现在不做了
    你这里的代码有点问题,每一个menuItem都需要创建 ActionListener,而不是一个listner被多个menuitem使用
    并且按钮点击走的是actionPerformed。

    另外MouseListene需要给最上层的面板,而不是给你最底层的容器。
    你的鼠标监控时间应该是在MainPanel上,而不应该是在frame上。

    
    menuItem.addActionListener(listener);
    
     this.addMouseListener(listener);
    

    以记事本的设计来说。很怪异。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月11日
  • 已采纳回答 11月3日
  • 创建了问题 10月23日

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记