java - 如何将数据从1个JFrame形式的文本字段传递到另一个JFrame形式的JList?

标签 java swing user-interface jtextfield jlist

在一个允许客户在1个GUI上注册其信息的GUI(单击按钮以添加新客户)上进行操作,从而在单击“添加”按钮以注册其信息之后,它将收集其所有数据(姓,名,地址第1 / 2,城市和邮政编码),然后将其上载到上一个GUI的JList中,其中显示客户的名字和姓氏。然后,用户可以从中选择该特定客户,然后单击以在新的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;
}


但是a,我没有运气。

最佳答案

关于您的问题:


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


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


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


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

传输数据的一种更好,更健壮的方法可能是将程序构造为Model-View-Control或MVC类型的程序,让添加新的客户对话框窗口在按下其提交按钮时更新模型,并让其父主由模型通知窗口其数据已更改,因此它知道必须更新其数据视图。这可能对您的程序来说是过高的,所以我现在不打算提出此建议,但是在将来,当您创建更大,更复杂的程序时,这确实是您想要做的,因为它会轻松地使程序的类具有高内聚性(处理相同事物的代码紧密结合在一起)和低耦合(处理不同事物的代码没有紧密结合在一起,从而降低了代码复杂性),从而使调试和改善您的代码变得更加容易程序。

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

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




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


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




我还面临的第二个问题是如何打开另一个GUI,当选择了该特定客户时,它将逆转该过程,以便可以更改其详细信息。


这将以与上述基本相同的方式解决,除了要创建一个新的Customer并将其添加到JList显示的集合中,您可以将JList中的一个Customer替换为已编辑的Customer。

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

关于java - 如何将数据从1个JFrame形式的文本字段传递到另一个JFrame形式的JList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27496079/

相关文章:

java - JTable 工具提示显示位置问题

java - 是否有任何其他可能的原因导致 GWT 序列化策略异常?

java - JPA 可嵌入物集合

java - 压缩 zip 存档

java - 如何将复选框添加到 JTree 节点以管理多选?

java - 代码在 ide 上工作,但在从 .jar 运行时不工作

multithreading - 继续 OS X - 两个库调用系统函数

java - 嵌入/嵌套自定义 JSP 标记以设置另一个 HTML 标记的属性值

java - 如何修复 JFrame 程序的布局

java - 餐巾的外观和感觉