Java 如何将对象的一部分传递给另一个类
我试图将属于某个对象的变量传递给另一个类,以便使用它们。我想不出怎么做。请帮忙 这是目标Java 如何将对象的一部分传递给另一个类,java,Java,我试图将属于某个对象的变量传递给另一个类,以便使用它们。我想不出怎么做。请帮忙 这是目标 package appgui; import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.s
package appgui;
import java.awt.Color;
import java.awt.Font;
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.JPanel;
import javax.swing.JTextField;
public class MainFrame extends JFrame {
private BankAccount account;
private JLabel label;
private JTextField amountField;
private static final int FRAME_HEIGHT = 600;
private static final int FRAME_WIDTH = 400;
public MainFrame(String t, BankAccount anAccount) {
super(t);
account = anAccount;
// Label that displays the result
label = new JLabel("Balance: " + account.getBalance());
label.setFont(new Font("Arial", Font.BOLD, 22));
label.setForeground(Color.RED);
// Create the label, text field, and button for entering amount
JLabel amountLabel = new JLabel("Amount: ");
amountField = new JTextField(7);
// Create the Control Panel that holds all components
JPanel controlPanel = new JPanel();
controlPanel.add(amountLabel);
controlPanel.add(amountField);
controlPanel.add(createWithdrawButton());
controlPanel.add(createDepositeButton());
controlPanel.add(label);
add(controlPanel);
setSize(FRAME_HEIGHT, FRAME_WIDTH);
//setLayout(new GridBagLayout());
}
private JButton createDepositeButton() {
JButton depositButton = new JButton("Deposit");
ActionListener listener1 = new DepositListener();
depositButton.addActionListener(listener1);
return depositButton;
}
这是我试图将上面的一些变量传递到的类,因为我需要它们的值,如amountField
,account
和label
package appgui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
class DepositListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
double depositAmount = Double.parseDouble(amountField.getText());
account.deposit(depositAmount);
label.setText("Balance: " + account.getBalance());
}
}
您不希望获取“对象的一部分”,而是获取对象本身,并通过getter方法查询其状态,以及通过setter方法设置其状态
您的侦听器需要对调用它的GUI的引用。我认为最干净的方法是在构造函数参数中传递它:
class DepositListener implements ActionListener {
private MainFrame mainFrame;
public DepositListener(MainFrame mainFrame) {
this.mainFrame = mainFrame;
}
public void actionPerformed(ActionEvent event) {
// you'll need to give MainFrame public methods to extract information, e.g.,
double depositAmount = Double.parseDouble(mainFrame.getAmount());
// ... etccc
// and to display information
mainFrame.setBalanceText(....);
}
}
为了重复波希米亚人的答案(1+),是的,使用接口,但我不喜欢得到实际的组件,而只是必要的信息。仅暴露需要暴露的内容:
public interface AccountDisplay {
double getAmount();
BankAccount getAccount(); // this is OK if BankAccount is non GUI
void setBalanceText(String text);
}
那么,内部类呢:
public class MainFrame extends JFrame {
....
class DepositListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
double depositAmount = Double.parseDouble(amountField.getText());
account.deposit(depositAmount);
label.setText("Balance: " + account.getBalance());
}
}
}
这就行了。只需为您试图访问的变量创建getter,并让您的第二个类保存对第一个类的对象引用为其他类感兴趣的字段创建一个接口,让对象的类实现它,并让另一个类的方法期望接口的实例:
public interface AccountDisplay {
JLabel getAmount();
BankAccount getAccount();
JTextField getLabel();
}
public class MainFrame extends JFrame implements AccountDisplay {
// implement the getters of the interface to return the appropriate fields
}
class DepositListener implements ActionListener {
private AccountDisplay accountDisplay;
public DepositListener(AccountDisplay accountDisplay) {
this.accountDisplay = accountDisplay;
}
public void actionPerformed(ActionEvent event) {
double depositAmount = Double.parseDouble(accountDisplay.getAmount().getText());
accountDisplay.getAccount().setBalanceText(....);
}
}
我不明白这个问题。愚蠢的问题我会把什么传递到
新的储户Listener()
,因为现在是预期的?你会请求对当前大型机的有效引用。如果DepostListener是在大型机中创建的,则可能是此
。编辑:没错。非常感谢你的帮助@波希米亚人——我也在考虑使用接口,事实上,我在自己的程序中也是这样做的。我现在希望通过依赖项注入进一步分离关注点。1+接口是最好的选择@Bohemian让其他方法和接口实例使用的语法是什么?我已经添加了一个简单的示例来说明如何使用它。我同意@hover的观点,即通过删除对可视化渲染类(JLabel等)实现的引用来进一步抽象设计将是一种改进,但可能有些过分,因为您还需要将值的获取/设置抽象给它们(委托),这看起来像是代码膨胀worth@Bohemian这很好,但是现在新的DepositorListener(this)没有编译,因为它需要的是大型机。我应该在那里放什么?@Bohemian nevermind一旦我保存了文件,错误就消失了。传递此
仍然有效