Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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 documentlistener-输入后程序停止工作_Java_Swing_Jtextfield_Illegalstateexception_Documentlistener - Fatal编程技术网

Java documentlistener-输入后程序停止工作

Java documentlistener-输入后程序停止工作,java,swing,jtextfield,illegalstateexception,documentlistener,Java,Swing,Jtextfield,Illegalstateexception,Documentlistener,嗨,我的documentlistener有问题。 在我将值插入文本字段后,程序停止工作。该程序应将第一行文本字段与第二行文本字段异或,并将结果放入第三行文本字段 package opa.beta1; import java.awt.BorderLayout; import java.math.BigInteger; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; impor

嗨,我的documentlistener有问题。 在我将值插入文本字段后,程序停止工作。该程序应将第一行文本字段与第二行文本字段异或,并将结果放入第三行文本字段

package opa.beta1;

import java.awt.BorderLayout;
import java.math.BigInteger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class TextFieldEvent {

    JTextField arrayIV[] = new JTextField[8];
    JTextField plaintextArray[] = new JTextField[8];
    JTextField ciphertextArray[] = new JTextField[8];
    JFrame frame = new JFrame("OPA");
    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel();

    public void setJPanel(JTextField array[], JPanel container, String s) {
        for (int i = 0; i < 8; i++) {
            array[i] = new JTextField(s, 4);
            array[i].getDocument().addDocumentListener(new DocumentListener() {
                @Override
                public void insertUpdate(DocumentEvent de) {
                    setCiphertext();
                }

                @Override
                public void removeUpdate(DocumentEvent de) {
                    setCiphertext();
                }

                @Override
                public void changedUpdate(DocumentEvent de) {
                    setCiphertext();
                }
            });
            container.add(array[i]);
        }
    }

    public String setXORText(JTextField textfield1, JTextField textfield2) {
        String okno1, okno2;
        okno1 = textfield1.getText();
        okno2 = textfield2.getText();
        if (okno1.equals("")) {
            return okno2;
        }
        BigInteger pom1 = new BigInteger(okno1, 16);
        if (okno2.equals("")) {
            return okno1;
        }
        BigInteger pom2 = new BigInteger(okno2, 16);
        BigInteger res = pom1.xor(pom2);
        String s = res.toString(16);
        return s;
    }

    public String setXORText(JTextField pole1[], JTextField pole2[], int i) {

        String okno1 = pole1[i].getText();
        String okno2 = pole2[i].getText();
        if (okno1.equals("")) {
            return pole2[i].getText();
        }
        BigInteger pom1 = new BigInteger(okno1, 16);
        if (okno2.equals("")) {
            return pole1[i].getText();
        }
        BigInteger pom2 = new BigInteger(okno2, 16);
        BigInteger res = pom1.xor(pom2);
        String s = res.toString(16);
        return s;
    }

    public void setCiphertext() {
        //textfield3.setText(setXORText(textfield1, textfield2));
        for (int i = 0; i < 8; i++) {
            ciphertextArray[i].setText(setXORText(arrayIV, plaintextArray, i));
        }
    }

    public TextFieldEvent() {
        setJPanel(arrayIV, panel1, "1a");
        setJPanel(plaintextArray, panel2, "1b");
        setJPanel(ciphertextArray, panel3, "1");

        frame.add(panel1, BorderLayout.NORTH);
        frame.add(panel2, BorderLayout.CENTER);
        frame.add(panel3, BorderLayout.SOUTH);

        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        frame.setSize(675, 275);
        frame.setResizable(false);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TextFieldEvent();
            }
        });

    }
}

包装
setCiphertext()在您的DocumentListener中的
SwingUtilities.invokeLater
这一行

setJPanel(ciphertextArray, panel3, "1");
还将
DocumentListener
添加到
ciphertextArray
TextField
的每个元素中。因此,每当密码文本
TextField
s的值发生变化时,就会调用方法
setCipherText()

这将导致以下顺序:

  • 您可以在
    arrayIV
    plaintextary
  • 调用了
    setCipherText()
  • setCipherText()
    更改密码文本的值
    TextField
  • 再次调用
    setCipherText()
    (上面的解释)。回到2
  • 这就是为什么会出现非法状态异常的原因

    因此,解决方案是不要将
    DocumentListener
    添加到
    ciphertextArray
    中的
    TextFields

    解决方案可按如下方式实施:

    public void setJPanel(JTextField array[], JPanel container, String s, boolean docListener) {
        for (int i = 0; i < 8; i++) {
            array[i] = new JTextField(s, 4);
            if (docListener) {
                array[i].getDocument().addDocumentListener(new DocumentListener() {
                    @Override
                    public void insertUpdate(DocumentEvent de) {
                        setCiphertext();
                    }
    
                    @Override
                    public void removeUpdate(DocumentEvent de) {
                        setCiphertext();
                    }
    
                    @Override
                    public void changedUpdate(DocumentEvent de) {
                        setCiphertext();
                    }
                });
            }
            container.add(array[i]);
        }
    }
    
    [...]
    
        setJPanel(arrayIV, panel1, "1a", true);
        setJPanel(plaintextArray, panel2, "1b", true);
        setJPanel(ciphertextArray, panel3, "1", false);
    
    public void setJPanel(JTextField数组[],JPanel容器,字符串s,布尔docListener){
    对于(int i=0;i<8;i++){
    数组[i]=新的JTextField(s,4);
    if(docListener){
    数组[i].getDocument().addDocumentListener(新DocumentListener()){
    @凌驾
    公共作废插入更新(DocumentEvent de){
    setCiphertext();
    }
    @凌驾
    公共作废移除更新(DocumentEvent de){
    setCiphertext();
    }
    @凌驾
    公共作废更改日期(DocumentEvent de){
    setCiphertext();
    }
    });
    }
    container.add(数组[i]);
    }
    }
    [...]
    setJPanel(arrayIV,专题1,“1a”,真实);
    setJPanel(plaintextArray,panel2,“1b”,真);
    setJPanel(ciphertextArray,panel3,“1”,false);
    
    “程序停止工作”-它是否引发任何异常?“停止工作”是什么意思?线程“AWT-EventQueue-0”java.lang.IllegalStateException中的异常:在javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1338)的javax.swing.text.AbstractDocument.replace(AbstractDocument.java:659)的javax.swing.text.JTextComponent.setText中尝试在通知中进行变异(JTextComponent.java:1718)在opa.beta1.TextFieldEvent.setCiphertext(TextFieldEvent.java:82)在opa.beta1.TextFieldEvent$1.removeUpdate(TextFieldEvent.java:33)
    public void setJPanel(JTextField array[], JPanel container, String s, boolean docListener) {
        for (int i = 0; i < 8; i++) {
            array[i] = new JTextField(s, 4);
            if (docListener) {
                array[i].getDocument().addDocumentListener(new DocumentListener() {
                    @Override
                    public void insertUpdate(DocumentEvent de) {
                        setCiphertext();
                    }
    
                    @Override
                    public void removeUpdate(DocumentEvent de) {
                        setCiphertext();
                    }
    
                    @Override
                    public void changedUpdate(DocumentEvent de) {
                        setCiphertext();
                    }
                });
            }
            container.add(array[i]);
        }
    }
    
    [...]
    
        setJPanel(arrayIV, panel1, "1a", true);
        setJPanel(plaintextArray, panel2, "1b", true);
        setJPanel(ciphertextArray, panel3, "1", false);