Прозрачная панель JPanel в JLayeredPane

Я видел несколько подобных вопросов, но, к сожалению, содержащиеся в них предложения не совсем помогли мне.

Общая цель: у меня есть ползунок, который я хочу отобразить в верхнем левом углу окна, которое в основном отображает визуализацию (здесь «отображение»). Ползунок должен накладываться поверх визуализации без фона.

Пока что у меня есть JPanel, содержащий ползунок на слое над визуализацией в JLayeredPane. Проблема в том, что, несмотря на вызовы setOpaque и/или setBackground(new Color(0,0,0,0)), фон для JPanel, включая ползунок, выглядит серым. Я использую Nimbus LAF.

Первоначально я использовал Absolute Layout, который делал почти все довольно элегантно и с минимальным кодом. Проблема заключалась в том, что размер визуализации не изменялся автоматически вместе с окном (но я открыт для этого подхода, если есть чистый способ изменить размер визуализации вместе с окном).

JPanel sliderPane = new JPanel();
sliderPane.setLayout(new BoxLayout(sliderPane, BoxLayout.X_AXIS));
sliderPane.add(zoomSlider);
zoomSlider.setMaximumSize(new Dimension (60, 150));
sliderPane.add(Box.createHorizontalGlue());
sliderPane.setBackground(new Color(0,0,0,0));

JLayeredPane graphPane = new JLayeredPane();
graphPane.setPreferredSize(new Dimension(1000, 800));
graphPane.setLayout(new BoxLayout(graphPane, BoxLayout.Y_AXIS));
graphPane.add(sliderPane, new Integer(1));
graphPane.add(display, new Integer(0));
graphPane.setOpaque(false);

Большое спасибо!


person bcr    schedule 06.07.2012    source источник


Ответы (1)


За визуализацию ползунка отвечает делегат пользовательского интерфейса компонента, обычно подкласс BasicSliderUI. При необходимости вы можете заменить свою собственную реализацию, как показано здесь.

изображение

person trashgod    schedule 07.07.2012
comment
Это разумный ответ, поэтому я соглашусь с ним. Однако я немного раскрыл причину своей проблемы и выбрал другой подход: проблема в том, что назначение макета блока для JLayeredPane устанавливает всю панель в один экземпляр этого макета, а не один макет на слой (как я надеялся), поэтому причина, по которой на панели есть фон, заключается в том, что под ним вообще ничего нет. Я решил использовать позиционирование AbsoluteLayout и переопределить componentResized, чтобы изменить размер компонента, размер которого необходимо изменить вместе с окном. - person bcr; 07.07.2012
comment
Спасибо, но не стесняйтесь добавлять дополнительный ответ, если он может помочь будущим читателям. Меня всегда интересовали подводные камни кроссплатформенного пользовательского интерфейса. - person trashgod; 07.07.2012