2013-03-04 73 views
0

我有簡單的文本編輯器,它將JAVA關鍵字藍色。這是代碼:JTextPane中的字母延遲着色

class MainPanel extends JPanel { 

    private int WIDTH = 800; 
    private int HEIGHT = 500; 
    private JFrame frame; 
    private JTextPane codePane = new JTextPane(); 
    private StyledDocument doc = codePane.getStyledDocument(); 

    MainPanel(JFrame frame) { 
     this.frame = frame; 
     setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
     setLayout(new BorderLayout()); 
     JScrollPane scroll = new JScrollPane(codePane); 
     add(scroll, BorderLayout.CENTER); 
     codePane.addKeyListener(new MainPanel.KeyHandler()); 
     codePane.setFont(new Font("Monospaced", Font.PLAIN, 15)); 
     //Loading key words.. 
     //... 
    } 

    private class KeyHandler extends KeyAdapter { 

     @Override 
     public void keyTyped(KeyEvent ev) { 
      String code = codePane.getText(); 
      SimpleAttributeSet set = new SimpleAttributeSet(); 
      StyleConstants.setForeground(set, Color.BLACK); 
      doc.setCharacterAttributes(0, code.length(), set, true); 
      //Change keywords color 
      int lastIndex = 0; 
      for (int a = 0; a < words.length; a++) { 
       set = new SimpleAttributeSet(); 
       if (Arrays.asList(keywords).contains(words[a])) { 
        StyleConstants.setForeground(set, Color.BLUE); 
       } 
       doc.setCharacterAttributes(lastIndex, words[a].length(), set, true); 
       lastIndex += words[a].length() + 1; //+1 bo jeszcze spacja po słowie 
      } 
     } 
    } 
} 

我的問題是,文本高亮(在事件的keyTyped)將字母文本區域之前進行。所以,當我輸入:「int」它不會使它變成藍色,但是當我輸入一個更多的字符「int」時將會變成藍色,例如。 「intR」,「int」將變成藍色,R字母變成黑色。如何預防它?一種解決方案是用keyReleased替換keyTyped,但我不能這樣做,因爲我打算做一些事情,而ENTERTAB被按下,我需要使用它們的消費方法,這對keyReleased不起作用。

回答

0

您好我該如何從一個JTextField

import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class FrmPrueba extends JFrame { 

    public FrmPrueba() { 
     setTitle("Prueba de pintado"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(400, 300); 
     setLookAndFeel(); 
     JTextField jTextField = new JTextField(); 
     add(jTextField); 
     jTextField.addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyReleased(KeyEvent e) { 
       System.out.print(e.getKeyChar()); 
      } 
     }); 

     setLocationRelativeTo(null); 


    } 

    private void setLookAndFeel() { 
     try { 
      UIManager.setLookAndFeel(new javax.swing.plaf.nimbus.NimbusLookAndFeel()); 
     } catch (UnsupportedLookAndFeelException e) { 
     } 
    } 

    public static void main(String[] args) { 
     FrmPrueba frmPrueba = new FrmPrueba(); 
     frmPrueba.setVisible(true); 

    } 
} 
2

一個解決方案呼應字符串是的keyReleased

更換的keyTyped不要使用KeyListener的。您應該使用DocumentListener。有關更多信息,請參閱How to Write a Document Listener上的Swing教程部分。

林規劃做一些事情,而ENTER和TAB

您應該使用鍵綁定。查看上面鏈接的目錄,你會在How to Use Key Bindings找到一個部分。