增加for循环中的textField数

时间:2017-12-22 13:29:58

标签: java swing

我有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中

3 个答案:

答案 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 字段(或者,只需更改或添加过滤机制) 。但它确实达到了你想要的目的。