Получите два Jpanel расширения в JFrame асимметрично - PullRequest
1 голос
/ 15 марта 2010

У меня есть JFrame с двумя JPanels внутри. Один установлен на западе, другой на востоке с BorderLayout. Дело в том, что он показывает только две полосы шириной 10 пикселей и высотой JFrame: альтернативный текст http://img641.imageshack.us/img641/3298/imagewg.png

Что я хочу сделать, так это настроить каждую панель с конечным результатом, чтобы jpanel на западе составлял 80% ширины jframe, остальные 20% - на восточной. Является ли это возможным? Должен ли я использовать другой макет?

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

Ответы [ 6 ]

2 голосов
/ 15 марта 2010

Это зависит от ваших точных требований.

При использовании разделенной панели ее можно отключить, что предотвратит изменение размера.

Вы также можете скрыть разделитель, используя:

BasicSplitPaneUI ui = (BasicSplitPaneUI)splitPane.getUI();
ui.getDivider().setVisible(false);

Однако, это не даст вам точного 80/20. Я создал разделенную область шириной 400. Правильный компонент начинался с 312, когда он должен быть 320. Так что это зависит от того, что вы хотите.

Если вы хотите реальное разделение 80/20, то специально для этого было написано Relative Layout .

1 голос
/ 01 августа 2010

Я только что использовал MIG Layout и presto.

1 голос
/ 15 марта 2010

Я бы порекомендовал попробовать GridBagLayout , вы можете установить «вес» или приоритет горизонтального пространства для компонента.

Вы также можете просто пойти с BoxLayout (вдоль оси X) и просто добавить компоненты предварительно заданного размера в свой контейнер. С макетом работать немного проще.

1 голос
/ 15 марта 2010

Вы пробовали JSplitPane, в частности, используя метод setDividerLocation(double proportionalLocation)? Это позволяет вам установить процент от ширины или высоты вмещающего компонента.

0 голосов
/ 15 марта 2010

Три варианта здесь:

1 - Сохраните макет границы и установите предпочтительный размер для двух JPanels. Это будет работать с окном фиксированного размера.

2 - Использовать GridBagLayout:

public class TestJPanel extends JFrame {


    public TestJPanel() {

        JPanel rootPanel = new JPanel();
        rootPanel.setBackground( Color.WHITE );
        rootPanel.setPreferredSize( new Dimension( 0, 100 ) );

        rootPanel.setLayout( new GridBagLayout() );
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH;
        c.weighty = 1;

        JPanel leftPanel = new JPanel();
        leftPanel.setBackground( Color.BLUE );
        c.weightx = 0.2;
        c.gridx = 0;
        rootPanel.add( leftPanel, c );

        JPanel rightPanel = new JPanel();
        c.weightx = 0.8;
        c.gridx = 1;
        rightPanel.setBackground( Color.RED );
        rootPanel.add( rightPanel, c );

        this.add( rootPanel, BorderLayout.CENTER );
    }

    public static void main( String[] args ) {
        TestJPanel window = new TestJPanel();
        window.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
        window.setSize( 1024, 768 );
        window.setVisible( true );
    }

}

3 - используйте знаменитый SpringLayout. Этот менеджер макета действительно сложен в освоении, но вот стартер:

public class TestJPanel extends JFrame {


    public TestJPanel() {

        JPanel rootPanel = new JPanel();
        rootPanel.setBackground( Color.WHITE );
        rootPanel.setPreferredSize( new Dimension( 0, 100 ) );

        SpringLayout layout = new SpringLayout();
        rootPanel.setLayout( layout );

        SpringLayout.Constraints rootPaneCons = layout.getConstraints( rootPanel );
        rootPaneCons.setWidth( Spring.width( this ) );
        rootPaneCons.setHeight( Spring.height( this ) );

        JPanel leftPanel = new JPanel();
        leftPanel.setBackground( Color.BLUE );
        rootPanel.add( leftPanel );
        SpringLayout.Constraints leftPaneCons = layout.getConstraints( leftPanel );
        leftPaneCons.setWidth( Spring.scale( rootPaneCons.getWidth(), .2f ) );
        leftPaneCons.setHeight( Spring.scale( rootPaneCons.getHeight(), 1 ) );

        JPanel rightPanel = new JPanel();
        rightPanel.setBackground( Color.RED );
        rootPanel.add( rightPanel );
        SpringLayout.Constraints rightPaneCons = layout.getConstraints( rightPanel );
        rightPaneCons.setX( Spring.scale( rootPaneCons.getWidth(), .2f ) );
        rightPaneCons.setWidth( Spring.scale( rootPaneCons.getWidth(), .8f ) );
        rightPaneCons.setHeight( Spring.scale( rootPaneCons.getHeight(), 1 ) );

        this.add( rootPanel, BorderLayout.CENTER );
    }

    public static void main( String[] args ) {
        TestJPanel window = new TestJPanel();
        window.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
        window.setSize( 1024, 768 );
        window.setVisible( true );
    }

}
0 голосов
/ 15 марта 2010

Я бы предложил использовать макет FreeDesign, который будет выглядеть следующим образом:

альтернативный текст http://sites.google.com/site/yanchengcheok/Home/free-design-layout.PNG

Netbeans IDE делает эту работу веселой и легкой;)

...