[英]Menu Item won't respond to click
the "Exit" MenuItem responds perfectly but the "Change Name" is a problem.. i can't figure out whats wrong, Can Someone help please... I know the userName.setUserName is working ok.. cuz i'm using it in another class and it works perfectly. “退出”菜单项响应完美,但是“更改名称”是一个问题..我无法弄清楚出了什么问题,请有人帮忙...我知道userName.setUserName正常运行。它在另一个类中,并且效果很好。 just can't figure out whats wrong
只是不知道怎么了
Here's the code 这是代码
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);
}
}
}
}
You never register the MenuHandler
with the changed_name
JMenuItem
... 您永远都不会使用
changed_name
JMenuItem
注册MenuHandler
。
Also, beware, you are reassigning menuItem
multiple times, meaning hat only About
is been registered with the MenuHandler
另外,请注意,您要多次重新分配
menuItem
,这意味着只有About
才向MenuHandler
注册。
For example... 例如...
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);
}
}
}
Generally speaking, you should really need to extend JMenuBar
, but simply create an instance and add the menus you need to it 一般来说,您确实需要扩展
JMenuBar
,但只需创建一个实例并将所需菜单添加到该实例即可。
You may also consider having a look at How to Use Actions , which are self contained units, which contain their own configuration and action logic 您也可以考虑看看如何使用操作 ,它们是独立的单元,包含其自己的配置和操作逻辑
For example... 例如...
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);
}
}
}
It is probably working, but you do not get feedback because you are changing the name to the previous one. 它可能正在工作,但是您没有得到反馈,因为您将名称更改为上一个。 If you put some other value in the setUserName method you will see
如果在setUserName方法中输入其他值,您将看到
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.