I am trying to create a Swing panel whose elements have a different font size than the rest of the swing application. Initially, u开发者_如何学运维sing 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:
- it doesn't include certain swing elements like its border.
- I have to call this function when I add other components dynamically
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.
精彩评论