2014-06-06 38 views
0

我有JTextPane和复选框表示可以说粗体字体。所以如果复选框被选中,我想要我在JTextPane中输入的任何内容都是粗体。我不想为JTextPane更改整个字体,我只是想将下一个字符设置为粗体。我做了这一点,它的工作原理:Java样式文档更改属性为下一个输入

///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)但它不会工作,如果我在keyReleaseddoc.setCharacterAttributes(doc.getLength()-1,1, ns, true)它将工作得很糟糕,我的意思是一个会首先看到我输入的内容,然后我会看到它的链接,如果我输入的速度很快,它不会更改某些字母的属性。那么有谁知道更好的方法来做到这一点?

回答

0

以下可运行代码可能适合您的要求。我把它留给你决定是否更好。希望它是有用的。

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