Я пишу собственный компонент выбора файлов. В моем пользовательском интерфейсе сначала пользователь нажимает кнопку, в результате чего появляется JFileChooser; когда он закрыт, абсолютный путь к выбранному файлу записывается в JTextField.
Проблема в том, что абсолютные пути обычно длинные, что приводит к увеличению текстового поля, что делает его контейнер слишком широким.
Я пробовал это, но ничего не вышло, текстовое поле все еще слишком широкое:
fileNameTextField.setMaximumSize(new java.awt.Dimension(450, 2147483647));
В настоящее время, когда он пуст, он уже имеет длину 400 пикселей из-за прикрепленного к нему GridBagConstraints.
Я бы хотел, чтобы это было похоже на текстовые поля на HTML-страницах, которые имеют фиксированный размер и не увеличиваются при слишком длинном вводе.
Итак, как мне установить максимальный размер для JTextField?




Это может зависеть от менеджера компоновки, в котором находится ваше текстовое поле. Некоторые менеджеры компоновки расширяют, а некоторые нет. Некоторые расширяются только в некоторых случаях, другие всегда.
Я предполагаю, что ты делаешь
filedNameTextField = new JTextField(80); // 80 == columns
Если это так, то для большинства разумных макетов поле не должно менять размер (по крайней мере, не должно увеличиваться). Часто менеджеры по расположению плохо себя ведут при установке в JScrollPane.
По моему опыту, попытки контролировать размеры через setMaximumSize, setPreferredWidth и так далее в лучшем случае ненадежны. Swing самостоятельно выбрал диспетчер компоновки, и вы мало что можете с этим поделать.
При этом у меня не было проблемы, с которой вы столкнулись, что заставляет меня думать, что разумное использование менеджера по расположению решит эту проблему.
Я решил эту проблему, установив максимальную ширину контейнера текстового поля с помощью setMaximumSize.
Согласно ответу Даветрона, это хрупкое решение, потому что диспетчер компоновки может игнорировать это свойство. В моем случае контейнер самый верхний, и в первом тесте он работал.
Не задавайте никаких размеров в текстовом поле. Вместо этого установите размер столбца на ненулевое значение с помощью setColumns или с помощью конструктора с аргументом столбца.
Что происходит, так это то, что предпочтительный размер, сообщаемый JTextComponent, когда столбцы равны нулю, - это весь объем пространства, необходимый для визуализации текста. Когда для столбцов задано ненулевое значение, предпочтительный размер - это размер, необходимый для отображения такого количества стандартных значений ширины столбцов. (для шрифта с переменным шагом он обычно близок к размеру строчной буквы «m»). Если для столбцов установлено нулевое значение, текстовое поле запрашивает столько места, сколько может получить, и растягивает весь контейнер.
Поскольку он у вас уже есть в GridBagLayout с заливкой, вы, вероятно, могли бы просто установить столбцы на 1 и позволить заливке растягивать его на основе других компонентов или какого-либо другого подходящего небольшого числа.
Я рекомендую этот подход при использовании FlowLayout.
Да, к сожалению, именно так обстоит дело со Swing. Это хороший инструментарий во многих отношениях, но непредсказуемость компонентов в разных менеджерах компоновки действительно раздражает.