Java 如何将代码从一个类传递到第二个类,再传递到第三个类?

Java 如何将代码从一个类传递到第二个类,再传递到第三个类?,java,swing,class,controller,Java,Swing,Class,Controller,这对于像我这样的新手来说是很难解释的,但我会尝试一下。我创建了这个类: public class MainFrame extends JFrame { private JTabbedPane tabPane; private CustomerPanel customerPanel; private VehiclePanel vehiclePanel; private OrderPanel orderPanel; private Controller controller; public vo

这对于像我这样的新手来说是很难解释的,但我会尝试一下。我创建了这个类:

public class MainFrame extends JFrame {

private JTabbedPane tabPane;
private CustomerPanel customerPanel;
private VehiclePanel vehiclePanel;
private OrderPanel orderPanel;
private Controller controller;

public void setController(Controller controller) {
    this.controller = controller;
}

public MainFrame() {
    setLayout(new BorderLayout());

    tabPane = new JTabbedPane();
    customerPanel = new CustomerPanel();
    vehiclePanel = new VehiclePanel();
    orderPanel = new OrderPanel();

    tabPane.add("Kunder", customerPanel);
    tabPane.add("Fordon", vehiclePanel);
    tabPane.add("Order", orderPanel);

    add(tabPane, BorderLayout.CENTER);

    }
}
如您所见,它包含两个面板。在这些面板中,更确切地说是在CustomerPanel中,您将发现一个名为CustomerPanel的类。该类作为一种表单,用户可以在其中输入诸如姓名、个人id等信息。它还连接到控制器,该控制器将GUI和其他类组合在一起。这里的关键代码是:

[...]
public void setController(Controller controller) {
    this.controller = controller;
}
public void CustomerFormPanel() {
[...]
regBtn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String cName = nameField.getText();
            String pNumber = pNrField.getText();
            controller.addCustomer(pNumber, cName);
            responseLabel.setText("Status: A Customer has been created!");
        }
    });
}
现在是主课。这是一节课,我把所有的内容放在一起,看起来是这样的:

public class CustomerApplication {

MainFrame myFrame;

public CustomerApplication() {
    myFrame = new MainFrame();

    myFrame.setMinimumSize(new Dimension(700, 640));
    myFrame.setLocation(150, 150);
    myFrame.setSize(1000, 900);
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    myFrame.setVisible(true);
    }

public static void main(String[] args) {
    CustomerApplication customerApplication = new CustomerApplication();
    customerApplication.link();
    }

private void link() {
    CustomerRegister customerRegistry = new CustomerRegister();
    Controller controller = new Controller(customerRegistry, myFrame);
    myFrame.setController(controller);
    }

}
最后这是我的控制器类:

public class Controller {
CustomerRegister customers;
MainFrame mainFrame;

public Controller(CustomerRegister customerRegister, MainFrame mainFrame) {
    this.customers = customerRegister;
    this.mainFrame = mainFrame;
}
问题是,当我在CustomerFormPanel中输入一些信息并单击“添加”进行注册时;什么也没发生。我认为问题在于控制器连接到主机,而不是客户面板。但我不知道如何解析来自CustomerPanel、CustomerPanel、大型机和CustomerApplication的信息

如果这里没有任何道理,我很抱歉,但从新手的角度解释这一点非常困难。如果这个问题被删除或标题被更改,我也理解

编辑: 以下是addCustomer方法:

public void addCustomer(String pNumber, String cName) {
    Customer tmpCustomer = new Customer(pNumber, cName);
    customers.addCustomer(tmpCustomer);
}

如果我所理解的是正确的,那么您需要访问来自不同类的数据。 尝试使用静态变量。静态意味着您可以从项目中的任何类访问它们

例如:

Main.java

public static String name = "Koala";
System.out.println("Hi, my favourite animal is the: " + Main.name);
//output will be: Hi, my favourite animal is the Koala
PrinterClass.java

public static String name = "Koala";
System.out.println("Hi, my favourite animal is the: " + Main.name);
//output will be: Hi, my favourite animal is the Koala
首先

CustomerFormPanel
需要某种方式来公开它包含的信息。一种解决方案是提供setter和getter,允许
CustomerPanel
更改/设置并从该组件获取值

这可以确保您不会不必要地公开组件的某些部分(例如字段),而只提供对所需数据的访问

然后,您需要对
CustomerPanel
执行相同的操作,该面板本质上充当
CustomerPanel
的代理。因此,您不需要直接公开
CustomerPanel
的实例,只需通过
CustomerPanel

或者,您可以使用

基本上这意味着,您将创建一个对象,该对象具有构建所需结果所需的setter和getter,并将其传递到
CustomerPanel
,然后
CustomerPanel
将设置该对象的值(如果有),然后将其传递给其他表单,这些表单也会这样做,每个设置都会为其管理的对象设置值


完成后,您将能够从该对象收集所有信息以生成所需的结果,该结果实际上描述了程序员已经非常完整地回答了您的问题,但要直接通过示例解决您的问题

看起来您没有在
客户面板
中设置
控制器
,而只是在您的框架中。如果您的框架不需要
控制器
,只需参考
控制器
客户面板
getter/setters(这就是MadProgrammer在说创建代理getter/setters时所指的)

public class CustomerFormPanel{

    //proxy controller setter
    public void setController(Controller controller){
        customerPanel.setController(controller);
    }

    //proxy controller getter
    public Controller getController(){
        return customerPanel.getController();
    }
}

你的Controller.addCustomer方法在哪里?是什么让你相信什么都没有发生?它在Controller类中。就在构造函数的正下方。当我按下应该注册客户信息的按钮时,什么都没有发生。我已经用一个简单的System.out.prinln试过actionlistener,它可以工作了。你在做什么猜测?@Dinco好的,也许我使用了错误的措辞。请包含您的addCustomer方法。我希望用户输入的信息会被保存,状态标签会更改文本。我还可以添加一点,当我按下按钮时,我会出错。不,尤其是在这种情况下。
static
意味着只有一个va实例riable可能存在,这意味着如果您打开两个表单,您将在它们之间混合值,从而丢失正确的上下文。
static
应该非常小心地使用,并且不适合此解决方案……为什么它是错误的?例如,如果您想使用来自不同JPanel或JFrames的数据,您必须这样做,或者创建一个Dat将所有数据放在那里并存储在那里。除非所有代码始终在同一个类和开关面板中,否则必须使用它。static关键字意味着所有客户面板将使用同一个控制器。如果您以后只想为客户面板的一个实例使用不同的控制器,该怎么办?整个pro中的任何代码都可以JET可以更改面板所有实例的静态变量。Mad程序员绝对是对的,静态不是解决办法。如果包含
static
值的类有多个实例,会发生什么情况?如果其中一个实例更改了
static
值,会发生什么情况?所有实例都将共享相同的值,您没有更改的上下文,因为您不再知道谁实际更改了值以及该值是否正确。如果您突然有多个
静态
值,您如何保证这些值的正确性,以及它们是否实际相互关联…?我想知道您为什么想要更多的值同一个变量的一个实例,不管怎样…我的错不是说它在使用静态时变为全局变量,但我没有用这种方式在面板上进行切换的程序,也没有你说的那么困难和危险。很抱歉,这太离谱了。一件事都不明白。你可能包括som吗一种代码示例?我没听你的他