2016-04-15 4 views
0

На это, вероятно, ответили здесь, но мои поиски составили пробел, возможно, я искал неправильную вещь.Как я могу остановить растяжение JTextArea и JTextField?

Как я могу остановить JTextArea и JTextField от растяжки? Является ли качели какой-либо разделительной панелью, которую я могу добавить, которая будет растянута перед любыми другими элементами?

У меня есть JPanel, который заполняет JFrame с установленным размером. Он использует BoxLayout, установленный в PAGE_AXIS. Если я добавлю JTextArea размером 3,100, он игнорирует эти размеры строк/столбцов и заполняет все доступное пространство.

Аналогичным образом у меня есть JPanel с GridLayout. Если я добавлю JTextField, а не размер в столбцах, которые я укажу, он заполняет все пространство в сетке.

Редактировать: Рисунок ниже показывает, что я хотел бы (вверху) и то, что я получаю. enter image description here

+0

Пожалуйста, пост некоторые кусок кода, чтобы исследовать этот вопрос. – Braj

+1

Начнем с рассмотрения [Выравнивание компонентов внутри контейнера] (http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html) для получения более подробной информации о различных менеджерах компоновки, что-то вроде 'FlowLayout' и' GridBagLayout' выполнили бы работу – MadProgrammer

+0

Предоставьте ASCII-проект или простой чертеж * предназначенного макета GUI с минимальным размером и, если он изменен, с большей шириной и высотой. –

ответ

1

Несколько слов непосредственно из документации по How to Use GridLayout

объект А GridLayout размещает компоненты в сетке клеток. Каждый компонент принимает все доступное пространство внутри своей ячейки, и каждая ячейка имеет точно такой же размер. Если окно GridLayoutDemo изменено, объект GridLayout изменяет размер ячейки, чтобы ячейки были как можно больше, учитывая пространство, доступное контейнеру.

GridLayout не учитывает размер компонента. Он пытается подобрать компонент в доступном пространстве в строках и столбцах.


Старайтесь не устанавливать размер явно. Есть очень хорошая статья о Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?, которая поможет вам лучше ее разработать.


Существует множество менеджеров макетов, которые могут соответствовать вашим требованиям. Пожалуйста, обратите внимание на How to Use Various Layout Managers


Вы можете использовать GridBagLayout вместо GridLayout разделить компоненты в строки и столбцы так же, как сервировки, которая дает вам больше контроля на ширине сетки, высота, края, обивка, колонки, строки и т.д.

+0

Спасибо за те полезные ссылки. Причина, по которой я хочу указывать размеры, заключается в том, что у меня есть входные ограничения (т. Е. Я хочу не более 8 символов в этом JTextView, поэтому я создаю его как «новый JTextView (8)»). В других библиотеках пользовательского интерфейса я работал с (Android/Qt) вы можете добавить проставки или пустые панели и установить «коэффициенты растяжения» этих компонентов, чтобы он не был (в этом случае) TextView/Area, который растягивается, чтобы заполнить доступное пространство. – Lieuwe

0

В моем коде я просто установить количество столбцов

JTextField data = new JTextField(); 
data.setColumns(30); 
+0

* «Я просто установил количество столбцов» * Вопрос уже упоминает об этом как для текстовой области, так и для поля. Проблема здесь в том, что ** layouts ** растягивают компоненты, чтобы соответствовать доступному пространству. –

+0

Я также установил MaxSize –

0

Вы не можете сделать серьезные макеты GridLayout или лозы BoxLayout. Забудьте о них.

Первый вопрос: вы уверены, что не хотите, чтобы JTextArea и JTextField расти? Стандарт в пользовательском интерфейсе состоит в том, что эти компоненты растут и сокращаются; первый в обоих направлениях, второй - по горизонтали.

В любом случае, я размещаю решения для GroupLayout и MigLayout, которые являются менеджерами, которых я очень рекомендую.

а) Решение с GroupLayout

Каждый компонент имеет три размера: минимальный, предпочтительный и максимум. Эти установлены на некоторые разумные значения по умолчанию для каждого компонента. Вот почему JTextField имеет тенденцию расти горизонтально; его максимальное значение установлено на очень большое количество.

package com.zetcode; 

import java.awt.Container; 
import java.awt.EventQueue; 
import javax.swing.BorderFactory; 
import javax.swing.GroupLayout; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import static javax.swing.JFrame.EXIT_ON_CLOSE; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

public class GroupLayoutStretchingEx extends JFrame { 

    public GroupLayoutStretchingEx() { 

     initUI(); 
    } 

    private void initUI() { 

     JTextArea area = new JTextArea(12, 20); 
     area.setBorder(BorderFactory.createEtchedBorder()); 
     JLabel input = new JLabel("Input"); 
     JTextField textField = new JTextField(15); 

     createLayout(area, input, textField); 

     setTitle("Stretching"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    private void createLayout(JComponent... arg) { 

     Container pane = getContentPane(); 
     GroupLayout gl = new GroupLayout(pane); 
     pane.setLayout(gl); 

     gl.setAutoCreateContainerGaps(true); 
     gl.setAutoCreateGaps(true); 

     gl.setHorizontalGroup(gl.createParallelGroup(GroupLayout.Alignment.TRAILING) 
       .addComponent(arg[0], GroupLayout.DEFAULT_SIZE, 
         GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) 
       .addGroup(gl.createSequentialGroup() 
         .addComponent(arg[1]) 
         .addComponent(arg[2], GroupLayout.DEFAULT_SIZE, 
           GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) 
     ); 

     gl.setVerticalGroup(gl.createSequentialGroup() 
       .addComponent(arg[0], GroupLayout.DEFAULT_SIZE, 
         GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) 
       .addGroup(gl.createParallelGroup() 
         .addComponent(arg[1]) 
         .addComponent(arg[2], GroupLayout.DEFAULT_SIZE, 
           GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) 
     ); 

     pack(); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      GroupLayoutStretchingEx ex = new GroupLayoutStretchingEx(); 
      ex.setVisible(true); 
     }); 
    } 
} 

В GroupLayout, вам необходимо установить правильные значения для максимального компонента размера в методе addComponent().

JTextArea area = new JTextArea(12, 20); 

Установив количество строк и столбцов для JTextArea, мы установить желаемый размер для этого компонента. Это значение позже используется менеджером макета в его расчетах.

б) Решение с MigLayout

В MigLayout, мы контролируем resizement компонентов с различными ограничений, таких, как fill, grow или push. Не используя их, компоненты не растут.

package com.zetcode; 

import javax.swing.BorderFactory; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import net.miginfocom.swing.MigLayout; 

public class MigLayoutStretchingEx extends JFrame { 

    public MigLayoutStretchingEx() { 

     initUI(); 
    } 

    private void initUI() { 

     JTextArea area = new JTextArea(12, 20); 
     area.setBorder(BorderFactory.createEtchedBorder()); 
     JLabel input = new JLabel("Input"); 
     JTextField textField = new JTextField(15); 

     createLayout(area, input, textField); 

     setTitle("MigLayout example"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    private void createLayout(JComponent... arg) { 

     setLayout(new MigLayout()); 

     add(arg[0], "wrap"); 
     add(arg[1], "split 2"); 
     add(arg[2], "growx"); 
     pack(); 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(() -> { 
      MigLayoutStretchingEx ex = new MigLayoutStretchingEx(); 
      ex.setVisible(true); 
     }); 
    } 
} 

А вот скриншот:

Screenshot from the MigLayout example

Смежные вопросы