[英]JButtons and JMenuItems not cooperating in ActionListener
大家好,這是我的第一篇文章!
我正在使用這個計算器項目作為工具來教我自己的Java。
我通常試圖重現Microsoft Windows 7計算器程序。
到目前為止,所有按鈕均按預期方式工作,除了Microsoft計算器中更復雜的按鈕功能外,其他所有功能都幾乎相同。
這是我的問題,使用以下代碼為JMenuBar實現一個動作偵聽器/事件后
String menuText = ((JMenuItem) evt.getSource()).getText();
if(menuText.equals("info")){
System.out.println("it works");
JOptionPane.showMessageDialog(null, "aha it works");
一切都崩潰了!
這是完整的代碼
public class Calculator extends JFrame implements ActionListener {
JButton backSpace, clear, one, two, three, four, five, six, seven, eight,
nine, zero, period, devision, modulas, subtraction, addition,
negative, equals;
Font myFont = new Font("ARIAL", Font.BOLD, 40);
JTextArea answerBox = new JTextArea("");
static double numberOne = 0;
static double numberTwo = 0;
static double result;
static String operator = null;
public Calculator() {
super("Calculator");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
// set up components
addition = new JButton("+");
backSpace = new JButton("BACKSPACE");
clear = new JButton("CLEAR");
one = new JButton("1");
two = new JButton("2");
three = new JButton("3");
four = new JButton("4");
five = new JButton("5");
six = new JButton("6");
seven = new JButton("7");
eight = new JButton("8");
nine = new JButton("9");
zero = new JButton("0");
period = new JButton(".");
devision = new JButton("/");
modulas = new JButton("*");
subtraction = new JButton("-");
negative = new JButton("-N");
equals = new JButton("=");
// set up answerbox
answerBox.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
answerBox.setFont(myFont);
answerBox.setEditable(false);
// set up actionListener
backSpace.addActionListener(this);
clear.addActionListener(this);
one.addActionListener(this);
two.addActionListener(this);
three.addActionListener(this);
four.addActionListener(this);
five.addActionListener(this);
six.addActionListener(this);
seven.addActionListener(this);
eight.addActionListener(this);
nine.addActionListener(this);
zero.addActionListener(this);
period.addActionListener(this);
devision.addActionListener(this);
addition.addActionListener(this);
modulas.addActionListener(this);
subtraction.addActionListener(this);
negative.addActionListener(this);
equals.addActionListener(this);
// menu
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("About");
JMenuItem info = new JMenuItem("Info");
info.addActionListener(this);
menu.add(info);
menuBar.add(menu);
setJMenuBar(menuBar);
// set up layout
GridBagLayout gridBag = new GridBagLayout();
GridBagConstraints constraints = new GridBagConstraints();
JPanel pane = new JPanel();
pane.setLayout(gridBag);
// default
constraints.fill = GridBagConstraints.BOTH;
constraints.anchor = GridBagConstraints.WEST;
constraints.gridy = 0;
constraints.gridx = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 10;
constraints.weighty = 10;
constraints.insets = new Insets(2, 2, 2, 2);
// answer box
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 6;
answerBox.append("0");
gridBag.setConstraints(answerBox, constraints);
pane.add(answerBox);
// backSPace
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 3;
gridBag.setConstraints(backSpace, constraints);
pane.add(backSpace);
// clear
constraints.anchor = GridBagConstraints.EAST;
constraints.gridx = 3;
constraints.gridy = 1;
constraints.weightx = 10;
gridBag.setConstraints(clear, constraints);
pane.add(clear);
// nine
constraints.gridwidth = 1;
constraints.weightx = 1;
constraints.gridx = 0;
constraints.gridy = 3;
gridBag.setConstraints(nine, constraints);
pane.add(nine);
// eight
constraints.gridx = 1;
constraints.gridy = 3;
gridBag.setConstraints(eight, constraints);
pane.add(eight);
// seven
constraints.gridx = 2;
constraints.gridy = 3;
gridBag.setConstraints(seven, constraints);
pane.add(seven);
// devision
constraints.gridwidth = 1;
constraints.weightx = 1;
constraints.gridx = 3;
constraints.gridy = 3;
constraints.anchor = GridBagConstraints.SOUTH;
gridBag.setConstraints(devision, constraints);
pane.add(devision);
// EQUALS
constraints.gridx = 4;
constraints.gridy = 3;
constraints.gridwidth = 2;
constraints.gridheight = 4;
constraints.weighty = 30;
constraints.anchor = GridBagConstraints.SOUTH;
gridBag.setConstraints(equals, constraints);
pane.add(equals);
// six
constraints.weighty = 10;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.gridx = 0;
constraints.gridy = 4;
gridBag.setConstraints(six, constraints);
pane.add(six);
// five
constraints.gridx = 1;
constraints.gridy = 4;
gridBag.setConstraints(five, constraints);
pane.add(five);
// four
constraints.gridwidth = 1;
constraints.gridx = 2;
constraints.gridy = 4;
gridBag.setConstraints(four, constraints);
pane.add(four);
// Addition
constraints.gridwidth = 1;
constraints.weightx = 1;
constraints.gridx = 3;
constraints.gridy = 4;
gridBag.setConstraints(addition, constraints);
pane.add(addition);
// three
constraints.gridx = 0;
constraints.gridy = 5;
gridBag.setConstraints(three, constraints);
pane.add(three);
// two
constraints.gridx = 1;
constraints.gridy = 5;
gridBag.setConstraints(two, constraints);
pane.add(two);
// one
constraints.gridx = 2;
constraints.gridy = 5;
gridBag.setConstraints(one, constraints);
pane.add(one);
// subtraction
constraints.gridx = 3;
constraints.gridy = 5;
gridBag.setConstraints(subtraction, constraints);
pane.add(subtraction);
// zero
constraints.gridx = 0;
constraints.gridy = 6;
constraints.gridwidth = 2;
gridBag.setConstraints(zero, constraints);
pane.add(zero);
// period
constraints.gridx = 2;
constraints.gridy = 6;
constraints.gridwidth = 1;
gridBag.setConstraints(period, constraints);
pane.add(period);
// multiplication
constraints.gridx = 3;
constraints.gridy = 6;
constraints.gridwidth = 1;
gridBag.setConstraints(modulas, constraints);
pane.add(modulas);
pack();
add(pane);
}
public static void main(String[] args) {
Calculator frame = new Calculator();
frame.setSize(300, 350);
}
public void actionPerformed(ActionEvent evt){
Object source = evt.getSource();
String menuText = ((JMenuItem) evt.getSource()).getText();
if(menuText.equals("info")){
System.out.println("it works");
JOptionPane.showMessageDialog(null, "aha it works");
}
else if(source == one){
answerBox.append("1");
}else if (source == two){
answerBox.append("2");
}
else if (source == three){
answerBox.append("3");
}
else if (source == four){
answerBox.append("4");
}
else if (source == five){
answerBox.append("5");
}
else if (source == six){
answerBox.append("6");
}
else if (source == seven){
answerBox.append("7");
}
else if (source == eight){
answerBox.append("8");
}
else if (source == nine){
answerBox.append("9");
}
else if (source == zero){
answerBox.append("0");
}
else if (source == addition){
numberOne=Double.parseDouble(answerBox.getText());
operator="+";
answerBox.setText("");
}
else if (source == subtraction){
numberOne=Double.parseDouble(answerBox.getText());
operator="-";
answerBox.setText("");
}
else if (source == modulas){
numberOne=Double.parseDouble(answerBox.getText());
operator="*";
answerBox.setText("");
}
else if (source == devision){
numberOne=Double.parseDouble(answerBox.getText());
operator="/";
answerBox.setText("");
}
else if (source == period){
answerBox.append(".");
}
else if(source == equals){
numberTwo=Double.parseDouble(answerBox.getText());
if(operator.equals("+"))
result=numberOne+numberTwo;
else if(operator.equals("-"))
result=numberOne-numberTwo;
else if(operator.equals("*"))
result=numberOne-numberTwo;
else if(operator.equals("/"))
result=numberOne/numberTwo;
answerBox.setText(" "+result);
operator="=";
}
else if(source == clear){
numberOne=0;
numberTwo=0;
answerBox.setText("");
}
}
}
String menuText = ((JMenuItem) evt.getSource()).getText();
我猜你在上面的語句上收到ClassCastException。
該代碼假定事件是由JMenuItem生成的。 問題是您為JButton和JMenuItem使用了相同的ActionListener,因此您不能假定源對象是JMenuItem。
在單個ActionListener中實現所有代碼不是一個好主意。 您可以為類似的函數共享一個ActionListener。 例如,在以下代碼中,數字鍵的按下始終相同,因此您可以使用相同的偵聽器:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class ButtonCalculator extends JPanel
{
private JButton[] buttons;
private JTextField display;
public ButtonCalculator()
{
Action numberAction = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
display.replaceSelection(e.getActionCommand());
}
};
display = new JTextField();
display.setEditable( false );
display.setHorizontalAlignment(JTextField.RIGHT);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout( new GridLayout(0, 5) );
buttons = new JButton[10];
for (int i = 0; i < buttons.length; i++)
{
String text = String.valueOf(i);
JButton button = new JButton( text );
button.addActionListener( numberAction );
buttons[i] = button;
buttonPanel.add( button );
// Support Key Bindings
KeyStroke pressed = KeyStroke.getKeyStroke(text);
InputMap inputMap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(pressed, text);
button.getActionMap().put(text, numberAction);
}
setLayout( new BorderLayout() );
add(display, BorderLayout.NORTH);
add(buttonPanel, BorderLayout.SOUTH);
}
private static void createAndShowUI()
{
UIManager.put("Button.margin", new Insets(5, 10, 5, 10) );
JFrame frame = new JFrame("Button Calculator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new ButtonCalculator() );
frame.setResizable( false );
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
對於其他動作(“ +”,“-” ...),應創建單獨的偵聽器。
在將evt.getSource強制轉換為JMenuItem之前,必須檢查源代碼是否為JMenuItem。 像我的示例一樣,更改方法actionPerformed開頭,它就可以工作(您必須要求“ Info”而不是“ info”)。 camickr +1-使用不同的actionListener可以提高代碼質量。
@Override
public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
if (source.getClass() == JMenuItem.class) {
String menuText = ((JMenuItem) evt.getSource()).getText();
if (menuText.equals("info")) {
System.out.println("it works");
JOptionPane.showMessageDialog(null, "aha it works");
}
}
else if (source == one) {
answerBox.append("1");
}
有幾件事突然出現在我身上...
您不能依賴源類型是類的給定實例...
Object source = evt.getSource();
String menuText = ((JMenuItem) evt.getSource()).getText();
這很可能導致您ClassCastException
另外, Info
!= info
您將菜單項定義為...。
JMenuItem info = new JMenuItem("Info");
但是你用...測試它的文本內容
if(menuText.equals("info")){
Java中的String
比較區分大小寫(除非您使用equalsIgnoresCase
)
您應該提供並使用actionCommand
屬性。
例如...
JMenuItem info = new JMenuItem("Info");
info.setActionComand("infoMenu");
然后在您的actionPeformed
方法中,您可以執行以下操作...
if("infoMenu".equals(evt.getActionCommand())){...}
我還建議您看看“ 如何使用動作” ,它們是功能非常強大的隔離動作,可以應用於應用程序的多個不同部分,包括菜單,按鈕和按鍵綁定API
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.