3 回答
TA贡献1860条经验 获得超9个赞
这是一个有趣的问题,因为它突出显示了JComponent上缺少的api :-)
众所周知,建议注册popupMenus的方法是使用componentPopupMenu属性。相关的API是
void setComponentPopupMenu(JPopupMenu);
JPopupMenu getComponentPopupMenu();
Point getPopupLocation(MouseEvent);
缺少什么(此要求实际需要)是
JPopupMenu getComponentPopupMenu(MouseEvent);
这种缺失更加令人烦恼,因为在 getComponentPopup()之后调用了getPopupLocation(由LAF中的AWTEventHelper调用)。因此,像存储上次可能触发了弹出窗口的鼠标事件然后决定返回哪个弹出窗口一样,黑客没有任何余地。并且返回该位置的null只会导致在鼠标位置显示它
唯一的(肮脏的)黑客(我完全不愿被MouseListener弄脏;-)是重写getComponentPopup并根据当前的鼠标位置决定是否返回它。
table = new JTable(model) {
/**
* @inherited <p>
*/
@Override
public JPopupMenu getComponentPopupMenu() {
Point p = getMousePosition();
// mouse over table and valid row
if (p != null && rowAtPoint(p) >= 0) {
// condition for showing popup triggered by mouse
if (isRowSelected(rowAtPoint(p))) {
return super.getComponentPopupMenu();
} else {
return null;
}
}
return super.getComponentPopupMenu();
}
};
副作用是只要鼠标在桌子上方的任何地方,弹出显示就不会由键盘触发,这可能是有问题的。
TA贡献2039条经验 获得超7个赞
您可以设置可见行的最小数量,JTable
以使其适合您想要的表单布局。但是,有时实际的表格内容小于此最小值,然后表格下方的JScrollPane
边界内会出现一个空白区域。此空白空间不属于,JTable
但是您可能需要它才能显示弹出窗口(例如,带有“创建新行...”项的弹出窗口)。请注意,我已经提到了我不记得是否Mouselistener
必须将其添加到JScrollPane
或中JViewport
,但是除了JTable
自身之外,我还需要将其添加到其他位置。
添加回答
举报