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

时间:2014-01-11 20:15:34

标签: 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 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中,您将找到一个名为CustomerFormPanel的类。此类用作用户可以输入名称,人员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中输入一些信息并单击“添加”进行注册时;什么都没发生。我认为问题是Controller连接到MainFrame而不是CustomerFormPanel。但我不知道如何通过CustomerPanel,MainFrame和CustomerApplication解析来自CustomerFormPanel的信息。

如果这里的任何内容都没有意义,我很抱歉,但从新手的角度解释这一点很难。我确实理解这个问题是否被删除或标题是否被更改。

修改 这是addCustomer方法:

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

3 个答案:

答案 0 :(得分:1)

首先......

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

这可确保您不会不必要地暴露部分组件(例如字段),并且只提供对所需数据的访问。

然后,您需要对CustomerPanel执行相同的操作,这实际上将充当CustomerFormPanel的代理。因此,您无需直接公开CustomerFormPanel的实例,而只需通过CustomerPanel

提供代理getter / setter

或者,您可以使用Visitor Pattern

基本上这意味着,您将创建一个对象,该对象具有构建所需结果所需的setter和getter,并将其传递到CustomerPanel,然后CustomerPanel将设置值如果有这个对象,然后将其他形式传递给它,它们会做同样的事情,每个形式都将值设置为他们正在管理的对象。

完成后,您将能够收集此对象的所有信息,以生成您需要的结果,这实际上描述了build pattern

答案 1 :(得分:0)

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

例如:

<强> Main.java

public static String name = "Koala";

<强> PrinterClass.java

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

答案 2 :(得分:0)

MadProgrammer已经完全回答了你的问题,但是直接用一个例子来解决你的问题......

您似乎没有在Controller中设置CustomerPanel,而只在您的框架中设置Controller。如果你的框架不需要CustomerPanel,只需引用Controller的{​​{1}} getter / setter(这就是MadProgrammer在创建代理getter / setter时所指的。

public class CustomerFormPanel{

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

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