Bir veritabanını temsil etmek için bir JTree uygulamaya çalışıyorum! Kök, çeşitli ilişkilere sahip olabilen veritabanıdır. Her ilişki özniteliklere ve işlevsel bağımlılıklara sahip olabilir. Her düğümün (veritabanı, ilişki, öznitelik ve fd) farklı bir sağ tıklatma menüsü vardır. İlk adım, açılan menü standart yolla (bir düğüme ilk leftclick, daha sonra popupmenu göstermek için rightclick) uygulamak oldu.Herhangi bir Filebrowser gibi JTree rightclick davranışı
Şimdi bunu dosya kaşiflerinin standart davranışına değiştirmek istiyorum. Bir rightclick düğümü seçer ve doğru popupmenu'yu gösterir.
Şu anda bir popupmenu öğesini tıklatıp gösterebiliyorum ama menü yanlış. Seçilen önceki düğümün menüsü.
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);
}
}
}
Ve ağacında
bunu başlatmak aşağıdaki yolu: Bu benim sınıftır:
UIManager.put("PopupMenu.consumeEventOnClose", Boolean.FALSE);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
tree.addMouseListener(new ShowPopupMouseListener(tree));
İşte
bir ağacın Examplepicture olduğunu
Bunun neden çalışmadığı konusunda herhangi bir öneriniz var mı?
Olası kopya [Java JTree için sağ tıklama bağlam menüsü] (http://stackoverflow.com/questions/517704/right-click-context-menu-for-java-jtree) – trashgod