如何将数据从1 JFrame表单中的文本字段传递到另一个JFrame表单中的JList?

时间:2014-12-16 01:26:18

标签: java swing user-interface jtextfield jlist

使用GUI,允许客户在1个GUI上注册他们的信息(按钮点击添加新客户),点击添加按钮注册他们的信息后,它将收集他们的所有数据(姓名,地址,地址)第1/2行,城市和邮政编码),然后将其上传到上一个GUI中的JList,在该GUI中显示客户的第一个&姓。然后,用户可以从中选择该特定客户,然后单击以在新GUI中更新客户的详细信息。

我遇到的问题是试图弄清楚如何从第二个GUI中的文本字段传递所有客户的数据,并将它们传输到第一个GUI中的JList,只有第一个和第一个。姓氏正在显示。我还面临的第二个问题是如何打开另一个GUI,然后在选择特定客户时反转该流程,以便对其详细信息进行更改。

在我的数据模型包的Person类中,我得到了getFullName方法,如下所示:

public String getFullName()
{
    String result = this.forename + " " + this.surname;
    return result;
}

有没有人知道如何或可以告诉我如何应用这些问题的解决方案?

按下btnAdd后,我尝试在第二个GUI中使用getFullName方法进行体验,如下所示:

public void addItem()
{
    String result = this.forename + " " + this.surname;
    return result;
}

但是我没有运气。

3 个答案:

答案 0 :(得分:1)

关于你的问题:

  

我遇到的问题是试图弄清楚如何从第二个GUI中的文本字段传递所有客户的数据,并将它们传输到第一个GUI中的JList ...

在这种情况下通常有两个问题 -

  1. 如何获取添加新客户对话窗口(以及是,这应该是某种形式的对话窗口,JDialog或JOptionPane)的字段所持有的信息到父窗口对象中,并且
  2. 如何在 时确切地通知此信息传输,这通常是两者中更有问题的。
  3. 同样,第一个问题通常很容易解决,因为它只不过是如何在两个类之间传递信息的更一般问题的特定版本。解决它的最简单方法是让父窗口类调用对话框窗口类中的getter方法来提取其状态。例如,对话框窗口可以有每个JTextField中保存的数据的公共getter方法,调用父窗口可以调用,或者对话框类可以有一个getCustomer()方法,在该方法中,它收集由其保存的所有信息。输入字段,创建Customer对象,然后返回该对象。

    传输数据的更好,更强大的方法可能是将程序结构化为模型 - 视图 - 控制或MVC类型程序,在按下提交按钮时添加新的客户对话窗口更新模型,并且模型通知父主窗口其数据已被更改,因此它知道它必须更新其数据视图。这可能对你的程序来说太过分了,所以我不打算推​​荐这个建议此时,但将来,当你创建更大更复杂的程序时,这真的是你想要的要做,因为它会更容易让你的程序类具有高内聚性(处理相同事物的代码紧密相连)和低耦合(处理不同事物的代码没有紧密绑定,这降低了代码复杂性),使调试和改进程序变得更加容易。

    同样,第二个问题更难以解决。如果在获取并提交构成一个客户的信息后关闭对话窗口,则最简单的解决方案是使新客户对话窗口成为模态 JDialog或JOptionPane(实际上< strong> 只不过是一个专门的模态JDialog)。为什么这有助于Swing有一个特殊的模态对话机制,它在设置对话框可见后立即开始在调用窗口中冻结代码流。因此,调用代码将始终知道对话框何时不再可见,因为只有当对话框不可见时,代码的程序流才会恢复。因此,您需要在设置对话框或JOptionPane可见的行之后的行中提取对话框窗口的数据。在您放弃JOptionPanes过于简单化之前,要了解他们的第二个参数Object类型可以将任何 Swing GUI组件作为参数,包括一个非常大的JPanel和复杂的GUI,使这些工具非常有用。

    如果第二个对话窗口在提交客户时不会关闭并且要保持打开状态,例如如果您想让它保持打开状态以便用户可以输入多个客户,那么您很可能希望它是非模态 JDialog,并且需要设置某种通知方案,以便在用户提交客户时通知调用代码。一种可能的方法是允许调用类通过为对话框类提供公共addActionListener(....)方法,将ActionListener添加到对话框的提交按钮。另一种方法是使用Swing的PropertyChangeSupport并让调用类向添加客户对话框添加一个PropertyChangeListener,从而通知其属性发生重大变化(即,提交按钮已更改,或者是新客户)已经被创造了)。如果您为程序使用MVC设计,则通知将从模型到视图。换句话说,对话框将创建新的Customer,提交按钮将使Control将Customer添加到Model中,并且主GUI的Model侦听器将被通知新创建的对象并将显示它。 / p>


      

    ...如何从第二个GUI中的文本字段传递所有客户的数据,并将它们传输到第一个GUI 中的JList,只有第一个&amp;姓氏正在显示

    您的JList应该是JList<Customer>,以便它包含完整 Customer对象的集合。您可以通过覆盖Customer toString()方法轻松更改JList显示其数据的方式(不建议使用此方法,因为此方法更多用于调试而不是最终用户显示),或者通过为JList分配自定义ListCellRenderer更好(推荐的)。 Swing JList tutorial将说明如何执行此操作,如果您在此步骤中遇到问题,则可以使用代码尝试返回此处。


      

    我还面临的第二个问题是如何打开另一个GUI,然后在选择该特定客户时反转该流程,以便对其详细信息进行更改。

    这将以与上述相同的方式解决,除了创建新客户并将其添加到JList显示的集合之外,您将使用已编辑的客户替换JList中的一个客户。

    有关更详细的帮助,请考虑创建和发布Minimal, Complete, and Verifiable Example Program。我们不希望看到您的整个程序,而是您应该将代码压缩到仍然编译的最小位,没有与您的问题无关的额外代码,但仍然可以证明您的问题。 / p>

