Java 对JMenuItem实现ActionListener

Java 对JMenuItem实现ActionListener,java,swing,jbutton,actionlistener,Java,Swing,Jbutton,Actionlistener,在我的代码中,我以前使用ActionListener作为JButton。 我试着用我学到的一些菜单来增强我的程序。 所以,我尝试为我的jbuttonite实现一个ActionListener,但它没有响应。无论我写什么,它都没有反应,只是我得到的错误 我希望我的JButtonItem版本使用ActionListener打开,例如system.out.print或新的文本字段 * * To change this license header, choose License Headers in

在我的代码中,我以前使用ActionListener作为JButton。 我试着用我学到的一些菜单来增强我的程序。 所以,我尝试为我的jbuttonite实现一个ActionListener,但它没有响应。无论我写什么,它都没有反应,只是我得到的错误

我希望我的JButtonItem版本使用ActionListener打开,例如system.out.print或新的文本字段

*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package yttut;

// Einbindung der Bibs

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
/**
 *
 * @author tom
 */
public class GuiTaschenrechner extends JFrame implements ActionListener { // Klasse benutzt JFrame
    
    JMenuBar menuBar;
    JMenu fileMenu;
    JMenu testMenu;
    JMenuItem versItem;
    
    JLabel labelOperand1; //Schildchen
    JLabel labelOperand2;
    JLabel labelOperator;
    
    JTextField fieldOperand1; // Normale Textfelder 
    JTextField fieldOperand2;
    
    JButton buttonRechnen; // Normaler Button
    
    String operator; // Normale Zuweisung
    public GuiTaschenrechner(String titel, String operator){
     
    this.operator = operator;    
       
    setTitle(titel); // Titel des Fensters
    setDefaultCloseOperation(EXIT_ON_CLOSE); // Was passiert wenn man das Fenster schließt
    
    setLayout(new FlowLayout()); // Ordnet die Komponten auf dem Interface
    
    setSize(350,150); // Größe des Fensters
    setResizable(true); // Ob der Benutzer das Fenster vergrößern kann
    
    
     
    
    initComponents(); // Methodenaufruf
    
    // WICHTIG!: Nach dem Methodenaufruf machen
    
    menuBar.add(fileMenu);
    menuBar.add(testMenu);
    testMenu.add(versItem);
   
    add(labelOperand1); //Aufruf der einzelnen Komponenten
    add(labelOperand2);
    add(fieldOperand1);
    add(labelOperator);
    add(fieldOperand2);
    add(buttonRechnen);
    
    setVisible(true); // Fenster wird sichtbar gemacht
    setLocationRelativeTo(null); // Wo das Fenster gespawnt wird
    
    
    
    }
    
    private void initComponents(){
        
    
     
    
    labelOperand1 = new JLabel("1.Summand"); //Was auf dem Label stehen soll
    labelOperand2 = new JLabel("2.Summand");  
    labelOperator = new JLabel(operator);
    
    fieldOperand1 = new JTextField(8); // Wie groß das Textfield sein soll
    fieldOperand2 = new JTextField(8);
    
    
    buttonRechnen = new JButton("Rechen!"); // Was auf dem Button stehen soll
    buttonRechnen.addActionListener(this); // Hört dem Button zu
    
    
    
    menuBar = new JMenuBar();
    
    setJMenuBar( menuBar);
    
    fileMenu = new JMenu("Datei");
    testMenu = new JMenu("Testing...");
    fileMenu.addActionListener(this);
    versItem = new JMenuItem("Versionsansicht");
    versItem.addActionListener(this);
    
    }

