Рисование текста в java, проблемы Look and Feel

Я переопределил метод paintComponent расширенного JToggleButton, чтобы можно было использовать заливку TexturePaint для текста при переключении кнопки. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу нарисовать текст, используя тот же шрифт, который мой внешний вид использует по умолчанию. Я пробовал g2d.setFont(this.getFont()); , где «это» — кнопка, с которой я работаю. Шрифт близок, но при рисовании кажется более жирным, чем текст по умолчанию. Есть ли лучший способ нарисовать текст, чтобы он выглядел так же, как по умолчанию, за исключением цвета? Заранее спасибо!


person bendicott    schedule 16.11.2011    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 17.11.2011


Ответы (2)


Если вы переопределяете метод paintComponent(), то объект Graphics уже должен быть настроен так, чтобы иметь шрифт кнопки-переключателя. Разница, вероятно, из-за сглаживания, которое по умолчанию не включено.

Я нашел некоторый код, который работает для меня в очень ограниченном тестировании. Попробуйте следующее в методе paintComponent():

Graphics2D g2 = (Graphics2D)g.create();
Toolkit toolkit = Toolkit.getDefaultToolkit();
Map map = (Map)(toolkit.getDesktopProperty("awt.font.desktophints"));

if (map != null)
{
    g2.addRenderingHints(map);
}

g2.drawString(...);
g2.dispose();

В этом сообщении меня предупредили: Как установить текст над и под значком JButton? - что это не будет работать на всех платформах и LAF. Комментарий также дает предлагаемое решение о том, как нарисовать текст.

person camickr    schedule 16.11.2011
comment
Как мне нарисовать JLabel в BufferedImage (как предложила Клеопатра в вашем связанном посте)? - person bendicott; 17.11.2011
comment
Вы можете использовать класс Screen Image. Просто интересно, вы пробовали код, который я предложил? У вас возникла проблема? - person camickr; 17.11.2011
comment
Нашел ошибку в моем коде; код, который вы разместили, действительно работает! Теперь мне просто нужно правильно расположить текст, и все готово. Спасибо за помощь! - person bendicott; 17.11.2011
comment
... и я получил текст там, где он должен быть. Еще раз спасибо! - person bendicott; 17.11.2011
comment
Какой LAF и платформу вы используете? Я хочу отслеживать, когда этот код работает, а когда нет. Кроме того, вы увеличили нарисованный текст, чтобы убедиться, что он точно такой же? - person camickr; 17.11.2011
comment
Metal LaF на windows 7, 64 бит. Да, текст полностью совпадает. - person bendicott; 18.11.2011
comment
Спасибо, я тестировал его только на Windows XP, используя Metal и Windows LAF. Я надеялся, что вы используете другой LAF или платформу :) - person camickr; 18.11.2011

Этот вопрос аналогичен и дает ответ: Как получить шрифт по умолчанию для меток Swing JTabbedPane?< /а>

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

UIManager.getLookAndFeelDefaults().getFont("ToggleButton.font");

ИЗМЕНИТЬ

Это не фрагмент из связанного вопроса, но после небольшого тестирования он кажется эквивалентным:

UIManager.getDefaults().getFont("ToggleButton.font");

который является кодом, указанным в связанном вопросе.

ИЗМЕНИТЬ 2

Думаю, я нашел решение. По умолчанию возвращается простой шрифт, я обошел это в примере со строкой:

this.setFont(UIManager.getDefaults().getFont("ToggleButton.font").deriveFont(this.getFont().getStyle(), this.getFont().getSize()));

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

fontStyle = this.getFont().getStyle();
fontSize = this.getFont().getSize();

И тогда вы можете очистить с помощью:

this.setFont(UIManager.getDefaults().getFont("ToggleButton.font").deriveFont(this.fontStyle, this.fontSize));
person Brandon Buck    schedule 16.11.2011
comment
Все еще смелее, чем другие кнопки, к сожалению - person bendicott; 16.11.2011
comment
@bendicott Используете ли вы металл в качестве внешнего вида для этого проекта? - person Brandon Buck; 16.11.2011
comment
да, но я не уверен, что всегда будет LaF. Я также пробовал g2d.setFont(MetalLookAndFeel.getControlTextFont()); , но улучшения нет. - person bendicott; 16.11.2011
comment
@bendicott Если у вас не всегда будет MetalLaF, в любом случае нет причин называть его так явно. - person Brandon Buck; 16.11.2011
comment
@bendicott Проверьте мое второе редактирование, это должно решить вашу проблему. - person Brandon Buck; 16.11.2011
comment
Все еще получаю те же результаты - person bendicott; 17.11.2011
comment
@bendicott Это все, что я могу предложить, не видя того, что вы делаете. - person Brandon Buck; 17.11.2011