Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更新显示对象详细信息的面板_Java_Swing_User Interface - Fatal编程技术网

Java 如何更新显示对象详细信息的面板

Java 如何更新显示对象详细信息的面板,java,swing,user-interface,Java,Swing,User Interface,我有一个面板,我们称之为detailsPanel,它包含一个Person引用,并以以下方式显示其字段值: Name: person.getName (); Surname: person.getSurname (); Emain: person.getEmail (); .... ....... .... ....... 等等。我将使用JLabels(使用GridBagLayout正确对齐)来显示每个(fieldName,fieldVal

我有一个面板,我们称之为
detailsPanel
,它包含一个
Person
引用,并以以下方式显示其字段值:

Name:       person.getName ();
Surname:    person.getSurname ();
Emain:      person.getEmail ();
....        .......
....        .......
等等。我将使用
JLabels
(使用
GridBagLayout
正确对齐)来显示每个(
fieldName
fieldValue
)。我有很多字段要显示

问题是,显示详细信息的面板必须始终可见,即它不会显示在模式
JDialog
中,因此我可以通过在面板创建时读取我的
Person
对象字段来创建面板

面板必须始终可见,当用户在
Person
列表中选择不同的行时,其
Person
引用将发生变化。这意味着我将调用一个方法来更新其状态,类似于:

detailsPanel.setPerson (aPerson);
现在,我想知道如何更新所有字段。我是否应该保留对所有显示值的
jlabel
的引用,并在更新面板时在每个标签上使用
setText(value)
,还是最好覆盖每个标签的
getText()
方法,返回正确的字段值,以便在更新方法中我只重新绘制面板,当getter方法用于不同的
Person
对象时,文本会自动更改吗


任何建议都将不胜感激

因为这是通常从不调用的UI内容(相对于在其他计算中调用的频率),所以您根本不需要担心效率。只要做你认为最优雅的解决方案。我很快想到了三个选择。从快速、静态到优雅、可重复使用:

  • 快速和肮脏:创建你的构造函数,让一切看起来都很好。然后将所有内容从构造函数移动到一个单独的
    init()
    方法,每次实体更改时,只需调用
    removeAll()init()

  • 按照您的建议,保留对所有标签的引用,并使用
    setPerson()
    方法更新所有面板。然后在构造函数中调用此方法(这可能是最常见的解决方案)

  • 按照您的建议,构建自己的
    JLabel
    扩展。这个新类应该有一个
    update()
    方法,当事情发生变化时调用该方法,或者让它设置自己的侦听器,以确保收到任何相关变化的通知

    如果您计划创建一个面板来显示所有类型的对象,您可以让这些对象实现一个名为
    displaybable
    的接口,该接口为您提供对其所有值的通用访问,甚至可能是对每个值的侦听器。
    可显示
    界面的另一种选择是使用反射和注释,以允许面板获取其显示值


  • 请注意,与一些人可能告诉你的相反,最优雅的解决方案并不总是最适合任何情况。您预计未来会进行多少维护?应用程序有多大?你会把代码交给别人吗?所有这些以及更多需要考虑,以决定您希望您的解决方案有多“好”。

    感谢您的详细回答,可能对于我当前的需求,解决方案2已经足够了,但您指出了一些非常有趣的细节!