    /**
     *
     * @param e
     */
    @Override
    public void actionPerformed(ActionEvent e) { //Override aus implements ActionListener
        
        
        int op1 = Integer.parseInt(fieldOperand1.getText()); // get Text gibt String daher umwandlung nach int
        int op2 = Integer.parseInt(fieldOperand2.getText());
        
        int ergebnis;
        
        if(e.getSource().equals(versItem)){
            
            System.out.println("Dsa");
        }
        
         if(e.getSource()==fileMenu){
            
            System.out.println("Dsa");
        }
        
        
        
        if(operator.equals("+")){
            ergebnis = op1 + op2;
            
        }else if(operator.equals("-")){
            ergebnis = op1 - op2;
            
        }else if(operator.equals("*")){
            ergebnis = op1 * op2;
            
        }else if(operator.equals("/")){
            ergebnis = op1 / op2;
            
        }else{
            System.out.println("ERROR");
            ergebnis = Integer.MAX_VALUE;
        }
    
        // Ergbnisausgabe in einer Dialogbox
         JOptionPane.showMessageDialog(null, "Ergebnis: " + ergebnis,"BERECHNET",JOptionPane.INFORMATION_MESSAGE);
         
         fieldOperand1.setText(""); // Nach Ergebnisausgabe werden hier die Felder wieder leer gemaacht
         fieldOperand2.setText("");
            
                 }
        
    }
    



如果我理解正确,您要做的是:

按下
菜单项
时,执行一些操作(
System.out.println
)如打印(
“Dsa”
),按下按钮时,执行其他操作(计算)

无论我写什么,它都没有反应,只是我得到的错误

但是您得到了一个错误,并且在最底部打印了
Dsa

我认为你得到的错误是这样的:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
    at java.base/java.lang.Integer.parseInt(Integer.java:662)
    at java.base/java.lang.Integer.parseInt(Integer.java:770)
如果滚动到错误的底部,您会在控制台上找到
Dsa

上面的错误意味着您没有在字段中写入内容,并且因为您每次输入
ActionListener
时都在执行计算,所以发生这种情况是因为文本字段为空

你在这方面做得对:

if(e.getSource().equals(versItem)){
        
    System.out.println("Dsa");
}
    
if(e.getSource()==fileMenu){
        
    System.out.println("Dsa");
}
然而,您要求的是
fileMenu
versItem
,但从来没有要求您的按钮,实际上并不需要
fileMenu
一个,因此您可以这样更改:

@Override
public void actionPerformed(ActionEvent e) { // Override aus implements ActionListener
    if (e.getSource().equals(versItem)) {
        System.out.println("Dsa");
    } else if (e.getSource().equals(buttonRechnen)) {
        doOperation();
    }
}
如果您将所有操作的逻辑移出该方法,这样就更容易理解发生了什么

您的
doOperation
方法可能看起来像这样,但需要使用
开关进行一些改进(如果愿意,您可以将操作移动到
enum
):

现在,每次单击
versItem
时,您都会将
Dsa
打印到控制台,并在按下按钮时继续执行操作

如果这不是您的问题,请告诉我,以便我可以相应地编辑和改进答案

    JMenu file = new JMenu("File");
    JMenuItem exitItem = new JMenuItem("Exit");
    exitItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ev) {
                System.exit(0);
        }
    });

什么是JButtonItem?。使用正确的类名,这样我们就不必猜测你在说什么。只是我的错误什么错误?将错误文本作为问题的一部分发布。注意:JMenu不响应ActionEvent,因此您不应将ActionListener添加到文件菜单中。这是因为您始终在执行计算部分,因此更容易看到您是否将该代码移到外部,并且可以专注于这些部分,很高兴能帮到您:)是的,没错。在字段操作数1和字段操作数2的文本字段中输入数字时,我无法打印Dsa。我得到的错误和你在上面的答案中写的一样。谢谢你的努力,你完美地解决了它。下次如果你有错误,把它添加到你的问题中,这可能对其他人有帮助,你会得到更多、更快、更好的答案:)是的,我的错。下次我一定会做的。非常感谢。
    JMenu file = new JMenu("File");
    JMenuItem exitItem = new JMenuItem("Exit");
    exitItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ev) {
                System.exit(0);
        }
    });