Java, Swing: как установить максимальную ширину JTextField?

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

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

Я пробовал это, но ничего не сделал, текстовое поле все еще слишком широкое:

fileNameTextField.setMaximumSize(new java.awt.Dimension(450, 2147483647));

в настоящее время, когда он пустой, он это уже 400px долго, из-за GridBagConstraints прилагается к нему.

Я бы хотел, чтобы это было похоже на текстовые поля на HTML-страницах, которые имеют фиксированный размер и не увеличиваются, когда вход слишком длинный.

Итак, как установить максимальный размер для JTextField ?

3 ответов


это может зависеть от менеджера макета, в котором находится текстовое поле. Некоторые менеджеры макетов расширяются, а некоторые нет. Одни расширяются только в одних случаях, другие-всегда.

Я предполагаю, что вы делаете

filedNameTextField = new JTextField(80); // 80 == columns

если это так, для большинства разумных макетов поле не должно изменять размер (по крайней мере, оно не должно расти). Часто менеджеры макетов ведут себя плохо, когда их ставят в JScrollPanes.

по моему опыту, пытаясь контролировать размеры с помощью setMaximumSize и setPreferredWidth и так далее в лучшем случае ненадежно. Swing решил самостоятельно с менеджером макета, и вы мало что можете с этим поделать.

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


Я решил это, установив максимальную ширину контейнера текстового поля, используя setMaximumSize.

согласно ответу davetron, это хрупкое решение, потому что менеджер макета может игнорировать это свойство. В моем случае контейнер является самым верхним, а в первом тесте он работал.


Не устанавливайте размеры текстового поля. Вместо этого задайте для размера столбца ненулевое значение через setColumns или с помощью конструктора с аргументом столбца.

происходит то, что предпочтительный размер, сообщаемый JTextComponent, когда столбцы равны нулю, - это весь объем пространства, необходимый для рендеринга текста. Когда столбцам задано ненулевое значение, предпочтительным размером является необходимый размер, чтобы показать, что многие стандартные ширины столбцов. (для переменной шрифта поле обычно близко к размеру нижнего регистра "m"). При нулевых столбцах текстовое поле запрашивает столько места, сколько может получить, и растягивает весь контейнер.

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