JLabel明文

时间:2017-06-07 17:10:52

标签: java swing

我正在编写一个ping服务器并返回值的程序。

我一直在尝试将ping重叠到JFrame,其中JLabel在透明窗口中显示ping。

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

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

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以删除以前的数据?

1 个答案:

答案 0 :(得分:2)

每次调用 DrawOverlay ,您都会创建 JLabel:

CoreML

设置属性后,您调用JLabel lbl_ping = new JLabel(ping); ,将 JLabel添加到您的JFrame。

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

您要做的是将frame.add(lbl_ping);声明为您班级中的私人成员,然后在创建JFrame时,您还要初始化JLabel并设置所有这些属性:

JLabel lbl_ping;

看看this。它解释了pack()的作用。

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

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);