- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试实现一个 JTree 来表示一个数据库!Root 是数据库,它可以有多个关系。每个关系都可以有属性和函数依赖。每个节点(数据库、关系、属性和 fd)都有不同的右键菜单。第一步是以标准方式实现弹出菜单(首先左键单击一个节点,然后右键单击以显示弹出菜单)。
现在我想将其更改为文件浏览器的标准行为。右键单击选择节点并显示正确的弹出菜单。
目前我可以右击并显示弹出菜单,但菜单不正确。是上一个选中节点的菜单。
这是树的示例图片:
这是我的类(class):
public class ShowPopupMouseListener extends MouseAdapter {
// Refernece: http://goo.gl/plojB
private JTree tree;
private JPopupMenu dbPopUpMenu;
private JPopupMenu relPopUpMenu;
private JPopupMenu attrPopUpMenu;
private JPopupMenu fdPopUpMenu;
private AttrPopupFactory attrPopupFactory;
public ShowPopupMouseListener(JTree jTree) {
this.tree = jTree;
DbPopupFactory dbPopupFactory = new DbPopupFactory(tree);
dbPopUpMenu = dbPopupFactory.getDbPopupMenu();
RelPopupFactory relPopupFactory = new RelPopupFactory(tree);
relPopUpMenu = relPopupFactory.getRelPopupMenu();
attrPopupFactory = new AttrPopupFactory(tree);
attrPopUpMenu = attrPopupFactory.getAttrPopupMenu();
FdPopupFactory fdPopupFactory = new FdPopupFactory(tree);
fdPopUpMenu = fdPopupFactory.getFdPopupMenu();
}
public void mousePressed(MouseEvent e) {
showMenuIfPopupTrigger(e);
}
public void mouseClicked(MouseEvent e) {
showMenuIfPopupTrigger(e);
}
public void mouseReleased(MouseEvent e) {
showMenuIfPopupTrigger(e);
}
private void showMenuIfPopupTrigger(final MouseEvent e) {
if (e.isPopupTrigger()) {
setSelectedItemsOnPopupTrigger(e);
if (tree.getLastSelectedPathComponent() instanceof DatabaseNode) {
addRightClickPopUpMenu(tree, dbPopUpMenu);
} else if (tree.getLastSelectedPathComponent() instanceof RelationNode) {
addRightClickPopUpMenu(tree, relPopUpMenu);
} else if (tree.getLastSelectedPathComponent() instanceof AttributeNode) {
attrPopupFactory.updateKeyCheckboxes();
addRightClickPopUpMenu(tree, attrPopUpMenu);
} else if (tree.getLastSelectedPathComponent() instanceof FunctionalDependencyNode) {
addRightClickPopUpMenu(tree, fdPopUpMenu);
}
}
}
private void addRightClickPopUpMenu(Component component,
final JPopupMenu popUpMenu) {
component.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) {
showPopUpMenu(e);
}
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
showPopUpMenu(e);
}
}
private void showPopUpMenu(MouseEvent e) {
popUpMenu.show(e.getComponent(), e.getX(), e.getY());
}
});
}
private void setSelectedItemsOnPopupTrigger(MouseEvent e) {
TreePath p = tree.getPathForLocation(e.getX(), e.getY());
if (!tree.getSelectionModel().isPathSelected(p)) {
tree.getSelectionModel().setSelectionPath(p);
}
}
}
在我的树中,我按以下方式初始化它:
UIManager.put("PopupMenu.consumeEventOnClose", Boolean.FALSE);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
tree.addMouseListener(new ShowPopupMouseListener(tree));
为什么这不起作用有什么建议吗?
最佳答案
你应该尽量保持简单,以下是你真正需要的:
class RightMouseListener implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
int row = tree.getClosestRowForLocation(e.getX(), e.getY());
tree.setSelectionRow(row);
popupMenu.show(e.getComponent(), e.getX(), e.getY());
}
}
...
//other overrides
...
};
这是实现您要求的功能所需的最低限度,显然您可以根据需要添加更多自定义功能。
关于java - JTree 的右键单击行为就像在任何文件浏览器中一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10513136/
我有点困惑。在 : http://delphi.about.com/od/objectpascalide/l/blvkc.htm 它说“Space”的正确键是#20。试过了,但行不通。但是,将其替换为
我有一个 input 的 type="submit" 并且我希望当我点击(右键或左键点击)它时这个元素周围没有蓝色边框。 我在下面的chrome浏览器中添加了OK模式和not OK模式的图片: OK模
我想在右键单击选项卡标题时显示上下文菜单条。 但是,我没有找到检测选项卡标题点击的方法。 有人知道如何做到这一点吗? 最佳答案 Private Sub tab1_MouseClick(sender A
我对编程还很陌生,正在尝试制作扫雷 GUI。游戏完美地右键单击 JToggleButton,在按钮上显示了一个代表炸弹的“B”,但是当我在鼠标监听器中用 setIcon() 替换 setText()
我正在尝试将一个按钮 float 到卡片的右侧。我希望它出现在右下角。 当我正确使用 float 时。它出现在父 div 之外,有没有办法正确定位它?
我正在使用 Struts2 标签和下面的代码使用 JS 计算并检查/验证在文本字段中输入的值。 它还会更新在 textfield 中输入的总数列表,这些由 onblur 处理和 onkeydown事件
我是一名优秀的程序员,十分优秀!