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