I am trying to create a Swing panel whose elements have a different font size than the rest of the swing application. Initially, using setFont
for a couple of components didn't pose any problems. Now I have several components (and all their subcomponents), so this solution is impractical.
I have searched about changing the default UI properties of swing components. What I have found is mostly using the UIManager, which changes the properties globally. This doesn't work for me because I want to keep the current font settings for all the other panels.
For the moment (and since I don't like to post without trying something out first), I have an algorithm like this:
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));
}
}
}
The problem is that:
Question: Is there another way to change the font properties of a Swing panel and all its components, elements, etc (i.e. everything in the panel) ?
Thanks for your ideas
You could use this trick:
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);
}
}
Produces:
you could override the add
method on your base component and apply the font to the added components and their children there. this would save you applying the font manually when components are added later.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With