我有81个textFields(textField_0 ... textField_80),我想填充我的数组。如何通过for循环的每次迭代增加textField数
我正在寻找类似的东西
for (x=0 ; x<=80 ; x++) {
grid[x] = Integer.parseInt(textField_x.getText());
}
让textField_x不起作用,因为它显然正在寻找一个名为textField_x的textField,那么这样做的正确方法是什么?
编辑:我已经尝试过Würgspaß提供的解决方案,但是现在我需要将它实现到我的框架中。作为测试,我尝试了这个 fields[1].setColumns(10);
fields[1].setBounds(310, 300, 32, 32);
frame.getContentPane().add(fields[1]);
但它没有出现在我的windowbuilder中
答案 0 :(得分:3)
您不能在Java中使用变量标识符。对于您的工作方法,更改代码以创建TextFields,如下所示:
public final static int NUM_FIELDS = 81;
TextField[] fields = new TextField[NUM_FIELDS];
for (int x=0 ; x<NUM_FIELDS ; x++) {
fields[x] = new TextField();
}
并检索如下内容:
for (int x=0 ; x<NUM_FIELDS ; x++) {
grid[x] = Integer.parseInt(fields[x].getText());
}
但是,我会说,使用81个文本字段非常麻烦。对于我的数独求解器,我使用JTextArea让用户逐行输入数字。代码(简短形式)看起来像这样:
//number of fields of Sudoku
public final static int NUM_FIELDS = 81;
//ascii value for zero
public final static int ASCII_ZERO = 48;
//Sudoku figures to be entered by GUI user
private final JTextArea field;
[...]
//code to retrieve input
byte[] bytes = field.getText().getBytes();
int[] figures = new int[NUM_FIELDS];
for (int c = 0, i = 0; c < bytes.length; c++) {
if (bytes[c]>=ASCII_ZERO && bytes[c]<(ASCII_ZERO+10)) {
figures[i++] = (bytes[c] - asciiNull); //store entered value as int in array
}
//ignore newline characters but optionally handle wrong input by user using else-statements
}
当然,你也可以使用像int[9][9]
这样的二维数组,或者使用Integer.parseInt
转换输入的文本并进行适当的错误处理,但无论如何你只需要关心一个GUI元素。
答案 1 :(得分:2)
不要将它们存储在81个不同的变量中,而是直接将它们存储在一个数组中。
答案 2 :(得分:1)
我同意这里的其他章节,将这些放入数组然后迭代是更好的方式来做到这一点。但是, 是一种通过反射来实现此目的的方法。
假设我有100个data
,其名称如下:
JTextField
最多JTextField tf_0 = new JTextField("0");
JTextField tf_1 = new JTextField("1");
JTextField tf_2 = new JTextField("2");
。
我可以这样做。首先,我反映这个类来获得它的字段。然后我根据他们的类过滤它们,然后根据它们开始的名称进行过滤,然后对它们进行排序(你可能需要一个字符串比较器,它按照数字顺序排列,而不是默认的字母顺序,即19,2,20,21)。
然后创建一个数组并用相关值填充它。 (你可以使用JTextField tf_99
在流中实现这一切,但这引入了一个我不想打扰的尝试捕获。)
mapToInt
现在,这种方法速度较慢,效率较低,而且......非常简单,不以任何方式优先。它还要求字段具有可预测的名称,并且名称以private int[] getTextFieldValues() throws IllegalArgumentException, IllegalAccessException {
List<Field> fields = Stream.of(this.getClass().getDeclaredFields())
.filter(f -> f.getType().equals(JTextField.class))
.filter(f -> f.getName().startsWith("tf_"))
.sorted((f1, f2) -> f1.getName().compareTo(f2.getName()))
.collect(Collectors.toList());
int[] output = new int[fields.size()];
for (int i = 0; i < fields.size(); i++) {
JTextField jtf = (JTextField) fields.get(i).get(this);
output[i] = Integer.parseInt(jtf.getText());
}
return output;
}
开头的唯一字段是您要查找的 droids 字段(或者,只需更改或添加过滤机制) 。但它确实达到了你想要的目的。