Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTextPane中的字母在延迟后上色_Java_Swing_Keylistener_Jtextpane - Fatal编程技术网

Java JTextPane中的字母在延迟后上色

Java JTextPane中的字母在延迟后上色,java,swing,keylistener,jtextpane,Java,Swing,Keylistener,Jtextpane,我有一个简单的文本编辑器,它把JAVA关键字涂成蓝色。代码如下: class MainPanel extends JPanel { private int WIDTH = 800; private int HEIGHT = 500; private JFrame frame; private JTextPane codePane = new JTextPane(); private StyledDocument doc = codePane.getSty

我有一个简单的文本编辑器,它把JAVA关键字涂成蓝色。代码如下:

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
            }
        }
    }
}
class主面板扩展了JPanel{
私有整数宽度=800;
私人室内高度=500;
私有JFrame;
私有JTextPane codePane=新JTextPane();
私有StyledDocument doc=codePane.getStyledDocument();
主面板(JFrame){
this.frame=frame;
setPreferredSize(新尺寸(宽度、高度));
setLayout(新的BorderLayout());
JScrollPane scroll=新的JScrollPane(代码窗格);
添加(滚动、边框布局、居中);
addKeyListener(新的MainPanel.KeyHandler());
setFont(新字体(“等距”,Font.PLAIN,15));
//正在加载关键字。。
//...
}
私有类KeyHandler扩展了KeyAdapter{
@凌驾
public void keyTyped(KeyEvent ev){
String code=codePane.getText();
SimpleAttributeSet=新的SimpleAttributeSet();
setForeground(set,Color.BLACK);
doc.setCharacterAttributes(0,code.length(),set,true);
//更改关键字颜色
int lastIndex=0;
for(int a=0;a

我的问题是,文本突出显示(在键入事件中)发生在将字母放入文本区域之前。所以当我输入:“int”时,它不会把它涂成蓝色,但当我再输入一个字符时,“int”将被涂成蓝色,例如“intR”,“int”将被涂成蓝色,R字母将被涂成黑色。如何预防?一种解决方案是将keyTyped替换为keyReleased,但我不能这样做,因为我计划在按下ENTER和TAB时做一些事情,并且我需要对它们使用consume方法,这在keyReleased上不起作用。

您好,这是从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);

    }
}
一种解决方案是将keyTyped替换为keyReleased

不要使用KeyListener。您应该使用DocumentListener。有关详细信息,请参见上的Swing教程部分

我计划在输入和制表符的同时做一些事情

您应该使用键绑定。查看上面链接中的目录,您将找到一个关于
如何使用键绑定的部分