Java 从JFrame中动态创建的变量获取数据

Java 从JFrame中动态创建的变量获取数据,java,swing,dynamic,jframe,jtextfield,Java,Swing,Dynamic,Jframe,Jtextfield,我有一个包含Jspinner的Jframe。当JSpinner增加时,将在我的面板headerPanel中创建一个新的JTextField。该脚本创建的文本框的变量名(tFrame0、tFrame1等)上附加了一个整数 原始代码和所有旧编辑已移动到pastebin 链接pastebin以防将来对任何人都有帮助,并且不会使当前相关的代码变得混乱 这个问题是在……的帮助下解决的!感谢您在评论和聊天中对我非常耐心 下面是工作代码,以防以后有人偶然发现此类问题 全局变量 private JPanel h

我有一个包含Jspinner的Jframe。当JSpinner增加时,将在我的面板headerPanel中创建一个新的JTextField。该脚本创建的文本框的变量名(tFrame0、tFrame1等)上附加了一个整数

原始代码和所有旧编辑已移动到pastebin

链接pastebin以防将来对任何人都有帮助,并且不会使当前相关的代码变得混乱

这个问题是在……的帮助下解决的!感谢您在评论和聊天中对我非常耐心

下面是工作代码,以防以后有人偶然发现此类问题

全局变量

private JPanel headerPanel;
private JSpinner spinner;

public List<JTextField> findTextFields() {
    List<JTextField> fields = new LinkedList<>();

    Component[] children = headerPanel.getComponents();
    for (Component child : children) {
        if (child instanceof JTextField) {
            JTextField childField = (JTextField) child;

            // check, if the name is prefixed correctly.
            String name = childField.getName();
            if (name.startsWith(nameTField)) {
                fields.add(childField);
            }
        }
    }

    return fields;
}
适配盒();方法

