2010-08-10 3 views
4

У меня есть класс, который расширяет JPanel с несколькими кнопками на нем. Я хотел бы иметь возможность установить шрифт на всех кнопках одним вызовом setFont (шрифт шрифта); Я определил метод SetFont в классе JPanel как таковой:Передача шрифта компонентам на 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

+0

Если вам нужна дополнительная помощь, опубликуйте свой SSCCE (http://sscce.org) – camickr

ответ

3

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

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

Добавление: A более целенаправленный подход может заключаться в добавлении экземпляров расширенного 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); 
    } 
} 
+0

Мне это нравится. Это не совсем то решение, которое я ищу, но это очень полезно. Большое спасибо! –

1

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

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 общественного недействительными SetFont (Font е) { super.setFont (f); // остановите эту строку и посмотрите, кто звонит } }
  4. Как только вы обнаружили, есть ли более поздний сеттер, решите, как исправить. Вы можете invokeLater() или лучше найти логическую точку (Post construction), чтобы изменить шрифт.

Надежда, что помогает

+0

Я добавил этот комментарий к другому ответу, а также, но я подумал, что здесь уместно. - Сначала я построю gui, и последнее, что я делаю, это вызов setVisible (true). Я действительно думаю, что это может быть вызов setVisible, который переопределяет шрифт, который я устанавливаю. Когда я добавляю новый метод Throwable() printStackTrace() к методу setFont, я вижу три трассировки стека. Один из конструктора JPanel, затем один из тех случаев, когда я явно вызываю setFont, и третий с стеком, который ТОЧНО, как первый вызов конструктора. Я думаю, но не уверен, что это от первоначального чертежа JPanel –

2

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

button.setFont(null); 

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

panel.setFont(...); 

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

+0

Я этого не знал! Выполнено раньше, 'repaint()' из-за 'setVisible()' работает. – trashgod

+0

Да, если вы создаете графический интерфейс перед выполнением setVisible(), вам не нужно делать ничего особенного. Предложение repaint() было на тот случай, если вам необходимо динамически изменить шрифт. – camickr

+0

Сначала я создаю gui, и последнее, что я делаю, это call setVisible (true). Я действительно думаю, что это может быть вызов setVisible, который переопределяет шрифт, который я устанавливаю. Когда я добавляю новый метод Throwable() printStackTrace() к методу setFont, я вижу три трассировки стека. Один из конструктора JPanel, затем один из тех случаев, когда я явно вызываю setFont, и третий с стеком, который ТОЧНО, как первый вызов конструктора. Я думаю, но не уверен, что это из первоначального рисунка JPanel. –

Смежные вопросы