Как я могу контролировать ширину JTextFields в Java Swing?

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

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

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

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 ответов


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

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

Если вам нужна дополнительная помощь пост ваш SSCCE это фактически демонстрирует проблему калибровки, которую вы испытываете.

Edit:

на основе последнего требования вы можете использовать Относительная Разметка.


yourTextField = new JTextField("", 20);

Если вы запустите его так, он устанавливает текстовое поле пустым и иметь 20 collumns


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

textfield.setPreferredSize(new Dimension(int width, int height));

// 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));