Как я могу контролировать ширину 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); }};
}
}
Ответы
Ответ 1
Все компоненты Swing имеют предпочтительный размер. Предпочтительный размер текстового компонента основан на тексте компонента. Таким образом, обычно компонент окрашивается по своему предпочтительному размеру.
Поэтому я не вижу проблемы с вашим фрагментом кода. Каждое текстовое поле должно иметь другой предпочтительный размер. Кроме того, по мере изменения размера рамки ширина будет скорректирована, так как BoxLayout попытается изменить размер каждого компонента до максимального/минимального размера.
Если вам нужна дополнительная помощь, напишите SSCCE, который на самом деле демонстрирует проблему с размерами, которые вы испытываете.
Edit:
В соответствии с последним требованием вы можете использовать Относительная компоновка.
Ответ 2
yourTextField = new JTextField("", 20);
если вы начинаете его так, он устанавливает пустое текстовое поле и имеет 20 столбцов
Ответ 3
Попробуйте следующее:
textfield.setPreferredSize(new Dimension(int width, int height));
Ответ 4
// 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));
Ответ 5
Я использовал GridBagLayout, и он отлично работает. Я думаю, что это может быть лучшей практикой.