我有一个主框架,其中包含一个列表和“添加”按钮。当我点击“添加”按钮时,将显示一个框架,我可以输入姓名,家人和身份。
通过单击“addAPerson”,该名称将存储在SQL中。但是当我关闭框架时,新人将不会被添加到我的主框架中的列表中,但是如果我关闭主框架并再次运行它,新人将被添加到列表中。
如何在不运行主框架的情况下更新JList?
我的主框架(其中一部分):
public class ListFrame extends javax.swing.JFrame {
private InformationClass client;
private DefaultListModel model = new DefaultListModel();
/** Creates new form ListFrame. */
public ListFrame(InformationClass client) {
initComponents();
this.client = client;
fillTable();
}
public void fillTable() {
try {
List<InformationClass> list = null;
list = Manager.getClientListFromMySQL();
if (list == null) {
JOptionPane.showMessageDialog(
this,
"You should add a person to your list",
"Information",
JOptionPane.OK_OPTION);
return;
}
else {
for (int i = 0; i < list.size(); i++) {
InformationClass list1 = list.get(i);
model.add(i, list1.getId());
}
jList1.setModel(model);
}
}
catch (SQLException ex) {
Logger.getLogger(
ListFrame.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
单击添加按钮(其中一部分)时将显示的框架:
public class Add extends javax.swing.JFrame {
private InformationClass client;
public Add(InformationClass client) {
initComponents();
this.client = client;
}
private void addAPersonActionPerformed(java.awt.event.ActionEvent evt) {
submit();
clear();
}
private void submit() {
String s1 = nameF.getText();
String s2 = familyF.getText();
String s3 = iDf.getText();
if (s1.equals("") || s2.equals("") || s3.equals("")) {
JOptionPane.showMessageDialog(
this,
"fill the empty name/family/id text fields",
"Error",
JOptionPane.ERROR_MESSAGE);
return;
}
else {
try {
boolean b = Manager.isAddPerson(s1, s2, s3);
if (b == false) {
Manager.addPerson(s1, s2, s3);
JOptionPane.showMessageDialog(
this,
"The person has been added successfully",
"Information",
JOptionPane.INFORMATION_MESSAGE);
}
else {
JOptionPane.showMessageDialog(
this,
"These datas has been added before!!",
"Information",
JOptionPane.INFORMATION_MESSAGE);
}
}
catch (NullPointerException e) {
e.printStackTrace();
}
}
}
}
我的经理课程(其中一部分):
public static void addPerson(String name, String family, String yahooId) {
PreparedStatement pstmt;
String query;
try {
query = ("INSERT INTO newpersontable(name,family,yahooId) VALUES(?,?,?)");
pstmt = (PreparedStatement) conn.prepareStatement(query);
pstmt.setString(1, name);
pstmt.setString(2, family);
pstmt.setString(3, yahooId);
pstmt.executeUpdate();
}
catch (SQLException e) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, e);
}
}
答案 0 :(得分:2)
观察者模式的实现将起到作用。
您的InformationClass会调用管理器来添加人员(如果尚未知道)。但是你希望新人出现在ListFrame中。使用Observer模式,ListFrame将观察 Manager,如果它有一些添加,更改或删除的记录。如果是这种情况,ListFrame可以使用实际值更新自己,它只是再次从Manager请求。
我们需要一个额外的接口,一个监听器和一些管理器上的方法,这就是全部。
这是一个基本的实现:
public interface PersonsModelChangeListener {
public void modelHasChanged();
}
在Manager中,添加以下字段和方法:
List<PersonsModelChangeListener> listeners = new ArrayList<PersonsModelChangeListener>();
public void addListener(PersonsModelChangeListener listener) {
listeners.add(listener);
}
private void fireModelChangeEvent() {
for (PersonsModelChangeListener listener:listeners) {
listener.modelHasChanged();
}
}
将以下行添加到Manager的add方法:
public void add(String s1, String s2, String s3) {
// existing code
fireModelChanged();
}
下一步:使ListFrame实现PersonsModelChangeListener接口并实现modelHasChanged方法,以便ListFrame可以在Managers数据集发生更改时“获取”实际值。
修改强>
public class Manager {
// existing code
private static List<PersonsModelChangeListener> listeners = new ArrayList<PersonsModelChangeListener>();
public static void addListener(PersonsModelChangeListener listener) {
listeners.add(listener);
}
private static void fireModelChangeEvent() {
for (PersonsModelChangeListener listener:listeners) {
listener.modelHasChanged();
}
}
public static void addPerson(String name, String family, String yahooId) {
PreparedStatement pstmt;
String query;
try {
query = ("INSERT INTO newpersontable(name,family,yahooId) VALUES(?,?,?)");
pstmt = (PreparedStatement) conn.prepareStatement(query);
pstmt.setString(1, name);
pstmt.setString(2, family);
pstmt.setString(3, yahooId);
pstmt.executeUpdate();
fireModelChangedEvent();
} catch (SQLException e) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, e);
}
}
public class ListFrame extends javax.swing.JFrame implements PersonsModelChangeListener {
// your fields
/** Creates new form ListFrame */
public ListFrame(InformationClass client) {
initComponents();
this.client = client;
fillTable();
Manager.addListener(this);
}
@Override
public void modelHasChanged() {
// this method will be called when you add something with the
// Manager.
// Add your code here to get the actual data from the Manager
// and update this component
}
}
希望有所帮助:)
答案 1 :(得分:0)
在提交方法中保存创建的人并为其创建一个字段,您可以从listFrame类中的“添加”按钮的actionPerformed方法中“获取”该字段。然后将其添加到列表模型中。
答案 2 :(得分:0)
您只需在编码结束时调用更新方法。更新方法应显示表格。因此,当您向列表中添加一些内容时,它将在数据库中更新。因此,在编码结束时,它将调用更新方法,该方法将显示更新的表.Hopu,你明白了我的观点