答案 1 :(得分:0)

您可以在main(args [])中传递名字和姓氏或其他数据;

称你为Jframe,如你的Yourclassname.main(新字符串[] {&#34;名字&#34;,&#34;姓氏&#34;});

答案 2 :(得分:0)

让我们知道您希望如何在JList中设置数据。

每个项目应包含一个实体,或者每个项目包含一个实体属性。?

要很好地显示数据,你必须使用jtable。

关于你的两个jframe,一个包含输入的文本字段,另一个显示数据。 我想告诉你在joptionPane中使用jpanel,就像这段代码片段一样:

私人客户客户;

private void newCustomer() {

    JLabel labelCode = new JLabel("Customer Code *");
    JTextField jTextFieldCode = new JTextField();
    JLabel labelName = new JLabel("Customer Name *");
    JTextField jTextFieldName = new JTextField();
    JLabel labelPrincipalAdress = new JLabel("Principal Adress *");
    JTextField jTextFieldPrincipalAdress = new JTextField();
    JLabel labelSaleAdress = new JLabel("Sale Adress *");
    JTextField jTextFieldSaleAdress = new JTextField();
    JLabel labelActivity = new JLabel("Activity ");
    JTextField jTextFieldActivity = new JTextField();

    JLabel labelDiscountC = new JLabel("Discount Code *");

    JLabel labelCountryC = new JLabel("Country Code *");
    JComboBox<String> jComboBoxCountryC = new JComboBox<>(Locale.getISOCountries());
    jComboBoxCountryC.setSelectedIndex(-1);

    JPanel panel = new JPanel();

    panel.add(labelCode);
    panel.add(jTextFieldCode);
    panel.add(labelName);
    panel.add(jTextFieldName);
    panel.add(labelPrincipalAdress);
    panel.add(jTextFieldPrincipalAdress);
    panel.add(labelSaleAdress);
    panel.add(jTextFieldSaleAdress);
    panel.add(labelActivity);
    panel.add(jTextFieldActivity);

    panel.add(labelCountryC);
    panel.add(jComboBoxCountryC);
    panel.setLayout(new GridLayout(8, 2, 1, 3));

    for (Component c : panel.getComponents()) {
        c.setFont(new Font("", Font.PLAIN, 14));
        c.setPreferredSize(new Dimension(150, 25));
    }

    if (JOptionPane.showConfirmDialog(this, panel, "New Customer",
            JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE) == JOptionPane.OK_OPTION) {


            Customer newCustomer = new Customer();
            newCustomer.setCode(jTextFieldCode.getText());
            newCustomer.setName(jTextFieldName.getText());
            newCustomer.setPrincipalAdresse(labelPrincipalAdress.getText());
            newCustomer.setShippingAdresse(jTextFieldSaleAdress.getText());
            newCustomer.setActivity(jTextFieldActivity.getText());
             newCustomer.setCountry_code((String) jComboBoxCountryC.getSelectedItem());

            MainFrame.customerSBRemote.addCustomer(newCustomer);
            customersList.add(newCustomer);
            this.customer = newCustomer;
            jTableCustomer.changeSelection(customersList.indexOf(newCustomer), 0, false, false);
            this.hashcode = customer.hashCode();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, e.getMessage());
        }

    }

}