下一次输入的Java styleddocument更改属性
我有JTextPane和一个复选框,表示让我们说粗体字体。所以,如果选中复选框,我希望在JTextPane中键入的内容都是粗体。我不想更改JTextPane的整个字体,我只想将下一个字符设置为粗体。我做了这个,它很有效:下一次输入的Java styleddocument更改属性,java,styleddocument,Java,Styleddocument,我有JTextPane和一个复选框,表示让我们说粗体字体。所以,如果选中复选框,我希望在JTextPane中键入的内容都是粗体。我不想更改JTextPane的整个字体,我只想将下一个字符设置为粗体。我做了这个,它很有效: ///framework is JTextPane framework.addKeyListener(new KeyListener() { StyledDocument doc = framework.getStyledDocument();
///framework is JTextPane
framework.addKeyListener(new KeyListener() {
StyledDocument doc = framework.getStyledDocument();
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
if(boldcheck.isSelected()){
StyleContext sc = new StyleContext();
Style ns = sc.addStyle("a", null);
ns.addAttribute(StyleConstants.Bold, new Boolean(true));
try {
String s = Character.toString(e.getKeyChar());
doc.insertString(doc.getLength(),s, ns);
framework.remove(doc.getLength());
} catch (BadLocationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
///// rest of keylistener
但我认为这不是一个好主意
doc.insertString(doc.getLength(),s, ns);
framework.remove(doc.getLength());
我尝试了
doc.setCharacterAttributes(doc.getLength(),1,ns,true)
但它不起作用,如果我使用doc.setCharacterAttributes(doc.getLength()-1,ns,true)
在keyreased
中,它会工作不好,我的意思是a会首先看到我键入的内容,然后我会看到它发生变化,如果我键入快,它不会更改某些字母的属性。那么有人知道更好的方法吗?下面的可运行代码可能适合您的要求。我让你来决定好还是不好。希望它有用
public class TextEditorDemo {
private JTextPane textpane;
private JCheckBox checkbox;
public TextEditorDemo()
{
initGUI();
textpane.getStyledDocument().addDocumentListener(new DocumentListener()
{
@Override
public void changedUpdate(DocumentEvent arg0)
{
}
@Override
public void insertUpdate(DocumentEvent arg0)
{
if(checkbox.isSelected())
{
setBold(arg0);
}
}
@Override
public void removeUpdate(DocumentEvent arg0)
{
}
});
}
private void initGUI()
{
JFrame frame = new JFrame("TextEditorDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
checkbox = new JCheckBox("Bold");
textpane = new JTextPane();
frame.getContentPane().add(checkbox, BorderLayout.NORTH);
frame.getContentPane().add(textpane, BorderLayout.CENTER);
frame.setVisible(true);
}
private void setBold(final DocumentEvent evt)
{
if(evt.getLength() <= 1)
{
Runnable setColor = new Runnable()
{
@Override
public void run()
{
Style style = textpane.addStyle("insert", null);
StyleConstants.setBold(style, true);
textpane.getStyledDocument().setCharacterAttributes(evt.getOffset(), evt.getLength(), style, true);
}
};
SwingUtilities.invokeLater(setColor);
}
}
public static void main(String[] args)
{
TextEditorDemo demo = new TextEditorDemo();
}
}
公共类TextEditorDemo{
私有JTextPane textpane;
私有JCheckBox复选框;
PublicTextEditorDemo()
{
initGUI();
textpane.getStyledDocument().addDocumentListener(新的DocumentListener())
{
@凌驾
public void changedUpdate(DocumentEvent arg0)
{
}
@凌驾
公共作废插入更新(DocumentEvent arg0)
{
if(checkbox.isSelected())
{
退行性变(arg0);
}
}
@凌驾
public void removeUpdate(DocumentEvent arg0)
{
}
});
}
私有void initGUI()
{
JFrame=新JFrame(“TextEditorDemo”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(400300);
复选框=新的JCheckBox(“粗体”);
textpane=新的JTextPane();
frame.getContentPane().add(复选框,BorderLayout.NORTH);
frame.getContentPane().add(textpane,BorderLayout.CENTER);
frame.setVisible(true);
}
私人作废退单(最终文件事件evt)
{
if(evt.getLength()