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