Java, Качать:как мне установить максимальную ширину JTextField?
-
02-07-2019 - |
Вопрос
Я пишу пользовательский компонент выбора файла.В моем пользовательском интерфейсе сначала пользователь нажимает кнопку, на которой появляется JFileChooser
;когда он закрыт, абсолютный путь к выбранному файлу записывается в JTextField
.
Проблема в том, что абсолютные пути обычно длинные, что приводит к увеличению текстового поля, делая его контейнер слишком широким.
Я пробовал это, но это ничего не дало, текстовое поле по-прежнему слишком широкое:
fileNameTextField.setMaximumSize(new java.awt.Dimension(450, 2147483647));
В настоящее время, когда он пуст, его длина уже составляет 400 пикселей, из-за GridBagConstraints
привязанный к нему.
Я бы хотел, чтобы это было похоже на текстовые поля на HTML-страницах, которые имеют фиксированный размер и не увеличиваются, когда ввод слишком длинный.
Итак, как мне установить максимальный размер для JTextField
?
Решение
Это может зависеть от менеджера компоновки, в котором находится ваше текстовое поле.Некоторые менеджеры верстки расширяются, а некоторые нет.Некоторые расширяются только в некоторых случаях, другие - всегда.
Я предполагаю, что вы делаете
filedNameTextField = new JTextField(80); // 80 == columns
Если это так, то для большинства разумных макетов размер поля не должен меняться (по крайней мере, оно не должно увеличиваться).Часто менеджеры по верстке ведут себя плохо, когда их вводят в JScrollPane
s.
По моему опыту, пытаясь контролировать размеры с помощью setMaximumSize
и setPreferredWidth
и так далее, в лучшем случае, ненадежны.Swing самостоятельно определился с менеджером верстки, и вы мало что можете с этим поделать.
При всем при этом у меня не было проблемы, с которой столкнулись вы, что наводит меня на мысль, что разумное использование менеджера верстки решит проблему.
Другие советы
Я решил это, установив максимальную ширину контейнера текстового поля, используя setMaximumSize
.
Согласно ответу davetron, это хрупкое решение, потому что менеджер компоновки может игнорировать это свойство.В моем случае контейнер является самым верхним, и в первом тестировании это сработало.
Не устанавливайте ни один из размеров текстового поля.Вместо этого установите размер столбца в ненулевое значение с помощью setColumns или с помощью конструктора с аргументом column .
Что происходит, так это то, что предпочтительный размер, сообщаемый JTextComponent, когда columns равен нулю, - это весь объем пространства, необходимый для отображения текста.Когда для параметра columns задано ненулевое значение, предпочтительным размером является необходимый размер для отображения такого количества стандартных ширин столбцов.(для шрифта с переменной высотой тона он обычно близок к размеру строчной буквы "м").При нулевом значении столбцов текстовое поле запрашивает как можно больше места и растягивает весь контейнер.
Поскольку у вас уже есть это в GridBagLayout с заливкой, вы, вероятно, могли бы просто установить для столбцов значение 1 и позволить заливке растянуть его на основе других компонентов или какого-либо другого подходящего малого числа.