Passing font to components on a JPanel

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-10 15:19:34

问题


I have a class that extends JPanel with several buttons on it. I would like to be able to set the font on all the buttons with one call to setFont(Font font); I defined the setFont method in the JPanel class as such:

public class MyPanel extends JPanel {
    private JButton[] buttons = new JButton[10];

    public MyPanel() {
        for(int i = 0; i < 10; i++) {
            buttons[i] = new JButton(""+i);
            this.add(buttons[i]);
        }
    }

    public void setFont(Font font) {
        if(buttons != null) {
            for(JButton b : buttons) {
                b.setFont(font);
            }
        }
    }
}

However, the font on the button never changes. I understand that setFont is called by the JPanel constructor, but I don't understand why, when I call it clearly AFTER the MyPanel object is created, the fonts aren't passed on to the buttons.

Thanks everyone!

Brent


回答1:


If you want all subsequent buttons in the application to use a different font, you can set the default before instantiating the panel:

UIManager.put("Button.font", new FontUIResource("Dialog", Font.BOLD, 24));

Addendum: A more focused approach might be to add instances of an extended JButton in your panel's constructor:

buttons[i] = new MyButton(String.valueOf(i));
this.add(buttons[i]);

The new buttons would always have the same font:

private static class MyButton extends JButton {

    private static final Font font = new Font("Dialog", Font.BOLD, 24);

    public MyButton(String text) {
        super(text);
        this.setFont(font);
    }
}



回答2:


Don't know if you will find it any easier but you can also use:

button.setFont(null);

for each of the buttons. Then when you want to change the font you can do:

panel.setFont(...);

and the buttons will inherit the font from the panel. I would guess you then need to invoke the repaint() method on the panel.




回答3:


I believe trying the "repaint" method on each of the buttons should work.




回答4:


If it is a repainting issue, minimize and re-open the gui to see if repaint fixes the problem. If not, you'll find that something is setting the font on the button after you are. Proabaly the best way to diagnose this is to create a subclass of JButton (temporarily) and use that to debug calls to setFont() - you'll be able to check the stack trace to see what is calling.

So,

  1. switch to one button to simplify: private JButton[] buttons = new JButton[10];
  2. change buttons[i] = new JButton(""+i); to buttons[i] = new MyJButton(""+i);
  3. create MyJButton: class MyJButton extends JButton { @override public void setFont(Font f) { super.setFont(f); // breakpoint this line and see who's calling } }
  4. Once you have found whether there's a later setter, decide how to fix. You could invokeLater() or better still find a logical point (Post construction) to alter the font.

Hope that helps



来源:https://stackoverflow.com/questions/3445495/passing-font-to-components-on-a-jpanel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!