将JComponents访问到另一个java非GUI类中

将JComponents访问到另一个java非GUI类中,java,swing,Java,Swing,如何在另一个非GUI类中访问一个类的任何JComponent(例如JTextField)?我想访问它们,以便在非GUI类中实现所有函数,然后在GUI侦听器中调用这些函数。 例如: public class New_Client { private JFrame frmNewClient; private JTextField txt_FirstName,txt_LastName,txt_Address,txt_Phone; private JButton submi

如何在另一个非GUI类中访问一个类的任何JComponent(例如JTextField)?我想访问它们,以便在非GUI类中实现所有函数,然后在GUI侦听器中调用这些函数。 例如:

public class New_Client {
     private JFrame frmNewClient;
     private JTextField txt_FirstName,txt_LastName,txt_Address,txt_Phone;
     private JButton submit;
     public New_Client() {
         //initializing frame and other components
          ...
        txt_FirstName = new JTextField();
        txt_FirstName.setBounds(350,220,300,80);
        frmNewClient.getContentPane().add(txt_FirstName);

        submit = new JButton("Submit");
        submit.setSize(115,55);
        submit.setLocation(800,420);
        frmNewClient.getContentPane().add(submit);

        submit.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent arg0) {
            ReceptionsitClass.insertRecords();
        }
    });
}
}

另一类为:

public class Person {

private int id;
private String firstName, lastName, address, phone;

public Person(int ID, String fName, String lName, String addr, String tel){
    this.id = ID;
    this.firstName = fName;
    this.lastName = lName;
    this.address = addr;
    this.phone = tel;
}

public int getID(){
    return this.id;
}
}

另一个类是前台类,它实现了插入功能:

public class ReceptionistClass {

public void InsertRecord() {

    Connection.getDBConnection().Connect();
    //String FirstName = txt_FirstName.getText(); 
    // How can I access txt_FirstName.getText() so that I can pass that value to the query and store it...
   ...
  // Person p = New Person(ID, FirstName,LastName, Adress, Phone);
}

}有一些问题和一些方法可以解决。 使字段静态和公共的最简单方法(不推荐):

  public static JTextField txt_FirstName,txt_LastName,txt_Address,txt_Phone;
在这样的任何类中都无法访问它

String FirstName = New_Client.txt_FirstName.getText();
一个更好的方法是使它不是静态的,但是你必须在你的类中有这个新的_客户端的实例,并像这样使用它:

    New_Client new_client=null; // initialize it before use
//...
    String FirstName = new_client.txt_FirstName.getText();

还有其他更合适的方法以正确的方式实现这一点。我建议使用模型视图控制器。您应该将数据与视图和控件分开。对于简单的SWING应用程序来说,这可能看起来有些过头了,但这是正确的方法。

您正在倒退

构建GUI时,应使用。您不仅将关注点分为一个模型、一个视图和一个或多个控制器,而且按照这个顺序进行开发。首先,创建模型,然后创建视图,最后创建控制器

所以,让我们看看你的模型。我已经包括了所有的能手和二传手

public class Person {

    private int id;
    private String firstName, lastName, address, phone;

    public Person(int ID, String fName, String lName, String addr,
            String tel) {
        this.id = ID;
        this.firstName = fName;
        this.lastName = lName;
        this.address = addr;
        this.phone = tel;
    }

    public int getID() {
        return this.id;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

}
接下来,必须将模型传递给视图。这是你观点的一个大致正确的版本

public class NewClient {
    private JFrame frmNewClient;
    private JTextField txt_FirstName, txt_LastName, txt_Address, txt_Phone;
    private JButton submit;

    public NewClient() {
        final Person person = new Person(100, "John", "Smith", "", "");

        // initializing frame and other components

        frmNewClient = new JFrame("New Client");
        frmNewClient.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();

        txt_FirstName = new JTextField();
        txt_FirstName.setText(person.getFirstName());
        panel.add(txt_FirstName);

        submit = new JButton("Submit");
        submit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                person.setFirstName(txt_FirstName.getText().trim());
                ReceptionistClass rc = new ReceptionistClass();
                rc.insertRecord(person);
            }
        });
        panel.add(submit);

        frmNewClient.add(panel);
        frmNewClient.pack();
        frmNewClient.setVisible(true);
    }
}
最后,让您的控制器类将您的人员写入数据库

public class ReceptionistClass {

    public void insertRecord(Person person) {

        Connection.getDBConnection().Connect();
        // You don't care about the view here.
        // All you care about is the Person instance.
    }
}

我希望这有助于您组织代码,以便一次只关注一小部分。

您是否为文本字段编写了
ActionListener
“我如何实现这一点?”为文本字段编写了
actionlistner
。请参阅“GUI新客户端类中的侦听器”什么侦听器?我没有看到。你应该用相关的代码和清晰的说明来回答你的问题。包括类所在的包。为什么要创建Person类的实例并传递参数,然后将文本设置为jTextField?@Afrim:因为这是一个简单的示例。您的视图必须有单独的JPanel用于添加人员、更改人员和删除人员。您的Person实例是模型,从数据库读取和写入的代码将是控制器的一部分。