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

StackOverflow https://stackoverflow.com/questions/128016

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top