菜单项不会响应点击
Menu Item won't respond to click
"Exit" MenuItem 响应完美,但 "Change Name" 是个问题。工作正常.. 因为我在另一个 class 中使用它并且它工作得很好。就是不知道怎么了
这是代码
public class MenuBar extends JMenuBar{
// variable declaration
private JMenu menu;
private JMenuItem menuItem;
private JMenuItem changed_Name;
private JMenuItem exit;
public MenuBar(){
init();
}
private void init(){
menu = new JMenu("File");
add(menu);
changed_Name = new JMenuItem("Change Name");
changed_Name.setMnemonic(KeyEvent.VK_C);
changed_Name.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.ALT_MASK));
changed_Name.getAccessibleContext().setAccessibleDescription("This Will Allow a Name Change");
menu.add(changed_Name);
exit = new JMenuItem("Exit");
menu.add(exit);
menu = new JMenu("Help");
add(menu);
menuItem = new JMenuItem("Help & Docs");
//menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, KeyEvent.CHAR_UNDEFINED) );
menuItem.getAccessibleContext().setAccessibleDescription("Get Help or View Software documents");
menu.add(menuItem);
menuItem = new JMenuItem("About");
menu.add(menuItem);
MenuHandler menuHandler = new MenuHandler();
menuItem.addActionListener(menuHandler);
exit.addActionListener(menuHandler);
}
private class MenuHandler implements ActionListener{
AgentName userName = new AgentName();
@Override
public void actionPerformed(ActionEvent e) throws UnsupportedOperationException {
Object menuItem_Command = e.getActionCommand();
if(menuItem_Command.equals("Change Name")){
userName.setUserName(userName.getUserName());
}
else if(menuItem_Command.equals("Exit")){
System.exit(0);
}
}
}
}
它可能有效,但您没有收到反馈,因为您正在将名称更改为以前的名称。如果您在 setUserName 方法中放置其他值,您将看到
您从未将 MenuHandler
注册到 changed_name
JMenuItem
...
此外,请注意,您正在多次重新分配 menuItem
,这意味着只有 About
已在 MenuHandler
中注册
例如...
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setJMenuBar(new MenuBar());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MenuBar extends JMenuBar {
// variable declaration
private JMenu menu;
private JMenuItem menuItem;
private JMenuItem changed_Name;
private JMenuItem exit;
public MenuBar() {
init();
}
private void init() {
menu = new JMenu("File");
add(menu);
MenuHandler menuHandler = new MenuHandler();
changed_Name = new JMenuItem("Change Name");
changed_Name.setMnemonic(KeyEvent.VK_C);
changed_Name.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.ALT_MASK));
changed_Name.getAccessibleContext().setAccessibleDescription("This Will Allow a Name Change");
changed_Name.addActionListener(menuHandler);
menu.add(changed_Name);
exit = new JMenuItem("Exit");
menu.add(exit);
menu = new JMenu("Help");
add(menu);
menuItem = new JMenuItem("Help & Docs");
//menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, KeyEvent.CHAR_UNDEFINED) );
menuItem.getAccessibleContext().setAccessibleDescription("Get Help or View Software documents");
menuItem.addActionListener(menuHandler);
menu.add(menuItem);
menuItem = new JMenuItem("About");
menuItem.addActionListener(menuHandler);
menu.add(menuItem);
exit.addActionListener(menuHandler);
}
private class MenuHandler implements ActionListener {
// AgentName userName = new AgentName();
@Override
public void actionPerformed(ActionEvent e) throws UnsupportedOperationException {
Object menuItem_Command = e.getActionCommand();
System.out.println(menuItem_Command);
if (menuItem_Command.equals("Change Name")) {
System.out.println("Yippe");
// userName.setUserName(userName.getUserName());
} else if (menuItem_Command.equals("Exit")) {
System.exit(0);
}
}
}
}
public class TestPane extends JPanel {
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}
一般来说,您应该确实需要扩展 JMenuBar
,但只需创建一个实例并向其添加您需要的菜单即可
您也可以考虑看看 How to Use Actions,它们是独立单元,包含自己的配置和操作逻辑
例如...
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import static javax.swing.Action.ACCELERATOR_KEY;
import static javax.swing.Action.MNEMONIC_KEY;
import static javax.swing.Action.NAME;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setJMenuBar(new MenuBar());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ChangeNameAction extends AbstractAction {
public ChangeNameAction() {
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.ALT_MASK));
putValue(MNEMONIC_KEY, KeyEvent.VK_C);
putValue(NAME, "Change Name");
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Change name");
}
}
public class ExitAction extends AbstractAction {
public ExitAction() {
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_4, KeyEvent.ALT_MASK));
putValue(MNEMONIC_KEY, KeyEvent.VK_X);
putValue(NAME, "Exit");
}
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
public class HelpAction extends AbstractAction {
public HelpAction() {
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
putValue(MNEMONIC_KEY, KeyEvent.VK_H);
putValue(NAME, "Help & Docs");
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Help and docs");
}
}
public class AboutAction extends AbstractAction {
public AboutAction() {
putValue(NAME, "About");
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("About");
}
}
public class MenuBar extends JMenuBar {
// variable declaration
private JMenu menu;
private JMenuItem menuItem;
private JMenuItem changed_Name;
private JMenuItem exit;
public MenuBar() {
init();
}
private void init() {
menu = new JMenu("File");
add(menu);
menu.add(new ChangeNameAction());
menu.add(new ExitAction());
menu = new JMenu("Help");
add(menu);
menu.add(new HelpAction());
menu.add(new AboutAction());
}
private class MenuHandler implements ActionListener {
// AgentName userName = new AgentName();
@Override
public void actionPerformed(ActionEvent e) throws UnsupportedOperationException {
Object menuItem_Command = e.getActionCommand();
System.out.println(menuItem_Command);
if (menuItem_Command.equals("Change Name")) {
System.out.println("Yippe");
// userName.setUserName(userName.getUserName());
} else if (menuItem_Command.equals("Exit")) {
System.exit(0);
}
}
}
}
public class TestPane extends JPanel {
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}
"Exit" MenuItem 响应完美,但 "Change Name" 是个问题。工作正常.. 因为我在另一个 class 中使用它并且它工作得很好。就是不知道怎么了
这是代码
public class MenuBar extends JMenuBar{
// variable declaration
private JMenu menu;
private JMenuItem menuItem;
private JMenuItem changed_Name;
private JMenuItem exit;
public MenuBar(){
init();
}
private void init(){
menu = new JMenu("File");
add(menu);
changed_Name = new JMenuItem("Change Name");
changed_Name.setMnemonic(KeyEvent.VK_C);
changed_Name.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.ALT_MASK));
changed_Name.getAccessibleContext().setAccessibleDescription("This Will Allow a Name Change");
menu.add(changed_Name);
exit = new JMenuItem("Exit");
menu.add(exit);
menu = new JMenu("Help");
add(menu);
menuItem = new JMenuItem("Help & Docs");
//menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, KeyEvent.CHAR_UNDEFINED) );
menuItem.getAccessibleContext().setAccessibleDescription("Get Help or View Software documents");
menu.add(menuItem);
menuItem = new JMenuItem("About");
menu.add(menuItem);
MenuHandler menuHandler = new MenuHandler();
menuItem.addActionListener(menuHandler);
exit.addActionListener(menuHandler);
}
private class MenuHandler implements ActionListener{
AgentName userName = new AgentName();
@Override
public void actionPerformed(ActionEvent e) throws UnsupportedOperationException {
Object menuItem_Command = e.getActionCommand();
if(menuItem_Command.equals("Change Name")){
userName.setUserName(userName.getUserName());
}
else if(menuItem_Command.equals("Exit")){
System.exit(0);
}
}
}
}
它可能有效,但您没有收到反馈,因为您正在将名称更改为以前的名称。如果您在 setUserName 方法中放置其他值,您将看到
您从未将 MenuHandler
注册到 changed_name
JMenuItem
...
此外,请注意,您正在多次重新分配 menuItem
,这意味着只有 About
已在 MenuHandler
例如...
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setJMenuBar(new MenuBar());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MenuBar extends JMenuBar {
// variable declaration
private JMenu menu;
private JMenuItem menuItem;
private JMenuItem changed_Name;
private JMenuItem exit;
public MenuBar() {
init();
}
private void init() {
menu = new JMenu("File");
add(menu);
MenuHandler menuHandler = new MenuHandler();
changed_Name = new JMenuItem("Change Name");
changed_Name.setMnemonic(KeyEvent.VK_C);
changed_Name.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.ALT_MASK));
changed_Name.getAccessibleContext().setAccessibleDescription("This Will Allow a Name Change");
changed_Name.addActionListener(menuHandler);
menu.add(changed_Name);
exit = new JMenuItem("Exit");
menu.add(exit);
menu = new JMenu("Help");
add(menu);
menuItem = new JMenuItem("Help & Docs");
//menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, KeyEvent.CHAR_UNDEFINED) );
menuItem.getAccessibleContext().setAccessibleDescription("Get Help or View Software documents");
menuItem.addActionListener(menuHandler);
menu.add(menuItem);
menuItem = new JMenuItem("About");
menuItem.addActionListener(menuHandler);
menu.add(menuItem);
exit.addActionListener(menuHandler);
}
private class MenuHandler implements ActionListener {
// AgentName userName = new AgentName();
@Override
public void actionPerformed(ActionEvent e) throws UnsupportedOperationException {
Object menuItem_Command = e.getActionCommand();
System.out.println(menuItem_Command);
if (menuItem_Command.equals("Change Name")) {
System.out.println("Yippe");
// userName.setUserName(userName.getUserName());
} else if (menuItem_Command.equals("Exit")) {
System.exit(0);
}
}
}
}
public class TestPane extends JPanel {
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}
一般来说,您应该确实需要扩展 JMenuBar
,但只需创建一个实例并向其添加您需要的菜单即可
您也可以考虑看看 How to Use Actions,它们是独立单元,包含自己的配置和操作逻辑
例如...
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import static javax.swing.Action.ACCELERATOR_KEY;
import static javax.swing.Action.MNEMONIC_KEY;
import static javax.swing.Action.NAME;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setJMenuBar(new MenuBar());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ChangeNameAction extends AbstractAction {
public ChangeNameAction() {
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.ALT_MASK));
putValue(MNEMONIC_KEY, KeyEvent.VK_C);
putValue(NAME, "Change Name");
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Change name");
}
}
public class ExitAction extends AbstractAction {
public ExitAction() {
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_4, KeyEvent.ALT_MASK));
putValue(MNEMONIC_KEY, KeyEvent.VK_X);
putValue(NAME, "Exit");
}
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
public class HelpAction extends AbstractAction {
public HelpAction() {
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
putValue(MNEMONIC_KEY, KeyEvent.VK_H);
putValue(NAME, "Help & Docs");
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Help and docs");
}
}
public class AboutAction extends AbstractAction {
public AboutAction() {
putValue(NAME, "About");
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("About");
}
}
public class MenuBar extends JMenuBar {
// variable declaration
private JMenu menu;
private JMenuItem menuItem;
private JMenuItem changed_Name;
private JMenuItem exit;
public MenuBar() {
init();
}
private void init() {
menu = new JMenu("File");
add(menu);
menu.add(new ChangeNameAction());
menu.add(new ExitAction());
menu = new JMenu("Help");
add(menu);
menu.add(new HelpAction());
menu.add(new AboutAction());
}
private class MenuHandler implements ActionListener {
// AgentName userName = new AgentName();
@Override
public void actionPerformed(ActionEvent e) throws UnsupportedOperationException {
Object menuItem_Command = e.getActionCommand();
System.out.println(menuItem_Command);
if (menuItem_Command.equals("Change Name")) {
System.out.println("Yippe");
// userName.setUserName(userName.getUserName());
} else if (menuItem_Command.equals("Exit")) {
System.exit(0);
}
}
}
}
public class TestPane extends JPanel {
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}