Java JTextPane或JTextField中的文本已更改(未更改)

Java JTextPane或JTextField中的文本已更改(未更改),java,swing,jtextfield,jtextarea,textchanged,Java,Swing,Jtextfield,Jtextarea,Textchanged,好的,我有一个非常具体的问题。我有一个带有JTextField和JTextPane的面板(实际上是2个JTextPane,但我只有一个活动的),当用户编辑完文本时,需要一个事件来更新调用方表单中的相对变量 JTextPane是用StyledDocument设置的,因此,我不能每次按键都更新它的变量,因此使用DocumentListener是不可行的 使用FocusListener也不是一个解决方案,因为变量(耦合)是使用JList组件选择的,它在更改FocusLost之前更改了引用。简而言之,其

好的,我有一个非常具体的问题。我有一个带有JTextField和JTextPane的面板(实际上是2个JTextPane,但我只有一个活动的),当用户编辑完文本时,需要一个事件来更新调用方表单中的相对变量

JTextPane是用StyledDocument设置的,因此,我不能每次按键都更新它的变量,因此使用DocumentListener是不可行的

使用FocusListener也不是一个解决方案,因为变量(耦合)是使用JList组件选择的,它在更改FocusLost之前更改了引用。简而言之,其他组件与变量实例相互干扰

这就是我解决问题的方法

首先,我创建了一个
输入验证程序

InputVerifier myInputVerifier=新的InputVerifier(){
@凌驾
公共布尔验证(JComponent输入){
if((输入JTextField源的instanceof)&&source==tfKeywords){
PropertyChangeEvent evt=新的PropertyChangeEvent(源,“关键字”,source.getText(),null);
对于(PropertyChangeListener l:pnlEditorFull.this.getPropertyChangeListeners())
l、 财产变动(evt);
}else if(输入JTextPane source的instanceof&&source==ActualEditor){
PropertyChangeEvent evt=新的PropertyChangeEvent(源,“描述”,source.getText(),null);
对于(PropertyChangeListener l:pnlEditorFull.this.getPropertyChangeListeners())
l、 财产变动(evt);
}
返回true;
}
};
当询问验证器时,它将触发一个事件propertyChange,作为JTextField的“关键字”或JTextArea的“描述”

另一方面,我有一个
PropertyListener

pnlEditor.addPropertyChangeListener((PropertyChangeEvent evt)->{
if(“关键字”.equals(evt.getPropertyName()))
myKeywords=EditorPane.getKeywords();//实际上有点复杂
else if(“Description”.equals(evt.getPropertyName()))
myDescription=EditorPane.getText();//实际上有点复杂
});
要检索文本,我使用面板上名为
getText()
的函数:

公共字符串getText(){
StringWriter sw=新的StringWriter();
试一试{
实际编辑器写入(sw);
}捕获(IOEX异常){
LOGGER.log(Level.SEVERE,null,ex);
}
返回sw.toString();
}
使用
ActualEditor.write(sw)是必需的,因为我需要检索文本和格式

成功了。它在FocusLost和JList更改其所选项目之前激发。当然,我可以在选择更改时使用JList ListSelectionListener设置更改(我最初这样做了),但这会留下一个不确定窗口,如果其他组件出错,我很可能会丢失所有更改或更改错误的变量。它需要在更改是最终的时候调用(而不是在更改发生的时候),这是我唯一能想到的解决方案

下面是它应该如何工作的简化示例(还包括JList):

import java.beans.PropertyChangeEvent;
导入java.beans.PropertyChangeListener;
导入java.io.IOException;
导入java.io.StringReader;
导入java.io.StringWriter;
导入java.lang.System.Logger;
导入java.lang.System.Logger.Level;
导入javax.swing.DefaultListModel;
导入javax.swing.InputVerifier;
导入javax.swing.JComponent;
导入javax.swing.JList;
导入javax.swing.JTextArea;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
/**
*
*@作者卢卡·斯卡西亚
*/
公共类frmMain扩展了javax.swing.JFrame{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
静态最终记录器=System.getLogger(frmMain.class.getName());
专用JTextArea交换机;
私家侦探;
私有模型;
公共财政收入(){
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(新java.awt.GridLayout());
aList=新JList();
本.添加(列表);
Model=新的DefaultListModel();
模型补遗(“要素1”);
模型补遗(“要素2”);
模型补遗(“要素3”);
模型补遗(“要素4”);
aList.setModel(Model);
anEditor=newjtextarea();
添加(一个编辑器);
setInputVerifier(新的InputVerifier(){
@凌驾
公共布尔验证(JComponent输入){
如果(输入==anEditor){
PropertyChangeEvent evt=新的PropertyChangeEvent(anEditor,“Description”,anEditor.getText(),null);
对于(PropertyChangeListener l:anEdit.getPropertyChangeListeners()){
l、 财产变动(evt);
}
}
返回true;
}
});
anEditor.addPropertyChangeListener(新的PropertyChangeListener(){
@凌驾
公共作废属性更改(属性更改事件evt){
如果(aList.getSelectedIndex()>=0)
if(“Description”.equals(evt.getPropertyName())&&evt.getSource()==anEditor){
StringWriter sw=新的StringWriter();
试一试{
编辑写入(sw);
}捕获(IOEX异常){
LOGGER.log(Level.ERROR,ex);
}
Model.setElementAt(sw.toString(),aList.getSelectedIndex());
aList.validate();
}
}
});
aList.addListSelectionListener(新的ListSelectionListener(){
@凌驾
聚氨基甲酸酯
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 *
 * @author luca.scarcia
 */
public class frmMain2 extends javax.swing.JFrame {

    private JTextArea anEditor;
    private JList<String> aList;
    private DefaultListModel<String> Model;

    public frmMain2() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new java.awt.GridLayout());

        aList = new JList<>();
        this.add(aList);
        Model = new DefaultListModel<>();
        Model.addElement("Element 1");
        Model.addElement("Element 2");
        Model.addElement("Element 3");
        Model.addElement("Element 4");

        aList.setModel(Model);

        anEditor = new JTextArea(5, 30);
        this.add(anEditor);

        anEditor.addFocusListener( new FocusAdapter()
        {
            int selected;

            @Override
            public void focusGained(FocusEvent e)
            {
                selected = aList.getSelectedIndex();
            }

            @Override
            public void focusLost(FocusEvent e)
            {
                Model.setElementAt(anEditor.getText(), selected);
            }
        });

        aList.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if(!e.getValueIsAdjusting()) {
                    StringReader sr = new StringReader((String)aList.getSelectedValue());
                    try {
                        anEditor.read(sr, null);
                    } catch (IOException ex) {
                        System.out.println(ex);
                    }
                }
            }
        });

        pack();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
        }

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(() -> {
            new frmMain2().setVisible(true);
        });
    }
}