将字体传递给JPanel上的组件

时间:2010-08-10 01:54:59

标签: java swing fonts jpanel

我有一个扩展JPanel的类,上面有几个按钮。我希望能够通过调用setFont(Font字体)在所有按钮上设置字体;我在JPanel类中定义了setFont方法:

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);
            }
        }
    }
}

但是,按钮上的字体永远不会改变。我知道setFont是由JPanel构造函数调用的,但我不明白为什么,当我在创建MyPanel对象后清楚地调用它时,字体不会传递给按钮。

谢谢大家!

布伦特

4 个答案:

答案 0 :(得分:3)

如果您希望应用程序中的所有后续按钮使用不同的字体,您可以在实例化面板之前设置默认值:

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

附录:更集中的方法可能是在面板的构造函数中添加扩展JButton的实例:

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

新按钮的字体始终相同:

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);
    }
}

答案 1 :(得分:2)

不知道你是否会更容易找到它,但你也可以使用:

button.setFont(null);

为每个按钮。然后,当您想要更改字体时,您可以执行以下操作:

panel.setFont(...);

按钮将从面板继承字体。我猜你需要在面板上调用repaint()方法。

答案 2 :(得分:1)

我相信在每个按钮上尝试“重绘”方法应该有效。

答案 3 :(得分:1)

如果是重新绘制问题,请最小化并重新打开gui以查看重绘是否解决了问题。如果没有,你会发现有些东西在你之后设置了按钮上的字体。 Proabaly诊断这个的最好方法是创建JButton的子类(暂时)并使用它来调试对setFont()的调用 - 你将能够检查堆栈跟踪以查看正在调用的内容。

所以,

  1. 切换到一个按钮以简化:private JButton[] buttons = new JButton[10];
  2. buttons[i] = new JButton(""+i);更改为buttons[i] = new MyJButton(""+i);
  3. 创建MyJButton: 类MyJButton扩展JButton {   @override   public void setFont(Font f){     super.setFont(F); //断点这一行,看看谁在打电话   } }
  4. 一旦你发现是否有后来的制定者,就决定如何解决。你可以invokeLater()或者更好地找到一个逻辑点(Post构造)来改变字体。
  5. 希望有所帮助