import java.awt.*;
public class TestButton {
private Frame f;
protected Button b;
public TestButton() {
f = new Frame("Test");
b = new Button("Press Me!");
b.setActionCommand("ButtonPressed");
}
public void launchFrame() {
b.addActionListener(new ButtonHandler());
f.add(b, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public static void main(String args[]) {
TestButton guiApp = new TestButton();
guiApp.launchFrame();
}
}
import java.awt.*;
import java.awt.event.*;
public class ButtonHandler extends TestButton implements ActionListener {
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if(source==b)
{
System.out.println("Action occurred");
System.out.println("Button's command is: "
+ e.getActionCommand());
}
}
}
我正在尝试在按下按钮b但不使用getSource时调用ActionEvent。
答案 0 :(得分:8)
您滥用继承权。 ButtonHandler类不应扩展TestButton类,因为处理程序类中的b变量引用与显示的完全不同的Button对象。我建议:
getSource()
方法中按下JButton并直接使用它。例如:
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class TestButton extends JPanel {
private JButton btn = new JButton(new ButtonAction("Press Me!", "ButtonPressed"));
public TestButton() {
add(btn);
}
private static void createAndShowGUI() {
TestButton testButton = new TestButton();
JFrame frame = new JFrame("TestButton");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(testButton );
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
@SuppressWarnings("serial")
class ButtonAction extends AbstractAction {
public ButtonAction(String name, String actionCommand) {
super(name);
putValue(ACTION_COMMAND_KEY, actionCommand);
}
@Override
public void actionPerformed(ActionEvent evt) {
System.out.println("Button's actionCommand is: " + evt.getActionCommand());
}
}
答案 1 :(得分:0)
之所以发生这种情况,是因为您在TestButton
中展开了ButtonHandler
,因为您有Button
的2个不同实例,并且这些实例不等于。
要解决此问题,您可以删除extends TestButton
并将ButtonHandler
作为TestButton
的内部类
或者您可以比较动作命令而不是Button
,如下所示:
if(((Button)source).getActionCommand().equals("ButtonPressed"))
答案 2 :(得分:0)
我认为您需要删除扩展的TestButton,因为按钮的2个不同实例不相等。您应该将ButtonHandler作为内部类或匿名类来实现它。
检查此问题: Java Button Handler