Auswählen des JTree -Knotens im PopupJava

Java-Forum
Anonymous
 Auswählen des JTree -Knotens im Popup

Post by Anonymous »

Hier ist eine Aufgabe. Wir benötigen ein benutzerdefiniertes Popup -Menü für unsere Erweiterung von JTree . Der rechte Klick sollte nicht nur das Popup, sondern auch die Auswahl des geeigneten Knotens des Baumes auslösen. Der Analyst war explizit: Wenn Sie auf einen Knoten klicken und dann mit der rechten Maustaste klicken, um ein Popup auszulösen, sollte dies alles auf einem einzigen Klicken auftreten. Viele unserer Komponenten haben eine komplexe Komponentenzusammensetzung, und manchmal müssen wir sicherstellen, dass ein Komponenten -Popup -Auslöser der Komponenten an seine übergeordnete Komponente delegiert. Während es möglich ist, wenn inheritSpopupMenu auf true eingestellt ist, respektieren das Popup diese Eigenschaft nicht. Aus diesem Grund kann ich auch keinen Baumknoten im javax.swing.event.popupMenulistener#popupMenuwillbecomevisible Methode auswählen. Es ist sinnvoll, wenn Sie darüber nachdenken, da Popups auf verschiedene Weise ausgelöst werden können, betreffen nicht alle von ihnen Mausklicks. Wie Sie vielleicht sehen können, wird jemals kein Knoten ausgewählt. Es liegt daran, dass das Ereignis von einem Popup-Trigger-Handler verbraucht wird (siehe javax.swing.plaf.basic.basiclookandfeel.awteventhelper#eventDispatched ).

Code: Select all

import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.WindowConstants;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class TreePopupDemo {

private static JTree tree;

public static void main(String[] args) {
Container mainPanel = createMainPanel();
JFrame frame = new JFrame("Tree Popup Demo");
frame.setContentPane(mainPanel);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}

private static JPanel createMainPanel() {
JPanel panel = new JPanel(new BorderLayout());
panel.add(createTree());
return panel;
}

private static JTree createTree() {
tree = new JTree();
tree.setComponentPopupMenu(createTreePopup());
tree.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
onTreeClick(e);
}
});
return tree;
}

private static JPopupMenu createTreePopup() {
JPopupMenu popup = new JPopupMenu();
PopupMenuListener listener = new PopupMenuAdapter() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
beforePopupAppears();
}
};
popup.addPopupMenuListener(listener);
popup.add(createTestPopupItem());
return popup;
}

private static void beforePopupAppears() {
int[] selectionRows = tree.getSelectionRows();
int selectionRow = isEmpty(selectionRows) ? -1 : selectionRows[0];
System.out.println("Selected tree row: " + selectionRow);
}

private static boolean isEmpty(int[] selectionRows) {
return selectionRows == null || selectionRows.length == 0;
}

private static JMenuItem createTestPopupItem() {
JMenuItem menuItem = new JMenuItem("Test popup item");
return menuItem;
}

private static void onTreeClick(MouseEvent e) {
int x = e.getX();
int y = e.getY();
int row = tree.getRowForLocation(x, y);
if (row >= 0) tree.setSelectionRow(row);
}

private static class PopupMenuAdapter implements PopupMenuListener {

@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
}

@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
}

@Override
public void popupMenuCanceled(PopupMenuEvent e) {
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post