Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将对象的一部分传递给另一个类_Java - Fatal编程技术网

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一旦我保存了文件,错误就消失了。传递
仍然有效