Сделайте jLayeredPanes твердым

У меня есть графический интерфейс с кучей jPanels, уложенных друг на друга. Какой из них находится «сверху», контролируется jLayeredPane. Однако при наведении указателя мыши на кнопки и формы, которые не находятся сверху, они становятся видимыми и взаимодействующими.

Как я могу сделать панели «твердыми», то есть так, чтобы лежащие в основе компоненты не «всплывали»?


person Theodor    schedule 07.09.2011    source источник
comment
попробуйте panel.setOpaque(true);.   -  person Harry Joy    schedule 07.09.2011
comment
@ Гарри - Я так и думал, но нет, уже пробовал.   -  person Theodor    schedule 07.09.2011
comment
не понимают, что стало видимым, но взаимодействия можно ожидать: события mouseEvents доставляются самому верхнему компоненту, который желает их получить, им все равно, являются ли композиции слоями или обычно добавляются. Не могу придумать простое решение ... поэтому отступаю и спрашиваю обычное (как уже неявно спрашивает @dacwe :), почему вы используете LayeredPane?   -  person kleopatra    schedule 07.09.2011


Ответы (3)


Я бы посоветовал вам использовать CardLayout для эта задача.

person dacwe    schedule 07.09.2011
comment
Хорошо ... Я попробую! Итак, когда следует использовать jLayeredPane? - person Theodor; 07.09.2011
comment
JLayeredPane следует использовать, когда компоненты могут перекрывать друг друга. (В вашем случае вы этого не хотите, вы хотите видеть только по одному.) - person dacwe; 07.09.2011
comment
+1 для CardLayout. - person trashgod; 07.09.2011

Итак, когда следует использовать JLayeredPane?

Используйте Layered Pane, если вы хотите, чтобы на в то же время. Используйте CardLayout, чтобы заменить весь панель.

person trashgod    schedule 07.09.2011

Техническое решение для блокировки событий мыши, доступное с jdk7, представляет собой JLayer (я все еще играю с ним, поэтому я иногда показываю его :-)

public static class MouseBlockerUI extends LayerUI<JComponent> {

    @Override
    protected void processMouseEvent(MouseEvent e, JLayer l) {
        JLayeredPane layeredPane = (JLayeredPane) l.getParent();
        if (layeredPane.getLayer(l) != layeredPane.highestLayer())
            e.consume();
    }

    @Override
    public void installUI(JComponent c) {
        super.installUI(c);
        JLayer jlayer = (JLayer)c;
        jlayer.setLayerEventMask(
                AWTEvent.MOUSE_EVENT_MASK 
        );
    }

    @Override
    public void uninstallUI(JComponent c) {
        JLayer jlayer = (JLayer)c;
        jlayer.setLayerEventMask(0);
        super.uninstallUI(c);
    }

}

затем оберните свои панели в JLayer и добавьте JLayer в JLayeredPane:

layeredPane.add(new JLayer(myPanel, new MouseBlockerUI(), someLayer));
person kleopatra    schedule 07.09.2011