簡體   English   中英

JButton和JMenuItem在ActionListener中不配合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM