如何在不再运行该帧的情况下更新我的JList?

时间:2010-01-12 09:12:52

标签: java swing

我有一个主框架,其中包含一个列表和“添加”按钮。当我点击“添加”按钮时,将显示一个框架,我可以输入姓名,家人和身份。

通过单击“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);
        }
    }

3 个答案:

答案 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,你明白了我的观点