Изменение размера шрифта JPanel и всех его элементов
Я пытаюсь создать панель Swing, элементы которой имеют другой размер шрифта, чем остальная часть приложения swing. Первоначально, используя setFont
для пары компонентов не было никаких проблем. Теперь у меня есть несколько компонентов (и их компонентами), поэтому такое решение нецелесообразно.
Я искал об изменении свойств пользовательского интерфейса по умолчанию компонентов swing. То, что я нашел, в основном использует UIManager, который изменяет свойства глобально. Это не работайте для меня, потому что я хочу сохранить текущие настройки шрифта для всех других панелей.
на данный момент (и так как я не люблю публиковать, не пробуя что-то сначала), у меня есть такой алгоритм:
public static void fixFont(Container c) {
c.setFont(c.getFont().deriveFont(10.0f));
Component[] comp = c.getComponents();
for (int i=0;i<comp.length;++i) {
if (comp[i] instanceof Container) {
fixFont((Container) comp[i]);
} else {
comp[i].setFont(comp[i].getFont().deriveFont(10.0f));
}
}
}
проблема в том, что:
- он не включает определенные элементы swing, такие как его граница.
- Я должен вызвать эту функцию, когда я добавляю другие компоненты динамически
вопрос: Is есть ли другой способ изменить свойства шрифта панели Swing и всех ее компонентов, элементов и т. д. (т. е. все в панели) ?
Спасибо за ваши идеи
2 ответов
вы можете использовать этот трюк:
import java.awt.*;
public class FrameTest {
public static void setUIFont(FontUIResource f) {
Enumeration keys = UIManager.getDefaults().keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
Object value = UIManager.get(key);
if (value instanceof FontUIResource) {
FontUIResource orig = (FontUIResource) value;
Font font = new Font(f.getFontName(), orig.getStyle(), f.getSize());
UIManager.put(key, new FontUIResource(font));
}
}
}
public static void main(String[] args) throws InterruptedException {
setUIFont(new FontUIResource(new Font("Arial", 0, 20)));
JFrame f = new JFrame("Demo");
f.getContentPane().setLayout(new BorderLayout());
JPanel p = new JPanel();
p.add(new JLabel("hello"));
p.setBorder(BorderFactory.createTitledBorder("Test Title"));
f.add(p);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300);
f.setVisible(true);
}
}
выдает:
можно переопределить add
метод на базовом компоненте и применить шрифт к добавленным компонентам и их дочерним там. это сэкономит вам применение шрифта вручную, когда компоненты будут добавлены позже.