JLayeredPane с прозрачным слоем вызывает неправильное рисование

У меня есть JLayeredPane с двумя слоями. Верхний уровень полностью прозрачен и действует как стеклянная панель, которая фиксирует события мыши, а затем отправляет их на панель под ней. Нижний слой не отображается правильно по неизвестной причине. Должен ли я отправлять ему события рисования или что-то еще?

Кстати, я бы воспользовался стеклом Frame, но не могу до него добраться. Я застрял, используя JPanel, который предоставляется структурой графического интерфейса, построенной поверх Swing. Я пытался использовать SwingUtilities для доступа к родительскому фрейму, но он всегда возвращает ноль.


person smuggledPancakes    schedule 10.09.2012    source источник
comment
По неизвестной причине и неизвестному коду я мог дать только неизвестный ответ...   -  person Guillaume Polet    schedule 10.09.2012


Ответы (2)


Если вы хотите использовать стеклянную панель и захватывать события в Swing, используйте JLayer (Java 7). Если вы не используете Java 7, вы можете использовать JXLayer (http://java.net/projects/jxlayer/ ). Это новый компонент Swing по умолчанию для этого поведения. Видеть

person Hendrik Ebbers    schedule 17.09.2012

Я согласен с Гийоном, что это очень расплывчатый вопрос. Так что у вас вполне может быть очень веская причина делать это так, как вы сделали. Однако, если это поможет, вы, вероятно, можете полностью избавиться от прозрачного слоя и просто прикрепить прослушиватель мыши непосредственно к JLayeredPane:

JPanel jP = new JPanel();
JLayeredPane jLP = new JLayeredPane();
MouseAdapter mouse = new MouseAdapter();
jLP.addMouseListener(mouse);

Затем класс MouseAdapter:

public class MouseAdapter{
  //Make sure you override the methods
}

Другой способ, которым я довольно часто пользуюсь, заключается в простом расширении JLayeredPane и реализации MouseListener:

public class MyLayers extends JLayeredPane implements MouseListener
{
  public MyLayers(){
    addMouseListener(this);
  }
//again make sure you override the methods
}

Это вызывает «утечку этого в конструкторе» в NetBeans, но его можно игнорировать.

person MrB    schedule 17.09.2012