更新JComponent以反映对象更改

时间:2014-08-19 12:09:21

标签: java swing jcomponent

我在界面中有一系列JLabel,用于显示对象的属性。如果所述对象被同一个类中的另一个替换,是否可以自动更新JComponents?这种方法会被视为不良做法吗?例如,请考虑以下事项:

String stringToBeDisplayed = new String("String 1");
JLabel label = new JLabel(stringToBeDisplayed);
stringToBeDisplayed = new String("String 2");
//*Refresh label to show string change*

我知道可以使用JLabel.setText()设置JLabel的文本,或者可以替换标签,但我很懒,这些方法对于许多JComponents来说有点不方便!

3 个答案:

答案 0 :(得分:1)

您尝试执行的操作甚至无法正常工作,因为重新初始化stringToBeDisplayed不会影响您传递给它的任何内容 - 在本例中为JLabel()构造函数。

执行您想要的操作的方式 来调用JLabel.setText()。如果你有很多组件,你必须拨打很多电话。您可以将其中一些包装起来,这样您就可以调用其中一种方法来批量更新其中的许多方法,但这是您必须这样做的方式。您也可以通过将JLabel放入Collection或数组并使用循环来减少输入。

虽然理论上,但您可以子类化或复合JLabel并添加一个接受一些String的方法 - 包装对象,您必须为其编写类,然后您可以让该类接受更改侦听器(Observer模式),并在更改时更新JLabel

答案 1 :(得分:1)

很抱歉,但是你犯了一个基本的java错误。字符串在java中是不可变的。您已经传递了String对象" String 1"到JLabel。 JLabel没有指针'到stringToBeDisplayed,所以将另一个String对象分配给变量stringToBeDisplayed将不起作用。

答案 2 :(得分:1)

不,你不能这样做。

想象一个变量作为一个盒子。 “stringToBeDisplayed”框包含字符串。 setText()接受框并将内容倒入另一个框 - 标签内的文本 - 由于它是一个计算机科学框,“stringToBeDisplayed”仍然被填充(隐喻从未一直工作)。

现在,您在“stringToBeDisplayed”框中添加了一些新内容。另一个盒子应该怎么知道呢?

您可能需要查看Observer Pattern或Model-View-Control。