Как я могу контролировать ширину JTextFields в Java Swing? - PullRequest
17 голосов
/ 24 мая 2010

Я пытаюсь иметь несколько JTextFields в одной строке, но я не хочу, чтобы они имели одинаковую ширину.Как я могу контролировать ширину и сделать некоторые из них шире, чем другие?Я хочу, чтобы они вместе занимали 100% от общей ширины, поэтому было бы хорошо, если бы я мог использовать какой-то вес.

Я пробовал с .setColumns(), но это не имеет смысла.1004 *

Вот пример, где я использую три строки с тремя строками, которые должны выглядеть как в столбцах:

import java.awt.GridLayout;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class RowTest extends JPanel {

    class Row extends JComponent {
        public Row(String str1, String str2, String str3) {
            this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));

            JTextField fld1 = new JTextField(str1);
            JTextField fld2 = new JTextField(str2);
            JTextField fld3 = new JTextField(str3);

            fld1.setColumns(5); // makes no sense

            this.add(fld1);
            this.add(fld2);
            this.add(fld3);
        }
    }

    public RowTest() {
    this.setLayout(new GridLayout(5,0));

    this.add(new Row("Short", "A long text that takes up more space",
        "Short again"));
    this.add(new Row("Longer but short", "Another long string", "Short"));
    this.add(new Row("Hello", "The long field again",
        "Some info"));
    }

    public static void main(String[] args) {
        new JFrame() {{ this.getContentPane().add(new RowTest());
                            this.pack(); this.setVisible(true); }};
    }

}

Ответы [ 4 ]

35 голосов
/ 31 декабря 2011
yourTextField = new JTextField("", 20);

если вы запустите его таким образом, текстовое поле станет пустым и будет иметь 20 столбцов

6 голосов
/ 24 мая 2010

Все компоненты Swing имеют предпочтительный размер.Предпочтительный размер текстового компонента основан на тексте компонента.Поэтому обычно компонент окрашивается в его предпочтительный размер.

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

Редактировать:

На основании последних требований вы можете использовать Относительный макет .

5 голосов
/ 30 августа 2017

Попробуйте это:

textfield.setPreferredSize(new Dimension(int width, int height));
0 голосов
/ 24 мая 2010
// 1. create JTextField
yourTextField = new JTextField();
// 2. store default height
int defaultHeight = yourTextField.getSize().getHeight();
// 3. set custom width and default height
yourTextField.setSize(new Dimension(yourWidth, defaultHeight));
...