【发布时间】:2015-03-29 20:58:58
【问题描述】:
我尝试创建程序,其中Action类是一个类的内部类,但其对象的初始化发生在另一个类中,但是我一直收到异常。下面我提出了我的问题的简化模型:
有一个类构建 GUI 并包含 Action 的内部类:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class SomeClass {
JTextArea area;
public static void main(String[] args){
SomeClass outerAction = new SomeClass();
outerAction.go();
}
public void go(){
JFrame frame = new JFrame();
area = new JTextArea(5,10);
JToolBar toolBar = new JToolBar(SwingConstants.HORIZONTAL);
CreateAction createAction = new CreateAction();
JButton button1 = new JButton(innerGetAction());
JButton button2 = new JButton(createAction.otherGetAction());
toolBar.add(button1);
toolBar.add(button2);
frame.getContentPane().add(BorderLayout.PAGE_START,toolBar);
frame.getContentPane().add(BorderLayout.CENTER,area);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public Action innerGetAction(){
Action action = new SomeAction("DO","Do sth",KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
return action;
}
public class SomeAction extends AbstractAction{
public SomeAction(String name, String desc, KeyStroke key){
super(name);
putValue(SHORT_DESCRIPTION,desc);
putValue(ACCELERATOR_KEY,key);
}
public void actionPerformed(ActionEvent e) {
area.setText("Done");
}
}
}
有两个 JButtons 具有相同的 Action,但第一次初始化发生在 SomeClass 中,另一个发生在单独的 CreateActionClass 中:
import javax.swing.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class CreateAction {
public static Action otherGetAction(){
Action action = new SomeClass().new SomeAction("DO","Do sth",KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
return action;
}
}
一个按钮工作正常,另一个给出异常。我不明白为什么。
你能告诉我吗:
- 为什么在类 CreateAction 中初始化的 Action 没有访问 SomeClass 的字段? 如果getAction是SomeClass的方法,一切正常,可以修改JTextArea,但是当它是CreateAction的方法时,出现java.lang.NullPointerException。有什么区别?
- 在不同的类中初始化 Action 对象是否有意义,而不是在其 Action 类中放置一个构造函数?
请原谅我可怜的例子。
堆栈跟踪:
线程“AWT-EventQueue-0”中的异常 java.lang.NullPointerException 在 SomeClass$SomeAction.actionPerformed(SomeClass.java:40) 在 javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 在 javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346) 在 javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 在 javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 在 java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) 在 java.awt.Component.processMouseEvent(Component.java:6525) 在 javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 在 java.awt.Component.processEvent(Component.java:6290) 在 java.awt.Container.processEvent(Container.java:2234) 在 java.awt.Component.dispatchEventImpl(Component.java:4881) 在 java.awt.Container.dispatchEventImpl(Container.java:2292) 在 java.awt.Component.dispatchEvent(Component.java:4703) 在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898) 在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533) 在 java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462) 在 java.awt.Container.dispatchEventImpl(Container.java:2278) 在 java.awt.Window.dispatchEventImpl(Window.java:2739) 在 java.awt.Component.dispatchEvent(Component.java:4703) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746) 在 java.awt.EventQueue.access$400(EventQueue.java:97) 在 java.awt.EventQueue$3.run(EventQueue.java:697) 在 java.awt.EventQueue$3.run(EventQueue.java:691) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86) 在 java.awt.EventQueue$4.run(EventQueue.java:719) 在 java.awt.EventQueue$4.run(EventQueue.java:717) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:716) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
【问题讨论】:
-
请参阅编辑回答。
标签: java swing event-handling action