3

在我目前正在进行的项目中,我有几条信息希望通过 Jlabel 显示出来。在 GUI 的其他地方有一些按钮和文本字段允许更改我想更新 JLabel 的所述信息,但文本永远不会改变,或者在启动时更新。

正如本网站上其他问题中所建议的那样,我尝试使用并发来更新标签,但我对标签更新没有运气。并发确实可以根据需要更新文本字段和组合框。

我的代码的当前迭代如下所示,

JFrame

//// This is a snippet from the JFrame

public void start()
{
    this.setSize(900, 700);
    this.setVisible(true);

    devicePanel.populateDeviceDefinitions();
    updateServiceInfo();
    updateCommandInfo();
    startUpdateTimer();
}

public void updateServiceInfo()
{
    EventService service = JetstreamApp.getService();

    generalPanel.updateServiceInfo(service.getBaseUri(), 
            service.getAccessKey(), String.valueOf(service.getWindowTime()));
}

public void updateCommandInfo()
{
    JetstreamServiceClient client = JetstreamApp.getClient();

    generalPanel.updateCommandInfo(client.getBaseUri(), client.getAccessKey());
}

JPanel 命名为 generalPanel

//// This is a snippet from the generalPanel
//// All of the variables in the following code are JLabels

public void updateServiceInfo(String baseUrl, String accessKey,
        String windowTime)
{
    serviceUrl.setText(baseUrl);
    serviceAccessKey.setText(accessKey);
    serviceWindowTime.setText(windowTime);
}

public void updateCommandInfo(String baseUrl, String accessKey)
{
    commandUrl.setText(baseUrl);
    commandAccessKey.setText(accessKey);
}

标签以其文本的空字符串开头,并且在窗口启动时,旨在通过从相关来源获取信息来更新它们。我能否了解一下为什么 JLabels 从不更新和显示他们的信息?

4

3 回答 3

6

您是如何创建 JLabel 的?如果文本以 "" 开头,并且您使用 new JLabel("") 创建了它,则 JLabel 的宽度可能会初始化为 0,然后在您更新它时不会显示任何文本。我相信我过去曾遇到过这样的问题。作为测试,尝试使用 new JLabel("aaaaaaaaaa") 或更长的字符串来创建标签,然后 setText(""); 然后稍后,当您 setText(somethingElse) 时,查看是否会导致文本显示。如果是这样,那么宽度可能是问题所在,您可以从那里开始处理它。– ajb 19 分钟前

此评论是实际答案,当使用 WindowBuilderPro 创建一个带有空字符串作为文本的 JLabel 时,标签的尺寸没有正确设置。我的标签确实存在,并且正在使用我的问题中提供的代码进行更新,但标签不可见。

从包含文本的标签开始,然后将文本设置为空字符串可以正常工作。

于 2013-07-10T19:09:55.123 回答
6

方法paintImmediately() 可用于使Swing 组件立即更新。在 setText() 之后,您应该像下面那样调用paintImmediately()。

jLabel.setText("new text")
jLabel.paintImmediately(jLabel.getVisibleRect());
于 2018-05-06T00:51:38.170 回答
1

您应该尝试在包含您的 JLabels 的组件上调用 revalidate() 或 repaint()。

干杯

于 2013-07-10T18:47:25.487 回答