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吗一种代码示例?我没听你的他