public-void-adapterboxs(){
//查找微调器的值。
int spinnerValue=(整数)spinner.getValue();
List textFields=findTextFields();
int numTextFields=textFields.size();
if(numTextFields>spinnerValue){
//如果我们有太多的领域。
for(JTextField textField:textFields){
String name=textField.getName();
Matcher Matcher=POSTFIX_PATTERN.Matcher(名称);
if(matcher.matches()){
字符串strPostfix=matcher.group(1);
int postfix numeric=Integer.parseInt(strPostfix);
System.out.println(“for postFix=“+postFix numeric+”:“+textField.getText());
if(postFixNumeric>=spinnerValue){
System.out.println(“PFN:+postFixNumeric”);
System.out.println(“FTF:+numTextFields”);
headerPanel.remove(文本字段);
}
}
}
}否则{
while(numTextFields
JTextField文档侦听器

/**
 * Inner class
 */
private final class TextFieldDocumentListener implements DocumentListener {
    @Override
    public void changedUpdate(DocumentEvent e) {
        warn();
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        warn();
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        warn();
    }

    /**
     * Actual sysout to inform the user...
     */
    public void warn() {
        List<JTextField> textFields = findTextFields();
        for (JTextField textField : textFields) {
            String name = textField.getName();

            Matcher matcher = POSTFIX_PATTERN.matcher(name);
            System.out.println(name);

            if (matcher.matches()) {
                String strPostfix = matcher.group(1);
                int postfixNumeric = Integer.parseInt(strPostfix);

                System.out.println("for postfix = " + postfixNumeric + ": " + textField.getText());
            } else {
                System.out.println("matcher error: " + matcher);
            }
        }
    }
}
/**
*内部阶级
*/
私有最终类TextFieldDocumentListener实现DocumentListener{
@凌驾
公共作废更改日期(记录事件e){
警告();
}
@凌驾
公共作废移除更新(文档事件e){
警告();
}
@凌驾
公共作废插入更新(文档事件e){
警告();
}
/**
*实际系统输出以通知用户。。。
*/
公开无效警告(){
List textFields=findTextFields();
for(JTextField textField:textFields){
String name=textField.getName();
Matcher Matcher=POSTFIX_PATTERN.Matcher(名称);
System.out.println(名称);
if(matcher.matches()){
字符串strPostfix=matcher.group(1);
int postfix numeric=Integer.parseInt(strPostfix);
System.out.println(“for postfix=“+postfix numeric+”:“+textField.getText());
}否则{
System.out.println(“匹配器错误:+matcher”);
}
}
}
}

除非要使用反射(),否则不能“将我的for循环int i附加到变量名”。反射将允许您在java-
对象中搜索其字段,并根据其名称(如果已公开)访问这些字段

幸运的是,这不是你真正需要的。实际上,您正在寻找一种方法,通过类型和名称来识别J面板的子项(
组件
s),然后推导出您以前附加的索引。我的建议如下:

//此模式可以位于类文件中的任何位置:
公共静态最终模式后缀_Pattern=Pattern.compile(“tFrame(\\d+));
//这应该在您公开的GUI类(假定为面板)中,但可以在它可以访问headerPanel的任何地方。
公共列表findTextFields(){
列表字段=新建LinkedList();
Component[]children=headerPanel.getComponents();
//这是您的“搜索循环”:
for(组件子级:子级){
if(JTextField的子实例){
JTextField childField=(JTextField)child;
String name=childField.getName();
if(name.startsWith(“tFrame”)){
字段。添加(childField);
}
}
}
返回字段;
}
(这也可以使用
,但上面的代码更简单)

上面的代码“查找”您现有的组件,您可以从中开始工作,例如,根据它们的名称对它们进行排序,然后进行打印

为什么您只收到部分文本字段似乎对修改有反应,这是因为您(可能)没有将相同的
inputData
-数组传递给您创建的不同
DocumentListener
s。如果设置一个断点并进行检查,我打赌inputData数组具有不同的散列。也就是说,我不能100%地推断出这一点,因为周围的代码是不完整的

我建议改变:

if(tField.getText()!=null){
Object[]currentData=新对象[getFieldNum+1];
currentData[getFieldNum]=tField.getText();
inputData[getFieldNum]=tField.getText();
对于(int i=0;i

for(JTextField textField:findTextFields()){
String name=textField.getName();
Matcher Matcher=POSTFIX_PATTERN.Matcher(名称);
if(matcher.matches()){
字符串strPostfix=matcher.group(1);
int postfix numeric=Integer.parseInt(strPostfix);
System.out.println(“for postfix=“+postfix numeric+”:“+textField.getText());
}
}

public void adaptBoxes() { // Find value of spinner. int spinnerValue = (Integer) spinner.getValue(); List<JTextField> textFields = findTextFields(); int numTextFields = textFields.size(); if (numTextFields > spinnerValue) { // if we have too many fields. for (JTextField textField : textFields) { String name = textField.getName(); Matcher matcher = POSTFIX_PATTERN.matcher(name); if (matcher.matches()) { String strPostfix = matcher.group(1); int postFixNumeric = Integer.parseInt(strPostfix); System.out.println("for postFix = " + postFixNumeric + ": " + textField.getText()); if (postFixNumeric >= spinnerValue) { System.out.println("PFN: " + postFixNumeric); System.out.println("FTF: " + numTextFields); headerPanel.remove(textField); } } } } else { while (numTextFields < spinnerValue) { // if we have too few fields. int hp = headerPanel.getComponentCount(); JTextField tField = new JTextField(); tField.setName(nameTField + hp); tField.getDocument().addDocumentListener(new TextFieldDocumentListener()); headerPanel.add(tField); textFields = findTextFields(); numTextFields = textFields.size(); } } }

/**
 * Inner class
 */
private final class TextFieldDocumentListener implements DocumentListener {
    @Override
    public void changedUpdate(DocumentEvent e) {
        warn();
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        warn();
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        warn();
    }

    /**
     * Actual sysout to inform the user...
     */
    public void warn() {
        List<JTextField> textFields = findTextFields();
        for (JTextField textField : textFields) {
            String name = textField.getName();

            Matcher matcher = POSTFIX_PATTERN.matcher(name);
            System.out.println(name);

            if (matcher.matches()) {
                String strPostfix = matcher.group(1);
                int postfixNumeric = Integer.parseInt(strPostfix);

                System.out.println("for postfix = " + postfixNumeric + ": " + textField.getText());
            } else {
                System.out.println("matcher error: " + matcher);
            }
        }
    }
}