62,628
社区成员
发帖
与我相关
我的任务
分享
public class Test {
private int num = 0;
private JLabel label = new JLabel("test", JLabel.CENTER);
private MouseEvent curMove;
private boolean entered;
public Test() {
JFrame frame = new JFrame();
label.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
// 记录上一次的鼠标移动位置
curMove = e;
}
});
label.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
// 标记鼠标在 JLabel 控件内
entered = true;
}
@Override
public void mouseExited(MouseEvent e) {
// 标记鼠标移出了JLabel 控件
entered = false;
}
});
// 创建刷新 ToolTip 的线程
initTipThread();
JPanel testPane = new JPanel(new BorderLayout());
testPane.add(new JButton("NORTH"), BorderLayout.NORTH);
testPane.add(new JButton("SOUTH"), BorderLayout.SOUTH);
testPane.add(new JButton("WEST"), BorderLayout.WEST);
testPane.add(new JButton("EAST"), BorderLayout.EAST);
testPane.add(label, BorderLayout.CENTER);
frame.setContentPane(testPane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private void initTipThread() {
// 设置ToolTip的最小间隔刷新
ToolTipManager.sharedInstance().setInitialDelay(1);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
// 延时(此时间不可小于ToolTip的最小间隔刷新,否则无法正常刷新)
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
num++;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
label.setToolTipText("" + num);
if (entered) {
// 当前鼠标在控件内时,定时模拟一次 mouseMoved 事件
ToolTipManager.sharedInstance().mouseMoved(curMove);
}
}
});
}
}
}).start();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
}
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
public class Test {
private int num = 0;
private JLabel label = new JLabel("test");
private MouseEvent curMove;
private boolean entered;
public Test() {
JFrame frame = new JFrame();
label.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
// 记录上一次的鼠标移动位置
curMove = e;
}
});
label.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
// 标记鼠标在 JLabel 控件内
entered = true;
}
@Override
public void mouseExited(MouseEvent e) {
// 标记鼠标移出了JLabel 控件
entered = false;
}
});
// 创建刷新 ToolTip 的线程
initTipThread();
frame.setContentPane(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private void initTipThread() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
// 延时(此时间不可太短,否则无法正常刷新)
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
num++;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
label.setToolTipText("" + num);
if (entered) {
// 当前鼠标在控件内时,定时模拟一次 mouseMoved 事件
ToolTipManager.sharedInstance().mouseMoved(curMove);
}
}
});
}
}
}).start();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
}


这个参考不错,明天我试试。谢谢!
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
public class AFrame extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JLabel label;
private JTextField textField;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
AFrame frame = new AFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public AFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
MouseAdapter adapter = new MouseAdapter() {
private boolean bRun;
@Override
public void mouseEntered(MouseEvent e) {
// 鼠标进入启动线程,在线程中监视label的内容变化,然后显示在textField上
bRun = true;
textField.setVisible(true);
new Thread(new Runnable() {
@Override
public void run() {
while (bRun) {
String c = label.getText();
int w = textField.getGraphics().getFontMetrics().stringWidth(c);
int h = textField.getHeight();
// 根据label的内容设置textField的尺寸。这里我直接用死值让它显示稍微正常了一些,应该还是可以优化的
textField.setSize(w + 10, h);
textField.setText(c);
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
@Override
public void mouseMoved(MouseEvent e) {
// 在鼠标移动式,修改TextField的位置,使之追随鼠标
// 对TextField位置的控制也可以优化
textField.setLocation(label.getX() + e.getX() + 5, label.getY() + e.getY() + 15);
}
@Override
public void mouseExited(MouseEvent e) {
// 鼠标离开label,结束线程,隐藏textField
bRun = false;
textField.setVisible(false);
}
};
label = new JLabel("动态内容:");
label.addMouseListener(adapter);
label.addMouseMotionListener(adapter);
label.setBounds(81, 90, 72, 18);
contentPane.add(label);
textField = new JTextField();
textField.setEditable(false);
textField.setBounds(147, 138, 166, 24);
textField.setVisible(false);
contentPane.add(textField);
textField.setColumns(10);
new Thread(new Runnable() {
@Override
public void run() {
Random rnd = new Random();
int i;
while (true) {
i = rnd.nextInt(1000);
label.setText("随机整数:" + i);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}