我想在使用Java Swing将鼠标悬停在JTable单元上时显示一个信息框,因此有多个部分
- 如何在表格单元格中捕获鼠标悬停事件?我必须能够设置单元格内容,然后获取数据。
- 如何在将鼠标悬停在该单元格上时显示带有动态服务器数据的面板/框?
- 如何缓存信息面板/框,这样我就不必在每次鼠标悬停时查询服务器?
例子:
在表格单元格中,我输入:94903。 Tab 键或输入后,单元格设置为数字。鼠标悬停时,它会显示一个包含姓名、地址、电话号码、电子邮件等的框。
谢谢!
我想在使用Java Swing将鼠标悬停在JTable单元上时显示一个信息框,因此有多个部分
例子:
在表格单元格中,我输入:94903。 Tab 键或输入后,单元格设置为数字。鼠标悬停时,它会显示一个包含姓名、地址、电话号码、电子邮件等的框。
谢谢!
您可以使用 HTML 格式化工具提示文本,这将允许您向工具提示提供复杂的信息结构,而无需或花费编写自己的解决方案。唯一的问题是工具提示将被自动丢弃。
如果这仍然不适合,您可以尝试:
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.*;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.Timer;
public class TestTable {
private Timer showTimer;
private Timer disposeTimer;
private JTable table;
private Point hintCell;
private MyPopup popup; // Inherites from JPopupMenu
public TestTable() {
showTimer = new Timer(1500, new ShowPopupActionHandler());
showTimer.setRepeats(false);
showTimer.setCoalesce(true);
disposeTimer = new Timer(5000, new DisposePopupActionHandler());
disposeTimer.setRepeats(false);
disposeTimer.setCoalesce(true);
table.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
Point p = e.getPoint();
int row = table.rowAtPoint(p);
int col = table.columnAtPoint(p);
if ((row > -1 && row < table.getRowCount()) && (col > -1 && col < table.getColumnCount())) {
if (hintCell == null || (hintCell.x != col || hintCell.y != row)) {
hintCell = new Point(col, row);
Object value = table.getValueAt(row, col);
// Depending on how the data is stored, you may need to load more data
// here...
// You will probably want to maintain a reference to the object hint data
showTimer.restart();
}
}
}
});
}
protected MyPopup getHintPopup() {
if (popup == null) {
// Construct the popup...
}
return popup;
}
public class ShowPopupActionHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (hintCell != null) {
disposeTimer.stop(); // don't want it going off while we're setting up
MyPopup popup = getHintPopup();
popup.setVisible(false);
// You might want to check that the object hint data is update and valid...
Rectangle bounds = table.getCellRect(hintCell.y, hintCell.x, true);
int x = bounds.x;
int y = bounds.y + bounds.height;
popup.show(table, x, y);
disposeTimer.start();
}
}
}
public class DisposePopupActionHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
MyPopup popup = getHintPopup();
popup.setVisible(false);
}
}
}
Now, I've not constructed the popup, I'd use the popup menu from Bob Sinclar's answer as well
这是让鼠标悬停工作的好方法,我会先这样做,然后在您悬停时输出一些文本进行检查。
关于缓存,我可能会将最后 10 个值存储在内存中,并在每次 ping 新入口点时从服务器发出请求,即您在本地没有它。然后可能每分钟更新最后 10 个命中,以防他们的信息发生变化。