2014-10-22 4 views
0

Я использую Java (ver1.42) AWT для создания болтая программыChangeListener не меняет шрифт в JTextArea

я сделал смелое & Курсив JCheckBox изменить шрифт в JTextArea.

Это слушатель для 2 CheckBoxes.

class CheckBoxListener implements ChangeListener { 
     public void stateChanged(ChangeEvent ce) { 
      String fontName = inputTextArea.getFont().getFontName(); 
      int fontSize = inputTextArea.getFont().getSize(); 
      int fontStyle = 0; 

      if(boldCheckBox.isSelected()) 
       fontStyle += Font.BOLD; 

      if(italicCheckBox.isSelected()) 
       fontStyle += Font.ITALIC; 

      inputTextArea.setFont(new Font(fontName, fontStyle, fontSize)); 
     }   
    } 
} 

Все работает хорошо Если я проверяю "boldCheckBox", шрифт в inputTextArea изменений в BOLD.
Если я проверил «italicCheckBox», шрифт в inputTextArea изменится на ITALIC.
И
Если я отменил проверку «italicCheckBox», шрифт изменится на обычную.

ОДНАКО

шрифт никогда не возвращается, даже если я не-галочка «boldCheckBox»

могли бы вы найти то, что случилось?

+0

Рассмотрите возможность предоставления [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это приведет к меньшему путанице и лучшим ответам. Вы также должны рассмотреть возможность использования 'Font # deriveFont', но это только я ... – MadProgrammer

+1

Из памяти я думаю, что это должно быть' fontStyle | = Font.BOLD', а не '+ =' ... – MadProgrammer

+0

'+' также работает хорошо для меня. – Braj

ответ

2

Во-первых, вам действительно нужно использовать побитовый оператор |, чтобы получить полужирный и курсив вместе в том же шрифте, а не в операторе +.

Также может случиться так, что система, как только вы переключились на жирный шрифт, использует родственный шрифт, который включает жирный атрибут. Например, в некоторых операционных системах у вас есть «Arial» и «ArialBD». Поскольку вы создаете свой новый шрифт на основе имени старого шрифта, а не с помощью deriveFont, возможно, он остается «ArialBD».

Так попробуйте это:

class CheckBoxListener implements ChangeListener { 
     public void stateChanged(ChangeEvent ce) { 

      int fontStyle = Font.PLAIN; 

      if(boldCheckBox.isSelected()) 
       fontStyle |= Font.BOLD; 

      if(italicCheckBox.isSelected()) 
       fontStyle |= Font.ITALIC; 

      inputTextArea.setFont(inputTextArea.getFont().deriveFont(fontStyle)); 
     }   
    } 
} 
+0

Вторая моя ошибка, я ее отредактировал. –

+0

OK. Я отредактировал и добавил еще одну возможность. – RealSkeptic

1

Проблема была с инициализацией fontName каждый раз, когда внутри слушателя. Переместите код инициализации fontName за пределы прослушивателя только один раз.

Try ниже код:

final String fontName = inputTextArea.getFont().getFontName(); 
    final int fontSize = inputTextArea.getFont().getSize(); 
    class CheckBoxListener implements ChangeListener { 
     public void stateChanged(ChangeEvent ce) { 
      int fontStyle = 0; 
      if (boldCheckBox.isSelected() && italicCheckBox.isSelected()) 
       fontStyle = Font.BOLD | Font.ITALIC; 
      else if (boldCheckBox.isSelected()) 
       fontStyle = Font.BOLD; 
      else if (italicCheckBox.isSelected()) 
       fontStyle = Font.ITALIC; 
      else 
       fontStyle = Font.PLAIN; 
      inputTextArea.setFont(new Font(fontName, fontStyle, fontSize)); 
     } 
    } 
0

Спасибо, ребята, но я нашел ответ.

Причина была FontName

если превратить его в BOLD стиле

FontName изменяется в "dialog.bold" из "диалога"

так, даже если я удалить жирный стиль, шрифт остается полужирный стиль, потому что FontName является "dialog.bold"

вот мой ответ

class CheckBoxListener implements ChangeListener { 
     public void stateChanged(ChangeEvent ce) { 
      int fontSize = inputTextArea.getFont().getSize(); 
      int fontStyle = 0; 

      if(boldCheckBox.isSelected()) 
       fontStyle += Font.BOLD; 

      if(italicCheckBox.isSelected()) 
       fontStyle += Font.ITALIC; 

      inputTextArea.setFont(new Font("dialog", fontStyle, fontSize)); 
     }   
    } 

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

  • Нет связанных вопросов^_^