我已经编写了一个程序,该程序在JScrollPane内部显示一个表。这样做的原因是,如果表过长,则用户应该能够使用滚动条。此外,我希望用户能够在右键单击上打开弹出菜单来编辑或删除数据。起初,我认为我的实现可以如以下图像所示工作:
后来我意识到,如果我使用scollbar,鼠标位置会出现问题,并且弹出窗口位于错误的位置,如下所示:
鼠标位于突出显示的条目上。
这是我的代码:
table.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()){
rightClickPopUpOnTable(tablePanel.getComponentAt(e.getX(), e.getY()), e.getX(), e.getY());
//rightClickPopUpOnTable(tablePanel.getComponentAt(e.getXOnScreen(), e.getYOnScreen()), e.getXOnScreen(), e.getYOnScreen());
}
}
@Override
public void mouseReleased(MouseEvent e) {
int r = table.rowAtPoint(e.getPoint());
if (r >= 0 && r < table.getRowCount()) {
table.setRowSelectionInterval(r, r);
} else {
table.clearSelection();
}
if (e.isPopupTrigger()){
rightClickPopUpOnTable(tablePanel.getComponentAt(e.getX(), e.getY()), e.getX(), e.getY());
//rightClickPopUpOnTable(tablePanel.getComponentAt(e.getXOnScreen(), e.getYOnScreen()), e.getXOnScreen(), e.getYOnScreen());
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
public void rightClickPopUpOnTable(Component component, int x, int y){
JPopupMenu pop = new JPopupMenu();
pop.setVisible(true);
pop.setFocusable(false);
JMenuItem item = new JMenuItem("Edit");
item.addActionListener(new ActionListener() {
@java.lang.Override
public void actionPerformed(ActionEvent e) {
handler.getData().showData(table.getValueAt(table.getSelectedRow(),0).toString());
}
});
JMenuItem item2 = new JMenuItem("Delete");
item2.addActionListener(new ActionListener() {
@java.lang.Override
public void actionPerformed(ActionEvent e) {
int dialogResult = JOptionPane.showConfirmDialog (null, "Are you sure you want to delete "+table.getValueAt(table.getSelectedRow(), 0).toString()+"?","Delete Confirmation",JOptionPane.YES_NO_OPTION);
if(dialogResult == JOptionPane.YES_OPTION){
//DO STUFF
}
}
});
pop.add(item);
pop.add(item2);
pop.show(component, x, y);
}
我找到了一种通过使用e.getXOnScreen()来部分“修复”问题的方法,如您在代码中所看到的。现在,弹出窗口显示在正确的位置,但是它将不再突出显示项目,也不会关闭,如下所示:
如果有人知道解决方案,我会很好。