我在界面中有一系列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来说有点不方便!
答案 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。