另一个类中的Java ActionListener-从主类访问对象

丹德里

我正在编写一个简单的BMI计算器程序。该应用程序包括ActionListener,它可以处理按钮单击,检查文本字段是否已填充并执行计算。

目前,ActionListener方法是作为主类的子类。它看起来像这样:

BMICalc.java

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
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.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class BMICalc extends JFrame {

    private JMenuBar menuBar1;
    private JMenu jMenu1;
    private JMenuItem jMenuItem1, jMenuItem2;
    private JButton jButton1;
    private JPanel mainPanel, jPanel1;
    private JLabel jLabel1, jLabel2;
    private JTextField jTextField1, jTextField2;


    private BMICalc() {

        super("BMI Calculator");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(250, 300));
        setLocationRelativeTo(null);
        setLayout(new BorderLayout(10, 10));


        mainPanel = new JPanel(new BorderLayout(10, 10));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        add(mainPanel);

        jPanel1 = new JPanel(new GridLayout(6,2));
        mainPanel.add(jPanel1, BorderLayout.CENTER);

        menuBar1 = new JMenuBar();

            jMenu1 = new JMenu("Help");
            menuBar1.add(jMenu1);

                jMenuItem1 = new JMenuItem("The purpose");
                jMenu1.add(jMenuItem1);

                jMenuItem2 = new JMenuItem("About");
                jMenu1.add(jMenuItem2);

        setJMenuBar(menuBar1);

        jLabel1 = new JLabel("Enter weight in [kg]:");
        jPanel1.add(jLabel1);

        jTextField1 = new JTextField("");
        jPanel1.add(jTextField1);

        jLabel2 = new JLabel("Enter height in [cm]:");
        jPanel1.add(jLabel2);

        jTextField2 = new JTextField("");
        jPanel1.add(jTextField2);

        jButton1 = new JButton("Calculate");
        mainPanel.add(jButton1, BorderLayout.SOUTH);

        Handler handler = new Handler();
        jButton1.addActionListener(handler);
        jMenuItem1.addActionListener(handler);
        jMenuItem2.addActionListener(handler);
    }


    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                BMICalc bmicalc = new BMICalc();
                bmicalc.setVisible(true);
            }
        });
    }

    private class Handler implements ActionListener {

        public void actionPerformed(ActionEvent event) {

            if (event.getSource() == jButton1) {

                if (jTextField1.getText().equals("") || jTextField2.getText().equals("")) {

                    JOptionPane.showMessageDialog(null, "All fields must be filled in!", "Error", JOptionPane.INFORMATION_MESSAGE);
                }
                else {
                    Calculations calcs = new Calculations();
                    calcs.calculateBMI(jTextField1.getText(), jTextField2.getText());
                    JOptionPane.showMessageDialog(null, "Your BMI: " +calcs.returnBMI());
                }
            }
            else if (event.getSource() == jMenuItem1) {

                JOptionPane.showMessageDialog(null, "The program calculates BMI based on information entered by user." , "The purpose of this program", JOptionPane.INFORMATION_MESSAGE);
            }
            else if (event.getSource() == jMenuItem2) {

                JOptionPane.showMessageDialog(null, "BMI Calc v. 1.0 " , "About", JOptionPane.INFORMATION_MESSAGE);
            }


        }

    }

}

Calculations.java

public class Calculations {

        private double BMI;
        private int weight, height;

        public void calculateBMI(String sWeight, String sHeight) {

            weight = Integer.parseInt(sWeight);
            height = Integer.parseInt(sHeight);
            BMI = weight/(height*height*0.0001);
        }

        public String returnBMI() {

            return String.format("%.2f", BMI);

        }
}

它工作得很好,但是我想使代码“ clenaer”并使Handler在另一个文件中成为一个类,而不是子类。我已经创建了一个Handler.java并移动了整个Handler子类,但是该类没有看到jTextFields和jButton,因为它们是私有的(就我而言,它们应该是私有的)。

如何分离ActionListener类,访问其中的这些jObject,并且仍然可以与隐私权保持公平?

非常感谢您的回答。

达里扬

您可以Handler使用构造函数将所需的对象传递给

public class Handler {

     private JButton button;
     private JTextField textField;

     public Handler(JButton button, JTextField textField) {
          this.button = button;
          this.textField = textField;
     }

}

当实例化该类时,您只需要传入两个变量即可:

Handler handler = new Handler(jButton1, jTextField1);

解释:

您的Handler类是的内部BMICalc当嵌套类不是静态的时(另请参见静态和非静态嵌套类之间的区别),这意味着这些类的对象存在于父类的对象内。这就是为什么您的Handler班级看到私有字段的原因

