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

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

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

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

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

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
9
0
40 304
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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

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

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

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

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

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

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

davetron5000 24.09.2008 21:24

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

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

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

Я рекомендую этот подход при использовании FlowLayout.

sworisbreathing 19.11.2011 03:20

Другие вопросы по теме