【问题标题】:How can I pass data from text-fields in 1 JFrame Form to a JList in another JFrame Form?如何将数据从 1 个 JFrame 表单中的文本字段传递到另一个 JFrame 表单中的 JList?
【发布时间】:2015-02-14 06:13:31
【问题描述】:

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

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

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

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

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

我已经尝试在第二个 GUI 中按下 btnAdd 时使用 getFullName 方法,如下所示:

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

可惜我没有运气。

【问题讨论】:

  • The Use of Multiple JFrames, Good/Bad Practice? 这个问题可能很容易使用模态JDialog 解决。顺便说一句,同样的问题一天会出现好几次。
  • 这不能回答我的要求。这只是告诉我多个 JFrame 是好还是坏的做法。我不关心这些信息,我更关心手头的问题,因为 JDialog 可以轻松切换到。
  • “这不能回答我的要求。” 你很有洞察力。这就是我将其设为评论而不是答案的原因。
  • 然而,该评论与手头的问题毫无关系。如果不打算帮忙。那你发表评论的真正目的是什么?
  • 马克,请理解@Andrew 的评论是为了帮助你,也许不是在短期内,因为你是正确的 - 它不能回答你的直接问题,但从长远来看肯定是因为您的整体程序设计(一个具有多个 JFrame)并不好。所以请随意忽略他或我的评论,但请不要批评它,除非它直接侮辱你个人,事实并非如此。随着时间的推移,您可能会看到链接中的信息的好处。

标签: java swing user-interface jtextfield jlist


【解决方案1】:

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

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

要很好地显示数据,您必须改用 jtable。

关于您的两个 jframe,一个包含用于输入的文本字段,另一个显示数据。 我想建议您在 joptionPane 中使用 jpanel,例如以下代码 sn-p :

私人客户客户;

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());
        }

    }

}

【讨论】:

    【解决方案2】:

    关于您的问题:

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

    这种情况通常有两个问题——

    1. 如何将添加新客户对话窗口(是的,这应该是某种形式的对话窗口,JDialog 或 JOptionPane)字段保存的信息获取到父窗口对象中,以及
    2. 如何准确地通知何时应该进行这种信息传输,这通常是两者中比较成问题的一个。

    第一个问题通常很容易解决,因为它只不过是如何在两个类之间传递信息的更一般问题的特定版本。最简单的解决方法是让父窗口类调用对话框窗口类中的getter方法来提取其状态。例如,对话框窗口可以有每个 JTextField 中保存的数据的公共 getter 方法,调用父窗口可以调用该方法,或者对话框类可以有一个 getCustomer() 方法,在该方法中它收集由其输入字段保存的所有信息,创建一个 Customer 对象,然后返回该对象。

    也许更好、更健壮的数据传输方式是将程序构建为模型-视图-控制或 MVC 类型的程序,让您的添加新客户对话窗口在按下提交按钮时更新模型,并让模型通知父主窗口其数据已更改,因此它知道必须更新其数据视图。这对你的程序来说可能有点过头了,所以我不会在此时推荐这个建议,但是在将来,当你创建更大更复杂的程序时,这确实是你想要的这样做是因为它更容易让你的程序的类具有高内聚性(处理相同事物的代码靠得很近)和低耦合(处理不同事物的代码没有紧密绑定,从而降低了代码复杂性),使得它更容易调试和改进您的程序。

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

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


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

    您的 JList 应该是 JList&lt;Customer&gt;,以便它包含 完整 Customer 对象的集合。您可以通过重写 Customer toString() 方法轻松更改 JList 显示其数据的方式(不推荐,因为此方法更多用于调试而不是最终用户显示),或者通过为 JList 分配自定义 ListCellRenderer(推荐)更好。 Swing JList tutorial 将解释如何执行此操作,如果您卡在此步骤,可以返回此处尝试代码。


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

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

    如需更详细的帮助,请考虑创建并发布Minimal, Complete, and Verifiable Example Program。我们不想看到你的整个程序,而是你应该将你的代码压缩成仍然可以编译的最小部分,没有与你的问题无关的额外代码,但仍然可以演示你的问题。

    【讨论】:

      【解决方案3】:

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

      这样称呼你 Jframe Yourclassname.main(new string[]{"firstname","lastname"});

      【讨论】:

      • 唯一能实现的就是在已有另一个 GUI 窗口时将 GUI 窗口更改为前一个 GUI 窗口,这样它就变成了 2 个主 GUI 窗口..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 2018-10-02
      • 2020-04-14
      • 1970-01-01
      • 2013-09-29
      相关资源
      最近更新 更多