Java 如何在不再次运行该框架的情况下更新我的JList?

Java 如何在不再次运行该框架的情况下更新我的JList?,java,swing,Java,Swing,我有一个主框架,有一个列表和“添加”按钮。当我单击“添加”按钮时,将显示一个框架,我可以输入姓名、族和id 通过单击“addAPerson”,名称将存储在SQL中。但是当我关闭框架时,新的人员不会添加到我的主框架中的列表中,但是如果我关闭主框架并再次运行它,新的人员将添加到列表中 如何在不运行主框架的情况下更新 我的主框架(其中的一部分): 我的经理课程(其中的一部分): 在submit方法中,保存创建的人员并为其创建一个字段,您可以从ListFrame类中“add”按钮的actionPerfo

我有一个主框架,有一个列表和“添加”按钮。当我单击“添加”按钮时,将显示一个框架,我可以输入姓名、族和id

通过单击“addAPerson”,名称将存储在SQL中。但是当我关闭框架时,新的人员不会添加到我的主框架中的列表中,但是如果我关闭主框架并再次运行它,新的人员将添加到列表中

如何在不运行主框架的情况下更新

我的主框架(其中的一部分):

我的经理课程(其中的一部分):


在submit方法中,保存创建的人员并为其创建一个字段,您可以从ListFrame类中“add”按钮的actionPerformed方法中“获取”该字段。然后只需将其添加到列表模型中。

观察者模式的实现就可以做到这一点

您的InformationClass调用经理添加一个人(如果还不知道)。但是您希望新的人出现在列表框中。使用观察者模式,ListFrame将观察管理器是否添加、更改或删除了一些记录。如果是这样的话,ListFrame可以用实际值更新自己,它只是再次从管理器请求

我们需要一个额外的接口,一个监听器和管理器上的一些方法,仅此而已

下面是一个基本实现:

public interface PersonsModelChangeListener {
  public void modelHasChanged();
}
在管理器中,添加以下字段和方法:

List<PersonsModelChangeListener> listeners = new ArrayList<PersonsModelChangeListener>();

public void addListener(PersonsModelChangeListener listener) {
  listeners.add(listener);
}

private void fireModelChangeEvent() {
  for (PersonsModelChangeListener listener:listeners) {
    listener.modelHasChanged();
  }
}
下一步:使ListFrame实现PersonsModelChangeListener接口并实现modelHasChanged方法,以便ListFrame可以在Manager数据集发生更改时“获取”实际值

编辑

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
  }
}
公共类管理器{
//现行守则
私有静态列表侦听器=新的ArrayList();
公共静态void addListener(PersonModelChangeListener listener){
添加(侦听器);
}
私有静态void fireModelChangeEvent(){
for(PersonModelChangeListener:侦听器){
modelHasChanged();
}
}
公共静态void addPerson(字符串名称、字符串族、字符串yahooId){
编制报表;
字符串查询;
试一试{
查询=(“插入到newpersontable(名称、族、yahooId)值(?,?)”;
pstmt=(PreparedStatement)conn.PreparedStatement(query);
pstmt.setString(1,名称);
pstmt.setString(2,系列);
pstmt.setString(3,yahooId);
pstmt.executeUpdate();
fireModelChangedEvent();
}捕获(SQLE异常){
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE,null,e);
}
}
公共类ListFrame扩展了javax.swing.JFrame实现了PersonModelChangeListener{
//你的领域
/**创建新表单列表框*/
公共列表框架(InformationClass客户端){
初始化组件();
this.client=client;
fillTable();
Manager.addListener(this);
}
@凌驾
public void modelHasChanged(){
//当您添加具有
//经理。
//在此处添加代码以从管理器获取实际数据
//并更新此组件
}
}

希望有帮助:)

您只需在编码结束时调用update方法。update方法应显示表。因此,当您向列表中添加某些内容时,它将在数据库中更新。因此,在编码结束时,它将调用update方法来显示更新的表。希望您明白我的意思。

我无法完成您所做的事情我已经编辑了我的帖子(我添加了我的Manager类的一部分),还有你的modelHasChanged()方法在Manager类中没有主体。请您帮助我处理这个Manager类好吗?非常感谢您的编辑,但是我不能在Manager类中使用modelHasChanged方法!它不起作用!!这也是我的modelHasChanged方法:public void modelHasChanged(){try{model.clear();List List=null;List=Manager.getClientListFromMySQL();for(int i=0;ipublic interface PersonsModelChangeListener { public void modelHasChanged(); }
List<PersonsModelChangeListener> listeners = new ArrayList<PersonsModelChangeListener>();

public void addListener(PersonsModelChangeListener listener) {
  listeners.add(listener);
}

private void fireModelChangeEvent() {
  for (PersonsModelChangeListener listener:listeners) {
    listener.modelHasChanged();
  }
}
public void add(String s1, String s2, String s3) {
  // existing code
  fireModelChanged();
}
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
  }
}