Качающиеся перекрывающиеся компоненты - PullRequest
2 голосов
/ 15 сентября 2009

У меня есть два компонента AWT в раме, панель A и панель B. Я бы хотел, чтобы размер панели A соответствовал ширине рамы по высоте (и сохранить этот размер при изменении размера рамки), но я бы хотел, чтобы панель B Перекрытие A. B будет в фиксированном положении (0,0, чтобы упростить) с фиксированной высотой и шириной. Я не уверен, какой менеджер компоновки мне понадобится, чтобы сделать эту работу. Если бы я использовал нулевую разметку, я думаю, что мне пришлось бы самостоятельно управлять изменением размеров панели A, но это сделало бы изменение размера панели B относительно простым. Есть мысли о том, как этого добиться?

спасибо, Джефф

Ответы [ 3 ]

10 голосов
/ 15 сентября 2009

Взгляните на JLayeredPane с . Вот учебник .

редактирование:

Если панель A является компонентом AWT, вам будет сложно заставить панель B перекрываться. Из статьи Sun под названием Смешивание тяжелых и легких компонентов :

Не смешивайте легкие (Swing) и тяжелые (AWT) компоненты в контейнере, где легкий компонент должен перекрывать тяжелый.

Однако, если вы хотите, чтобы панель A полностью заполняла фрейм, почему бы не добавить панель B в качестве компонента панели A?

Edit2:

Если вы можете сделать PanelB тяжелым компонентом, тогда вы можете использовать JLayeredPane.

Вот быстрый макет, который показывает, как:

public static void main(String[] args){
    new GUITest();
}

public GUITest() {
    frame = new JFrame("test");
    frame.setSize(300,300);
    addStuffToFrame();
    SwingUtilities.invokeLater(new Runnable(){
        public void run() {
            frame.setVisible(true);
        }
    });

}       

private void addStuffToFrame() {    
    Panel awtPanel = new Panel();
    awtPanel.setBackground(Color.blue);
    //here you can fool around with the pane:
    //first, you can see how the layered pane works by switching the 
    //DEFUALT_LAYER and PALLETTE_LAYER back and forth between the two panels
    //and re-compiling to see the results
    awtPanel.setSize(200,300);
    frame.getLayeredPane().add(awtPanel, JLayeredPane.DEFAULT_LAYER);
    //next you comment out the above two lines and 
    //uncomment the following line. this will give you the desired effect of
    //awtPanel filling in the entire frame, even on a resize. 
    //frame.add(awtPanel);

    Panel awtPanel2 = new Panel();
    awtPanel2.setBackground(Color.red);
    awtPanel2.setSize(300,200);
    frame.getLayeredPane().add(awtPanel2,JLayeredPane.PALETTE_LAYER);
}   
1 голос
/ 15 сентября 2009

Лучше всего иметь собственный LayoutManager. Возможно, самый простой способ - это расширить или использовать BorderLayout или прокси-сервер с конкретным регистром для панели макета B.

0 голосов
/ 15 сентября 2009

Может быть, я что-то упустил. Если B имеет фиксированный размер и находится в точке (0,0), а A работает на полную ширину, что толку от перекрытия B с A? Вы никогда не увидите ничего, что находится под B.

Я не могу вспомнить ни одного из менеджеров по умолчанию, но у Orielly есть такой, который вы можете использовать: менеджер относительной компоновки (см. Ссылку на исходный код) с документацией . Я не использовал его долгое время, но это должно побить управление макетом самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...