Я пытаюсь реализовать JTree для представления базы данных! Корень — это база данных, которая может иметь несколько отношений. Каждое отношение может иметь атрибуты и функциональные зависимости. Каждый узел (база данных, отношение, атрибут и fd) имеет свое контекстное меню. Первым шагом было реализовать всплывающее меню стандартным способом (сначала щелкнуть левой кнопкой мыши по узлу, затем щелкнуть правой кнопкой мыши, чтобы отобразить всплывающее меню).
Теперь я хочу изменить его на стандартное поведение файловых менеджеров. Щелчок правой кнопкой мыши выбирает узел и показывает правильное всплывающее меню.
В настоящее время я могу щелкнуть правой кнопкой мыши и открыть всплывающее меню, но оно неверно. Это меню предыдущего выбранного узла.
Вот пример изображения дерева:
Вот мой класс:
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));
Любые предложения, почему это не работает?