ChangeListener不会更改JTextArea中的字体

时间:2014-10-22 06:45:10

标签: java swing jtextarea jcheckbox changelistener

我正在使用Java(ver1.42)来制作聊天程序

我做了大胆的&斜体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”

字体也永远不会回来 你能找到什么问题吗?

3 个答案:

答案 0 :(得分:2)

首先,您确实必须使用按位|运算符将Bold和Italic一起使用相同的字体,而不是+运算符。

也可能是系统一旦切换到粗体字体,就会使用包含粗体属性的相关字体。例如,在某些操作系统中,您有" 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));
        }           
    }
}

答案 1 :(得分:1)

问题在于每次在侦听器内初始化fontName。将fontName初始化代码仅移出侦听器一次。

尝试以下代码:

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

答案 2 :(得分:0)

谢谢你们,但我找到了回答。

原因是FontName

如果我把它变成BOLD风格

FontName从“dialog”

更改为“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));
        }           
    }