Я переопределил метод paintComponent расширенного JToggleButton, чтобы можно было использовать заливку TexturePaint для текста при переключении кнопки. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу нарисовать текст, используя тот же шрифт, который мой внешний вид использует по умолчанию. Я пробовал g2d.setFont(this.getFont()); , где «это» — кнопка, с которой я работаю. Шрифт близок, но при рисовании кажется более жирным, чем текст по умолчанию. Есть ли лучший способ нарисовать текст, чтобы он выглядел так же, как по умолчанию, за исключением цвета? Заранее спасибо!
Рисование текста в java, проблемы Look and Feel
Ответы (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. Комментарий также дает предлагаемое решение о том, как нарисовать текст.
Этот вопрос аналогичен и дает ответ: Как получить шрифт по умолчанию для меток 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));