为什么MouseListener不起作用?

use*_*510 2 java mouse swing jmenuitem mouselistener

这是我的主要课程:

import javax.swing.*;

public class WordProcessor {

    public static void main(String[] args) {           
        MainFrame frame = new MainFrame("Word Processor", 10000, 10000);
    }
} 
Run Code Online (Sandbox Code Playgroud)

我还有另外两个班

import javax.swing.*;

public class MainFrame extends JFrame {

    JMenuBar menubar = new JMenuBar();            

    public MainFrame(String name, int x, int y) {
        setTitle(name);
        setSize(x, y);
        setVisible(true);
        setJMenuBar(menubar); 
        //creates file menu and adds to menubar
        //TODO populate with JMenuItems 
        JMenu filemenu = new JMenu("file");
        filemenu.setVisible(true);
        menubar.add(filemenu);

        buttonnew buttonnew = new buttonnew("new");
        buttonnew.setVisible(true);
        filemenu.add(buttonnew);
        buttonnew.addMouseListener(buttonnew);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后

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

public class buttonnew extends JMenuItem implements MouseListener{

    buttonnew(String s) {
          super();
          super.setText(s);        
    }

    public void mouseClicked(MouseEvent e){         
          System.out.println("hey-o");
    } 

    @Override
    public void mouseExited(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
    }        
}
Run Code Online (Sandbox Code Playgroud)

当我点击buttonneẅ时没有任何反应.我迷路了!

Hov*_*els 9

解决方案:

  1. 不要将MouseListeners与JMenuItems一起使用!他们应该使用ActionListeners.
  2. 使用新工具时阅读教程.Swing菜单教程已经告诉您所有这些以及如何正确使用菜单.
  3. 此外,最好不要让你的GUI类实现你的监听器接口,因为你强迫一个类打破太多的卷来破坏Cohesion OOP规则.


cam*_*ckr 8

阅读有关如何使用菜单项的Swing教程.您不应该使用MouseListener.您应该将ActionListener添加到菜单项.

该教程还有关于How to Write an Action Listener和的部分How to Write a Mouse Listener.

public class buttonnew extends JMenuItem implements MouseListener{
Run Code Online (Sandbox Code Playgroud)

类名也应以大写字符开头,而不是小写字符.

buttonnew.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

默认情况下,Swing组件(顶级窗口除外)是可见的,上面的代码是不必要的.

MainFrame frame = new MainFrame("Word Processor", 10000, 10000);
Run Code Online (Sandbox Code Playgroud)

不要硬编码框架的大小.我的屏幕只有1376 x 768.你应该使用:

frame.pack();
Run Code Online (Sandbox Code Playgroud)

或者全屏你可以使用:

frame.setExtendedState(...);
Run Code Online (Sandbox Code Playgroud)

在将所有组件添加到框架之前,请勿使框架可见.

setTitle(name);
setSize(x, y);
setVisible(true);
setJMenuBar(menubar);
Run Code Online (Sandbox Code Playgroud)