当类是静态的时,这对我们来说不是问题。您只需要以Handler某种方式将这些变量传递给(构造器或设置器字段),然后可以将您的类重用于其他按钮文本字段组合。


编辑:还有另一种方式:

如果您的处理程序仅在此处,仅在此处和代码中的任何其他地方使用,则可以实例化匿名Handler并将其分配给该字段(无需在其他地方重用)。因此,例如:

jMenuItem1.addActionListener(new Handler() {
    @Override
    public void actionPerformed(ActionEvent event) {
        JOptionPane.showMessageDialog(null, "The program calculates BMI based on information entered by user." , "The purpose of this program", JOptionPane.INFORMATION_MESSAGE);
    }
});

jMenuItem2.addActionListener(new Handler() {
    @Override
    public void actionPerformed(ActionEvent event) {
        JOptionPane.showMessageDialog(null, "BMI Calc v. 1.0 " , "About", JOptionPane.INFORMATION_MESSAGE);
    }
});

现在,您不必创建一个包含很多字段和ifs的大型Handler。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我的JButton的ActionListener如何访问另一个类中的变量?

来自分类Dev

如何从另一个ActionListener访问一个ActionListener中的数组列表的元素?

来自分类Dev

Java:方法在另一个类中等待ActionListener

来自分类Dev

如何使用actionListener打开另一个类中的Jframe作为构造函数?

来自分类Dev

在另一个类中使用内部类actionListener

来自分类Dev

从另一个类向JButton添加ActionListener会导致NullPointerException吗?

来自分类Dev

在另一个类中使用内部类actionListener

来自分类Dev

如何使用来自另一个类的 ActionListener 更改 JPanel 颜色?

来自分类Dev

如何在Java中的另一个类中从主类访问int?

来自分类Dev

从ActionListener方法访问类变量

来自分类Dev

从ActionListener方法访问类变量

来自分类Dev

在主类中未调用ActionListener吗?

来自分类Dev

从类中删除ActionListener

来自分类Dev

在另一个类中访问PDO对象

来自分类Dev

从接口访问另一个类中的对象?

来自分类Dev

访问在另一个类中创建的对象

来自分类Dev

从Java中的另一个类访问变量

来自分类Dev

在JAVA中访问另一个类变量

来自分类Dev

从Java中的另一个类访问变量

来自分类Dev

无法从java中的另一个类访问一个类

来自分类Dev

如何从Java中的另一个类访问对象?

来自分类Dev

如何访问另一个类中的对象(Java)

来自分类Dev

Qt - 另一个类中的主窗口类对象不能正常工作

来自分类Dev

2类之间的Java actionlistener

来自分类Dev

2类之间的Java actionlistener

来自分类Dev

从另一个脚本访问类中的类?

来自分类Dev

从另一个脚本访问类中的类?

来自分类Dev

JAVA 2 类,都是公共的,但不能访问另一个类中的一个类

来自分类Dev

Java jbutton在另一个类中

Related 相关文章

  1. 1

    我的JButton的ActionListener如何访问另一个类中的变量?

  2. 2

    如何从另一个ActionListener访问一个ActionListener中的数组列表的元素?

  3. 3

    Java:方法在另一个类中等待ActionListener

  4. 4

    如何使用actionListener打开另一个类中的Jframe作为构造函数?

  5. 5

    在另一个类中使用内部类actionListener

  6. 6

    从另一个类向JButton添加ActionListener会导致NullPointerException吗?

  7. 7

    在另一个类中使用内部类actionListener

  8. 8

    如何使用来自另一个类的 ActionListener 更改 JPanel 颜色?

  9. 9

    如何在Java中的另一个类中从主类访问int?

  10. 10

    从ActionListener方法访问类变量

  11. 11

    从ActionListener方法访问类变量

  12. 12

    在主类中未调用ActionListener吗?

  13. 13

    从类中删除ActionListener

  14. 14

    在另一个类中访问PDO对象

  15. 15

    从接口访问另一个类中的对象?

  16. 16

    访问在另一个类中创建的对象

  17. 17

    从Java中的另一个类访问变量

  18. 18

    在JAVA中访问另一个类变量

  19. 19

    从Java中的另一个类访问变量

  20. 20

    无法从java中的另一个类访问一个类

  21. 21

    如何从Java中的另一个类访问对象?

  22. 22

    如何访问另一个类中的对象(Java)

  23. 23

    Qt - 另一个类中的主窗口类对象不能正常工作

  24. 24

    2类之间的Java actionlistener

  25. 25

    2类之间的Java actionlistener

  26. 26

    从另一个脚本访问类中的类?

  27. 27

    从另一个脚本访问类中的类?

  28. 28

    JAVA 2 类,都是公共的,但不能访问另一个类中的一个类

  29. 29

    Java jbutton在另一个类中

热门标签

归档