如何解决将事件处理程序传递给 Java 中的单独类
我正在制作一个严格的乘法计算器,但我对 Java 中的事件处理程序并没有真正的经验。
我不确定为什么文本字段在按钮按下时没有更新。
我必须遵循模型视图控制器编程结构,所以我不能将按钮和事件处理程序放在同一个类中,我相信这会让这更容易。这是两个相关的类:
查看:
import javax.swing.*;
import java.math.BigInteger;
import java.awt.*;
public class CalcView extends JFrame {
public static final String INITIAL_VALUE = "1";
public JTextField m_totalTf = new JTextField(10);
public JTextField m_userInputTf = new JTextField(10);
public JButton m_multiplyBtn = new JButton("Multiply");
public JButton m_clearBtn = new JButton("Clear");
public BigInteger m_total; // The total current value state.
public void CalcGUI() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Performs Simple Multiplications");
this.setVisible(true);
m_total = new BigInteger(INITIAL_VALUE);
m_totalTf.setText(INITIAL_VALUE);
m_totalTf.setEditable(false);
JPanel content = new JPanel();
content.setLayout(new FlowLayout());
content.add(new JLabel("Input"));
content.add(m_userInputTf);
content.add(m_multiplyBtn);
content.add(new JLabel("Total"));
content.add(m_totalTf);
content.add(m_clearBtn);
this.setContentPane(content);
this.pack();
}
public void throwExcept() {
JOptionPane.showMessageDialog(CalcView.this,"Bad Number");
}
}
型号
import java.awt.event.*;
import java.math.BigInteger;
public class CalcModel{
public static final String INITIAL_VALUE = "1";
public void clear(){
CalcView v = new CalcView();
v.m_total = new BigInteger(v.INITIAL_VALUE);
v.m_totalTf.setText(v.INITIAL_VALUE);
}
public BigInteger multiply(){
CalcView v = new CalcView();
BigInteger num1 = new BigInteger(v.m_userInputTf.getText());
BigInteger num2 = new BigInteger(v.m_totalTf.getText());
v.m_total = num1.multiply(num2);
return v.m_total;
}
}
控制器
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CalcController {
public static void main(String[] args) {
CalcView v = new CalcView();
CalcController c = new CalcController();
v.CalcGUI();
c.listener();
}
public void listener() {
CalcView v = new CalcView();
CalcModel m = new CalcModel();
v.m_clearBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
m.clear();
}
});
v.m_multiplyBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
CalcModel m = new CalcModel();
m.multiply();
} catch (NumberFormatException nex) {
CalcView v = new CalcView();
v.throwExcept();
}
}
});
}
}
解决方法
您每次都在创建 CalcView 而不是传递引用。 例如在您的主要方法中。你应该这样做:
CalcView v = new CalcView();
CalcController c = new CalcController(v); //See here.
v.CalcGUI();
c.listener();
将传递给 CalcController 的构造函数的引用存储为类成员。 并在侦听器方法中使用它,而不是创建新的 CalcView。同样,您也在重新创建模型。
进行这些编辑后,您的 CalcController 将如下所示:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CalcController {
private CalcView view;
public CalcController(CalcView view) {
this.view = view;
}
public static void main(String[] args) {
CalcView v = new CalcView();
CalcController c = new CalcController(v);
v.CalcGUI();
c.listener();
}
public void listener() {
CalcModel m = new CalcModel();
view.m_clearBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
m.clear();
}
});
view.m_multiplyBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
m.multiply();
} catch (NumberFormatException nex) {
view.throwExcept();
}
}
});
}
}
您的 CalcModel 中存在同样的娱乐问题,您也应该在它的构造函数中传递 CalcView。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。