Java, Swing: как установить максимальную ширину JTextField? - PullRequest
9 голосов
/ 24 сентября 2008

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

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

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

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

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

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

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

Ответы [ 3 ]

13 голосов
/ 24 сентября 2008

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

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

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

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

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

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

3 голосов
/ 25 сентября 2008

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

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

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

3 голосов
/ 24 сентября 2008

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

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

...