对于像我这样的新手来说,这很难解释,但我会试一试。我创建了这个类:
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);
}
答案 0 :(得分:1)
首先......
CustomerFormPanel
需要某种方式来公开它包含的信息。一种解决方案是提供允许CustomerPanel
更改/设置并从此组件获取值的setter和getter。
这可确保您不会不必要地暴露部分组件(例如字段),并且只提供对所需数据的访问。
然后,您需要对CustomerPanel
执行相同的操作,这实际上将充当CustomerFormPanel
的代理。因此,您无需直接公开CustomerFormPanel
的实例,而只需通过CustomerPanel
或者,您可以使用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();
}
}