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

时间:2017-11-09 12:03:53

标签: java swing user-interface

我有一个小组,我们称之为detailsPanel,其中包含Person引用,并按以下方式显示其字段值:

Name:       person.getName ();
Surname:    person.getSurname ();
Emain:      person.getEmail ();
....        .......
....        .......

等等。我将使用JLabels(使用GridBagLayout正确对齐)来显示每个fieldNamefieldValue)。我有很多要显示的字段。

问题在于显示细节的面板必须始终可见,即它不会以模态JDialog显示,因此我可以通过简单地读取Person对象来创建面板小组创建的字段。

面板必须始终可见,当用户选择Person列表中的其他行时,其Person引用将会更改。这意味着我将调用一种方法来更新其状态,例如:

detailsPanel.setPerson (aPerson);

现在,我想知道我应该如何更新所有字段。我应该保留对显示值的所有JLabels的引用,并在更新面板时对每个setText(value)使用getText(),或者更好地覆盖每个Person方法label,返回正确的字段值,以便在update方法中我只重新绘制面板,当getter方法用于另一个#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> int main() { int status; // To get return status of file // No need of FILE pointer int mypipe[2]; // No need to make it global pid_t pid = 0; int num = 0, temp; pipe(mypipe); // Create pipe if((pid = fork()) == 0) // Child block { close(mypipe[1]); // Child will close the writing end while (1) { read(mypipe[0],&temp,sizeof(int)); printf("from child: %d\n",temp); } exit(0); // Exit the child } else // Parent block { close(mypipe[0]); // Parent will close the reading end of pipe while (1) { scanf("%d", &num); write(mypipe[1],&num,sizeof(int)); } } // Parent should wait for child wait(&status); return 0; } 对象时,文本会自动更改?

任何建议都表示赞赏!

1 个答案:

答案 0 :(得分:1)

由于这是UI的东西,通常被称为几乎从不(相对于在其他计算中调用事物的频率),您根本不需要担心效率。只要做你认为最优雅的解决方案。很快就会有三种选择。它们从快速和静态到优雅和可重复使用的订购:

  1. 快速而又脏:创建构造函数并使一切看起来都很好。然后将所有内容从构造函数移动到单独的init()方法,每次实体更改时,您只需再次调用removeAll();然后再调用init()

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

  3. 根据您的建议,构建自己的JLabel扩展程序。这个新类应该有一个update()方法,当事情发生变化时要调用它,或者让它设置自己的监听器以确保它得到任何相关变化的通知。

    如果您计划创建一个应该显示所有类型对象的单个面板,您可以让这些对象实现一个名为Displayable的接口,该接口为您提供对其所有值的通用访问,甚至可以使用每个值。 Displayable接口的替代方法是使用反射和使用注释来允许面板获取其值以供显示。

  4. 请注意,最优雅的解决方案是 - 与某些人可能会告诉您的相反 - 并非总是最适合任何情况。您希望将来有多少维护?申请有多大?你会把代码交给别人吗?所有这些以及更多需要考虑来决定你想要解决方案的“好”。