将JComponents访问到另一个java非GUI类中
如何在另一个非GUI类中访问一个类的任何JComponent(例如JTextField)?我想访问它们,以便在非GUI类中实现所有函数,然后在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
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实例是模型,从数据库读取和写入的代码将是控制器的一部分。