Передача шрифта компонентам на JPanel - PullRequest
4 голосов
/ 10 августа 2010

У меня есть класс, который расширяет JPanel несколькими кнопками. Я хотел бы иметь возможность установить шрифт для всех кнопок одним вызовом setFont (шрифт Font); Я определил метод setFont в классе JPanel следующим образом:

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, шрифты не передаются кнопкам.

Спасибо всем!

Brent

Ответы [ 4 ]

3 голосов
/ 10 августа 2010

Если вы хотите, чтобы все последующие кнопки в приложении использовали другой шрифт, вы можете установить значение по умолчанию перед созданием экземпляра панели:

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);
    }
}
2 голосов
/ 10 августа 2010

Не знаю, найдете ли вы это проще, но вы также можете использовать:

button.setFont(null);

для каждой кнопки. Затем, когда вы хотите изменить шрифт, вы можете сделать:

panel.setFont(...);

и кнопки будут наследовать шрифт с панели. Я думаю, что вам нужно вызвать метод repaint () на панели.

1 голос
/ 10 августа 2010

Если это проблема перекраски, сверните и снова откройте графический интерфейс, чтобы увидеть, если перекраска решит проблему.Если нет, вы обнаружите, что что-то настраивает шрифт на кнопке после вас.Proabaly лучший способ диагностировать это - создать подкласс JButton (временно) и использовать его для отладки вызовов setFont () - вы сможете проверить трассировку стека, чтобы увидеть, что вызывается.

Итак,

  1. переключитесь на одну кнопку, чтобы упростить: private JButton[] buttons = new JButton[10];
  2. изменить buttons[i] = new JButton(""+i); на buttons[i] = new MyJButton(""+i);
  3. создать MyJButton: класс MyJButton extends JButton {@переопределить public void setFont (Font f) {super.setFont (f);// остановите эту строку и посмотрите, кто звонит}}
  4. Как только вы выяснили, есть ли более поздний установщик, решите, как исправить.Вы могли бы вызватьLater () или, что еще лучше, найти логическую точку (Постостроение) для изменения шрифта.

Надеюсь, что это поможет

1 голос
/ 10 августа 2010

Я полагаю, что попытка "перекрасить" метод на каждой из кнопок должна работать.

...