0

我有一个名为fontlist的类,我想使用JTextPane制作下划线字体,但我发现很难做到这一点。粗体或斜体都可以正常工作,但是当我添加下划线代码时,它会给我一些错误。

我的代码是:

    import java.awt.*;
    import java.awt.font.TextAttribute;
    import javax.swing.*;
    import java.awt.event.*;
    import java.util.*;
    import java.io.*;
    import java.text.*;
    import javax.swing.text.*;
    import javax.swing.event.*;
    import javax.swing.plaf.basic.BasicTextPaneUI;


class fontlist extends JFrame implements ItemListener,ActionListener
    { 
        JComboBox jcb,fontSize;
        Container content;
        JTextPane jta;
        JScrollPane jsp;
        JToggleButton bold,italic,underline;
        Font font;
        private static final int[] fontsize = {8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72};
        fontlist()
        {
            content=getContentPane();
            setLayout(null);
            setBackground(Color.WHITE);
            jcb=new JComboBox();
            content.add(jcb);
            jcb.setBounds(100,100,100,20);
            fontSize=new JComboBox();
            content.add(fontSize);
            fontSize.setBounds(200,100,40,20);
            bold=new JToggleButton("B");
            content.add(bold);
            bold.setBounds(240,100,45,22);
            italic=new JToggleButton("I");
            content.add(italic);
            italic.setBounds(285,100,45,22);
            underline=new JToggleButton("U");
            content.add(underline);
            underline.setBounds(330,100,45,22);
            jta=new JTextPane();
            jsp=new JScrollPane(jta);
            content.add(jsp);
            jsp.setBounds(100,120,500,200);
            jcb.addItemListener(this);
            fontSize.addItemListener(this);
            bold.addActionListener(this);
            italic.addActionListener(this);
            underline.addActionListener(this);
            String fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
                for ( int i = 0; i < fonts.length; i++ )
                {
                  jcb.addItem(fonts[i]);
                }
                for ( int j = 0; j <16; j++ )
                {
                  fontSize.addItem(fontsize[j]);
                }
        }
        public void itemStateChanged(ItemEvent ie)
        {
         try
         {
            if (ie.getStateChange() == ItemEvent.SELECTED)
            {
                int size = new Integer(fontSize.getSelectedItem()+"");
                font = new Font(jcb.getSelectedItem().toString(),Font.PLAIN,size);
                jta.setFont(font);

            }
         }
         catch(NumberFormatException e){}
        }
        public void actionPerformed(ActionEvent ae)
        {

           int size = new Integer(fontSize.getSelectedItem()+"");
            if (bold.isSelected() && italic.isSelected() && underline.isSelected() )
            {

                    font = new Font(jcb.getSelectedItem().toString(),Font.BOLD+Font.ITALIC,size);
                    jta.setFont(font);
             }
            else if(bold.isSelected() && italic.isSelected())
            {
             font = new Font(jcb.getSelectedItem().toString(),Font.BOLD+Font.ITALIC,size);
              jta.setFont(font);
            }
            else if(bold.isSelected())
            {
                font = new Font(jcb.getSelectedItem().toString(),Font.BOLD,size);
              jta.setFont(font);
            }
            else if(italic.isSelected())
            {
                font = new Font(jcb.getSelectedItem().toString(),Font.ITALIC,size);
                jta.setFont(font);
            }
            else if(underline.isSelected())
            {
                 font = new Font(jcb.getSelectedItem().toString(),Font.UNDERLINE,size);
                jta.setFont(font);
            }
            else
            {
              font = new Font(jcb.getSelectedItem().toString(),Font.PLAIN,size);
              jta.setFont(font);
            }
        }
        public static void main(String args[])
        {
            fontlist fl=new fontlist();
            fl.setSize(700,500);
            fl.setVisible(true);
        }
    }
4

2 回答 2

4

由于您使用的是 JTextPane,因此您应该使用SimpleAttributeSet

SimpleAttributeSet attributeSet = new SimpleAttributeSet();
StyleConstants.setUnderline(attributeSet, true);
jta.getStyledDocument().setCharacterAttributes(0, jta.getText().length(),
    attributeSet, false); 

切换 U 按钮时,您必须将下划线样式设置为 false。

于 2013-10-16T21:24:41.160 回答
2

当您使用 JTextPane 时,您通常会将文本块设置为特定的字体,而不是整个文本窗格。也就是说,它通常会像 Word 这样的文本编辑器一样工作。

阅读 Swing 教程中有关文本组件功能的部分,以获取一个工作示例,该示例向您展示如何使用 StyledEditorKit 操作为您执行此操作。

如果您的目标是只能更改整个文本组件的字体,那么您应该使用 JTextArea,因为它是一个更简单的组件。在这种情况下,没有可以设置的 Font.UNDERLINE 属性。要创建带下划线的字体,您需要如下代码:

Font font = textArea.getFont();
Map<TextAttribute, Object> map = new HashMap<TextAttribute, Object>();
map.put(TextAttribute.FONT, font);
map.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
font = Font.getFont(map);
textArea.setFont(font);
于 2013-10-17T03:33:53.090 回答