Автоматична промяна на размера на шрифта в Swing компонент с увеличаване на дължината на низа

Имам JTextField, който показва номер на ред като този: 2 или 2.1 или 2.1.1 и т.н. Бих искал размерът на JTextField винаги да остава същият, но искам размерът на шрифта да намалява/увеличава, така че текстът винаги да е се показва напълно и запълва текстовото поле.

Чудя се дали има лесен начин да направя това (нямам нищо против да използвам различен компонент за люлеене) или ще трябва да го направя ръчно, т.е. като проверя размера на текста и променя размера на текстовото поле?

Очевидно бих предпочел да не го правя по този начин, тъй като увеличението на размера може да не е хубаво число, от което да отидете, напр. 2.1 до 2.1.1.


person mmgro27    schedule 21.07.2015    source източник
comment
Не би било трудно да се настрои предварително изчислена (таблица!) функция, определяща размера на шрифта за дадена дължина на полето, така че да може да се приеме комбинация от цифри и точки. AFAIK, цифрите имат еднаква ширина във всички шрифтове.   -  person laune    schedule 21.07.2015
comment
@laune това е напълно невярно и произволно. Въпреки че много шрифтове ще имат еднаква ширина за всички цифри, някои шрифтове имат различна ширина за цифри и няма правило, че всички цифри на един шрифт трябва да имат еднаква ширина (същото важи за всеки глиф от всеки шрифт). Цифрата '1' в Comic Sans MS е много по-тясна от другите цифри, например   -  person Guillaume Polet    schedule 24.07.2015
comment
@GuillaumePolet Шрифтовете, които нямат еднаква ширина за всички цифри, не са полезни за показване на числови таблици и рядко се използват за вида работа на дисплея, с който OP изглежда е свързан. Но благодаря за подсказката - квалифицирам твърдението си, че някои комични шрифтове не позволяват този подход. (BTW, не знаех, че OP не знае за stringWidth, което бих предложил на първо място.)   -  person laune    schedule 25.07.2015


Отговори (2)


Не знам някой компонент да изпълнява това, но можете да го напишете сами, като разширите jTextField и използвате FontMetrics.stringWidth() за определяне на размера на шрифта (напр. при претоварен setText).

person lopisan    schedule 21.07.2015
comment
Не е ли това, което OP предпочита да не прави? - person laune; 21.07.2015
comment
Така е, но просто исках да предположа, че не е трудна задача, така че може да е по-бързо да го напишете, отколкото да го търсите. - person lopisan; 21.07.2015
comment
Благодаря, това всъщност прави нещата много по-лесни и писането на метода ще бъде доста просто. - person mmgro27; 21.07.2015
comment
Замяната на setText изглежда доста крехка. Добавянето на DocumentListener към Document на текстовото поле би било много по-стабилно и подходящо. - person Guillaume Polet; 24.07.2015

JTextField става по-малък с намаляването на шрифта.

Предпочитаният размер на текстовото поле зависи от шрифта. Така размерът ще се увеличава/намалява с промяната на размера на шрифта. Заменете метода getPreferredSize() на JTextField, за да предоставите свое собствено внедряване.

Може би нещо като:

Font current = getFont();
setFont( UIManager.getFont("TextField.font") );
Dimension preferred = super.getPreferredSize();
setFont( current );
return preferred;
person camickr    schedule 21.07.2015