Реализация списка действий в JMenuItem

#java #swing #jbutton #actionlistener

Вопрос:

в своем коде я раньше использовал ActionListener для кнопки J. Я попытался улучшить свою программу с помощью некоторых меню, которые я выучил. Итак, я устал внедрять список действий в свой элемент JButtonItem, но он не отвечает. Что бы я ни написал, оно не отвечает, просто я получаю ошибку.

Я хочу, чтобы мой JButtonItem versItem использовал список действий для открытия, например, 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("");
            
                 }
        
    }
    


 

Комментарии:

1. Что такое а JButtonItem ?. Используйте правильное название класса, чтобы нам не пришлось гадать, о чем вы говорите. просто ошибка, которую я получаю. — какая ошибка? Опубликуйте текст ошибки как часть вопроса. Примечание. JMenu не отвечает на событие действия, поэтому вам не следует добавлять список действий в файловое меню.

Ответ №1:

Если я правильно понимаю, то, что вы пытаетесь сделать, это:

Когда кнопка menuItem нажата, сделайте что-нибудь ( 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 метод мог бы выглядеть так с некоторыми улучшениями switch вместо a (вы могли бы перенести операции в an enum , если бы захотели).:

 private void doOperation() {
    int ergebnis = 0;
    int op1 = Integer.parseInt(fieldOperand1.getText()); // get Text gibt String daher umwandlung nach int
    int op2 = Integer.parseInt(fieldOperand2.getText());
    
    switch(operator) {
    case " ":
        ergebnis = op1   op2;
        break;
    case "-":
        ergebnis = op1 - op2;
        break;
    case "*":
        ergebnis = op1 * op2;
        break;
    case "/":
        ergebnis = op1 / op2;
        break;
    default:
        System.out.println("Invalid operator");
        break;
    }
    // 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("");
}
 

Теперь каждый раз, когда вы нажимаете на кнопку versItem , вы будете печатать Dsa на консоли и продолжать выполнять свои операции при нажатии кнопки.

Если это не было вашей проблемой, дайте мне знать, чтобы я мог соответствующим образом отредактировать и улучшить ответ

Комментарии:

1. Это было потому, что вы всегда выполняли часть вычислений, легче увидеть, если вы переместите этот код за пределы и сможете сосредоточиться на этих частях, рад вам помочь 🙂

2. Да, именно так. Я не смог распечатать Dsa из-за того, что в текстовых полях fieldOperand1 и fieldOperand2 были указаны цифры. И ошибка, которую я получил, была такой же, как вы написали в своем ответе выше. Спасибо за ваши усилия, вы решили ее идеально.

3. В следующий раз, если у вас возникнет ошибка, добавьте ее в свой вопрос, это может помочь другим, и вы получите больше, быстрее и лучше ответов 🙂

4. Да, я виноват. В следующий раз я обязательно это сделаю. Спасибо!

Ответ №2:

Попробуйте это :

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