Как заставить JPanel оставаться наверху (по оси Z), используя setLayout(null)

У меня есть панель JPanel с именем Scene, которая включает в себя следующие панели JPanel: Frame, Projector, Tools.

Я использую нулевой макет на Scene, потому что хочу использовать определенные координаты, поэтому никакой другой макет мне не подходит. Я использую следующий код, чтобы добавить 3 панели JPanel в основную панель JPanel Scene.

setLayout(null);
add(Tools);
add(Frame);
add(Projector);

Я использую этот порядок, потому что хочу, чтобы Tools всегда было сверху (по оси Z).

Теперь, если я сделаю что-то внутри Projector, что вызовет перерисовку, тогда Projector окажется поверх других слоев, скрывая Tools. Я могу использовать поток, чтобы перерисовать всю Scene JPanel, но я вижу эту "вспышку", когда Projector появляется сверху и переходит снизу, и я не хочу этого делать.

Любые идеи?


person Giannis Tzagarakis    schedule 26.03.2016    source источник
comment
Это хороший вопрос, но было бы полезно больше кода.   -  person robbmj    schedule 26.03.2016
comment
В частности, вам нужно создать и опубликовать минимально воспроизводимый пример. Кроме того, не думайте, что никакой макет мне не подойдет, так как, по всей вероятности, это именно то, что вам нужно - приличный рабочий макет... но трудно сказать, учитывая информацию, опубликованную до сих пор.   -  person Hovercraft Full Of Eels    schedule 26.03.2016
comment
Каков ожидаемый результат??   -  person Vighanesh Gursale    schedule 26.03.2016
comment
Обратите внимание, что сверху также неоднозначно. Если вы имеете в виду, что он должен быть помещен в верхнюю позицию своего контейнера, то контейнер (здесь сцена JPanel - обратите внимание, что имена переменных должны начинаться с буквы нижнего регистра, поэтому сцена, а не сцена) должен использовать BorderLayout, и компонент инструментов должен быть добавлен BorderLayout.PAGE_START. Если под словом «сверху» вы подразумеваете, что он должен покрывать другие компоненты, тогда вам нужно использовать CardLayout для замены компонентов или JLayeredPane, если вы хотите покрыть, но показать базовые компоненты.   -  person Hovercraft Full Of Eels    schedule 26.03.2016
comment
Ожидаемый результат — tools, который будет находиться поверх двух других панелей JPanel. Мой код состоит из более чем 900 строк кода, поэтому я не могу просто скопировать и вставить его, даже его часть. Я могу написать небольшую программу, которая имитирует проблему, но я думаю, что создать 3 панели JPanel не так уж сложно.   -  person Giannis Tzagarakis    schedule 26.03.2016
comment
"but I think creating 3 JPanels is not that hard" -- Я согласен, и это ваш вопрос и ваша проблема, так что, во что бы то ни стало, создайте свою небольшую программу с 3 JPanels и помогите нам, опубликовав ее со своим вопросом. Бремя усилий должно лежать на вы, поскольку 1) это ваш вопрос и 2) мы добровольцы.   -  person Hovercraft Full Of Eels    schedule 26.03.2016
comment
Я ничего не требовал, так что прошу не расстраиваться. Я сделаю крошечную программу, чтобы поделиться. Заранее позвольте мне сказать, что я хочу tools покрыть две другие панели JPanel. Так что, возможно, я попробую JLayeredPane, если это что-то похожее на JPanel.   -  person Giannis Tzagarakis    schedule 26.03.2016
comment
Не поймите меня неправильно — я не расстроен, я просто жду вашего кода.   -  person Hovercraft Full Of Eels    schedule 26.03.2016
comment
Не используйте JLayeredPane, если вы не хотите, чтобы другие компоненты были видны. Если вы хотите, чтобы инструменты покрывали, а другие были скрыты, а затем заменяли инструменты одним из других, тогда вам действительно нужно использовать CardLayout.   -  person Hovercraft Full Of Eels    schedule 26.03.2016
comment
@HovercraftFullOfEels верен, ваш вопрос имеет тенденцию быть неоднозначным, потому что on top можно интерпретировать как компонент, который должен быть помещен в позицию NORTH, или его можно интерпретировать так, как он должен отображаться вверху в направлении z axis.   -  person Vighanesh Gursale    schedule 26.03.2016
comment
Инструменты полупрозрачны, поэтому я хочу, чтобы другие компоненты были видны. так что JLayeredPane - это то, что мне нужно, верно?   -  person Giannis Tzagarakis    schedule 26.03.2016
comment
Если это так, то да, рассмотрите возможность использования JLayeredPane. Вы можете точно указать z-порядок компонентов, используя метод add(...), который принимает целочисленную константу в качестве второго параметра.   -  person Hovercraft Full Of Eels    schedule 26.03.2016


Ответы (1)


Если вы хотите разместить компоненты друг над другом по отношению к их оси Z, рассмотрите возможность использования JLayeredPane в качестве основного контейнера, а затем добавления компонентов с помощью метода add(...), который принимает целое число в качестве второго параметра. Самый нижний слой должен быть добавлен с использованием JLayeredPane.DEFAULT_LAYER, который, как я полагаю, равен 0. Это позволит непрозрачным верхним компонентам показывать через них нижние компоненты.

person Hovercraft Full Of Eels    schedule 26.03.2016
comment
все еще нужно перекрасить основной контейнер, чтобы tools снова появился наверху - person Giannis Tzagarakis; 26.03.2016
comment
@GiannisTzagarakis: все еще нужно создать и опубликовать этот минимально воспроизводимый пример, который демонстрирует нам эту проблему. Все, что я могу сделать в отношении ответа, это использовать то, что вы нам дали. - person Hovercraft Full Of Eels; 26.03.2016
comment
@GiannisTzagarakis Макеты Swing ленивы по своей конструкции, они позволяют вам добавлять множество компонентов в контейнер без обновления иерархии контейнера или планирования перерисовки, пока вы не скажете об этом, именно так устроен API. - person MadProgrammer; 27.03.2016
comment
Я сделал небольшую программу с 4 панелями JPanel, и она отлично работает.. может быть, java шутит надо мной.. - person Giannis Tzagarakis; 27.03.2016
comment
@GiannisTzagarakis: нет, это просто означает, что вам еще предстоит изолировать ошибку. Продолжайте добавлять код, пока не возникнет ошибка. - person Hovercraft Full Of Eels; 27.03.2016
comment
Я просто перерисовываю весь scene сразу после вызванной перерисовки, поэтому у меня нет проблем даже с этим плохим решением. - person Giannis Tzagarakis; 27.03.2016