Изменить размер JTextField внутри JBorderLayout

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

JPanel displayPanel = new JPanel(new GridLayout(4, 2));

JTextField titleText = new JTextField("title");

displayPanel.add(titleText);

titleText.setSize(200, 24);

4 ответа

Решение

Из API на GridLayout:

Контейнер разделен на прямоугольники одинакового размера, и в каждом прямоугольнике размещается один компонент.

Попробуйте использовать FlowLayout или GridBagLayout, чтобы ваш заданный размер был значимым. Кроме того, @Serplat является правильным. Вам нужно использовать setPreferredSize( Dimension) вместо setSize (int, int).

    JPanel displayPanel = new JPanel();
    // JPanel displayPanel = new JPanel( new GridLayout( 4, 2 ) );
    // JPanel displayPanel = new JPanel( new BorderLayout() );
    // JPanel displayPanel = new JPanel( new GridBagLayout() );

    JTextField titleText = new JTextField( "title" );

    titleText.setPreferredSize( new Dimension( 200, 24 ) );

    // For FlowLayout and GridLayout, uncomment:
    displayPanel.add( titleText );

    // For BorderLayout, uncomment:
    // displayPanel.add( titleText, BorderLayout.NORTH );

    // For GridBagLayout, uncomment:
    // displayPanel.add( titleText, new GridBagConstraints( 0, 0, 1, 1, 1.0,
    // 1.0, GridBagConstraints.CENTER, GridBagConstraints.NONE,
    // new Insets( 0, 0, 0, 0 ), 0, 0 ) );

Размер любого компонента, добавленного в GridLayout, будет изменен до того же размера, что и самый большой добавленный компонент. Если вы хотите, чтобы компонент оставался в своем предпочтительном размере, оберните этот компонент в JPanel и размер панели будет изменен:

JPanel displayPanel = new JPanel(new GridLayout(4, 2)); 
JTextField titleText = new JTextField("title"); 
JPanel wrapper = new JPanel( new FlowLayout(0, 0, FlowLayout.LEADING) );
wrapper.add( titleText );
displayPanel.add(wrapper); 
//displayPanel.add(titleText); 

С BorderLayout вам нужно использовать setPreferredSize вместо setSize

Попробуйте поиграть с

setMinSize()
setMaxSize()
setPreferredSize()

Эти методы используются макетом, когда он решает, каким должен быть размер текущего элемента. Менеджер по расположению вызывает setSize() и фактически переопределяет ваши значения.

Другие вопросы по тегам