为 JMenuItem 实现 ActionListener
Implementing an ActionListener to a JMenuItem
在我的代码中,我之前将 ActionListener 用于 JButton。
我试图用我学到的一些菜单栏来增强我的程序。
因此,我厌倦了为我的 JButtonItem 实现 ActionListener,但它不会响应。无论我写什么它都没有反应,只是我得到的错误。
我希望我的 JButtonItem versItem 使用 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("");
}
}
如果我没理解错的话,你想做的是:
按下 menuItem
时,执行一些操作 (System.out.println
),例如打印 ("Dsa"
),按下按钮时,执行其他操作(计算)。
Whatever I write it does not respond, just the error I get.
但是你遇到了一个错误,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
进行了一些改进(如果你愿意,你可以将操作移至 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
打印到控制台并在按下按钮时继续执行操作。
如果这不是您的问题,请告诉我,以便我可以相应地编辑和改进答案
试试这个:
JMenu file = new JMenu("File");
JMenuItem exitItem = new JMenuItem("Exit");
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
System.exit(0);
}
});
在我的代码中,我之前将 ActionListener 用于 JButton。 我试图用我学到的一些菜单栏来增强我的程序。 因此,我厌倦了为我的 JButtonItem 实现 ActionListener,但它不会响应。无论我写什么它都没有反应,只是我得到的错误。
我希望我的 JButtonItem versItem 使用 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("");
}
}
如果我没理解错的话,你想做的是:
按下 menuItem
时,执行一些操作 (System.out.println
),例如打印 ("Dsa"
),按下按钮时,执行其他操作(计算)。
Whatever I write it does not respond, just the error I get.
但是你遇到了一个错误,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
进行了一些改进(如果你愿意,你可以将操作移至 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
打印到控制台并在按下按钮时继续执行操作。
如果这不是您的问题,请告诉我,以便我可以相应地编辑和改进答案
试试这个:
JMenu file = new JMenu("File");
JMenuItem exitItem = new JMenuItem("Exit");
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
System.exit(0);
}
});