java простое управление JPanel (см. скриншот) - PullRequest
1 голос
/ 12 марта 2010

У меня есть JPanel, которая инкапсулирует два JPanel, один поверх другого.

Первый содержит два JLabels, которые держат игральные карты.

Второй содержит текст игрока (имя и счет).

Однако, когда я убираю карты игрока, нижняя JPanel перемещается вверх, что я бы предпочел, чтобы она не делала. Есть ли способ сохранить его на месте, независимо от того, занят ли верхний JPanel или нет?

Спасибо

alt text

alt text

Ответы [ 2 ]

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

Какие менеджеры макетов вы используете? Диспетчером макетов по умолчанию для JPanel является FlowLayout, который визуализирует дочерние компоненты один за другим.

Может быть, вы могли бы установить корневой JPanel для BorderLayout. Затем установите верхнюю JPanel на «верхнюю» точку корневой панели:

JPanel rootPanel = ...;
JPanel topPanel = ...;
rootPanel.add(topPanel, BorderLayout.TOP);

Затем установите минимальный размер для вашей верхней JPanel:

topPanel.setMinimumSize(new Dimension(someWidth, someHeight));

И добавьте вторую панель в нижнюю или среднюю точку:

rootPanel.add(secondPanel, BorderLayout.CENTER);

Выезд http://java.sun.com/docs/books/tutorial/uiswing/layout/border.html

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

Я успел сделать пример:

public class TestJpanel extends JFrame {


    public TestJpanel() {
        this.setLayout( new BorderLayout() );

        final JLabel card1 = new JLabel( "card1" );
        final JLabel card2 = new JLabel( "card2" );

        final JPanel topPanel = new JPanel();
        topPanel.setPreferredSize( new Dimension( 1024, 100 ) );
        topPanel.add( card1 );
        topPanel.add( card2 );

        this.add( topPanel, BorderLayout.NORTH );

        JPanel centerPanel = new JPanel();
        final JButton hideCardsButton = new JButton( "Hide cards" );
        hideCardsButton.addActionListener( new ActionListener() {

            @Override
            public void actionPerformed( ActionEvent e ) {
                if ( topPanel.getComponentCount() == 0 ) {
                    topPanel.add( card1 );
                    topPanel.add( card2 );
                    hideCardsButton.setText( "Hide cards" );
                } else {
                    topPanel.removeAll();
                    hideCardsButton.setText( "Show cards" );
                }
                topPanel.validate();
                topPanel.repaint();
            }
        } );
        centerPanel.add( hideCardsButton );

        this.add( centerPanel, 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 );
    }

}

Обратите внимание, что этот код полон плохих практик, но помогает продемонстрировать то, что я хочу, с коротким числом строк.

...