首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JLabel明文

JLabel明文
EN

Stack Overflow用户
提问于 2017-06-07 17:10:51
回答 1查看 2.7K关注 0票数 1

我正在编写一个程序,该程序调用一个服务器并返回一个值。

我一直试图将ping覆盖到JFrame,其中JLabel在透明窗口中显示ping。

但是,每次我调用方法DrawOverlay()时,JLabel都会简单地在以前绘制的标签之上重新绘制。

对于上下文,DrawOverlay()是从另一个类PingTest调用的。

代码语言:javascript
复制
void DrawOverlay(String ping)
{
    JLabel lbl_ping = new JLabel(ping);
    lbl_ping.removeAll();//attempts at clearing the previously drawn label
    lbl_ping.revalidate();
    lbl_ping.repaint();

    if (!frame.isUndecorated())
    {
        frame.setUndecorated(true);
    }

    frame.setFocusableWindowState(false);
    frame.setBackground(new Color(0, 0, 0, 0));
    frame.setAlwaysOnTop(true);
    frame.getRootPane().putClientProperty("apple.awt.draggableWindowBackground", false);
    frame.getContentPane().setLayout(new java.awt.BorderLayout());
    lbl_ping.setFont(new Font("serif", Font.PLAIN, 48));
    lbl_ping.setForeground(Color.WHITE);
    lbl_ping.setText(ping);
    frame.add(lbl_ping);
    frame.setVisible(true);
    frame.pack();
}

是否有任何方法重新绘制JFrame或JLabel以删除以前的数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-07 18:57:51

每次调用DrawOverlay时,都会创建一个新的 JLabel:

代码语言:javascript
复制
JLabel lbl_ping = new JLabel(ping);

在设置属性之后,您将调用frame.add(lbl_ping);,它将您的、新的 JLabel添加到JFrame中。

您的JLabel不会被覆盖或删除。

您要做的是声明JLabel lbl_ping;为类中的私有成员,然后在创建JFrame时也要初始化JLabel并设置所有这些属性:

代码语言:javascript
复制
lbl_ping = new JLabel();

frame.setFocusableWindowState(false);
frame.setBackground(new Color(0, 0, 0, 0));
frame.setAlwaysOnTop(true);
frame.getRootPane().putClientProperty("apple.awt.draggableWindowBackground", false);
frame.getContentPane().setLayout(new java.awt.BorderLayout());
lbl_ping.setFont(new Font("serif", Font.PLAIN, 48));
lbl_ping.setForeground(Color.WHITE);
lbl_ping.setText(ping);
frame.add(lbl_ping);

// pack() first then setVisible()
frame.pack();
frame.setVisible(true);

看看this。它解释了pack()的功能。

然后,在DrawOverlay中,您只需设置文本值并更新JFrame:

代码语言:javascript
复制
void DrawOverlay(String ping)
{
    lbl_ping.setText(ping);
    frame.getContentPane().validate(); // You modified child component lbl_ping (changed its size by setting a new text) so you need to recalculate all the child components
    frame.getContentPane().repaint(); // Redraws the content pane and all of its children
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44418897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档