Наследование всплывающего окна на несколько уровней композиции вверхJAVA

Программисты JAVA общаются здесь
Anonymous
Наследование всплывающего окна на несколько уровней композиции вверх

Сообщение Anonymous »

Примечание. В каком-то смысле это продолжение этого вопроса.
Предположим, у вас есть композиция из трех Swing. компоненты. Самый верхний компонент имеет набор всплывающих окон. Другие компоненты этого не делают. Самый нижний компонент имеет, скажем, MouseWheelListener (подойдет и обычный MouseListener). Из-за этого обстоятельства он будет обрабатывать событие щелчка правой кнопкой мыши и игнорировать его (более подробную информацию см. В связанном вопросе)
Существует свойство inheritsPopupMenu. У него есть серьёзное ограничение: он ищет всплывающее окно только на один уровень выше. Это означает, что вам нужно вызвать установщик свойств N раз, где N — «высота дерева — 1». В моем примере это 2, но в реальном рабочем приложении их может быть намного больше.
Это делает такой подход несколько неосуществимым в реальном сценарии
Мои ожидания: возьмите самый нижний компонент и найдите всплывающее окно; если его там нет, найдите всплывающее окно до конца, вызовите первое найденное всплывающее окно (если оно вообще найдено)
Итак, какой лучший способ заставить всплывающие окна Swing работать в соответствии с мои ожидания?
MRE:
package demos.popup;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.WindowConstants;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;

/**
* The popup is broken. Uncomment the commented out lines to make it work
*/
public class PopupDemo {

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

private static JComponent createMainPanel() {
JComponent mainComp = createPanelWithPopup();
return mainComp;
}

private static JPanel createPanelWithPopup() {
JPanel panel = new JPanel(new BorderLayout()) {
@Override
public String toString() {
return "Popup Panel";
}

};
panel.setComponentPopupMenu(createPopupMenu());
panel.add(createChild());
panel.setPreferredSize(new Dimension(250,150));
return panel;
}

private static JComponent createChild() {
JPanel panel = new JPanel(new BorderLayout()) {
@Override
public String toString() {
return "Child Panel";
}
};
//panel.setInheritsPopupMenu(true);
panel.add(createGrandchild());
return panel;
}

private static JComponent createGrandchild() {
JPanel panel = new JPanel(new BorderLayout()) {
@Override
public String toString() {
return "Grandchild Panel";
}
};
//panel.setInheritsPopupMenu(true);
panel.addMouseWheelListener(e -> {
});
return panel;
}

private static JPopupMenu createPopupMenu() {
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(createTestMenuItem());
return popupMenu;
}

private static JMenuItem createTestMenuItem() {
JMenuItem menuItem = new JMenuItem("Test menu item");
menuItem.addActionListener(e -> System.out.println("Test menu item triggered..."));
return menuItem;
}
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... -levels-up

Вернуться в «JAVA»