Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change font size of a JPanel and all its elements

Tags:

java

swing

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:

  • 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

like image 977
YuppieNetworking Avatar asked Jun 07 '10 11:06

YuppieNetworking


2 Answers

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:

enter image description here

like image 183
aioobe Avatar answered Oct 13 '22 06:10

aioobe


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.

like image 26
pstanton Avatar answered Oct 13 '22 05:10

pstanton