我有一个名为 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);
}
}
答案 0 :(得分:4)
由于您使用的是JTextPane,因此您应该使用SimpleAttributeSet:
SimpleAttributeSet attributeSet = new SimpleAttributeSet();
StyleConstants.setUnderline(attributeSet, true);
jta.getStyledDocument().setCharacterAttributes(0, jta.getText().length(),
attributeSet, false);
当切换U按钮时,您必须将下划线样式设置为false。
答案 1 :(得分:2)
使用JTextPane时,通常会将文本块设置为特定的Font,而不是整个文本窗格。也就是说,它通常像文字编辑器一样工作。
阅读Text Component Features上Swing教程中的部分,了解一个工作示例,该示例向您展示如何使用StyledEditorKit操作为您执行此操作。
如果您的目标是只能更改整个文本组件的Font,那么您应该使用JTextArea,因为它是一个更简单的组件。在这种情况下,您可以设置Font.UNDERLINE属性。要创建带下划线的Font,您需要以下代码:
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);