Java 从大量Swing文本字段收集数据

Java 从大量Swing文本字段收集数据,java,swing,Java,Swing,我目前正在用Java编写一个数独解算器。我现在需要的是某种Swing GUI来输入已知的数字。我创建了一个JFrame,但是从工具箱中手动添加81个文本字段似乎是一个糟糕的解决方案。我还可以添加如下代码: this.setLayout(new GridLayout(9, 9)); for (int i = 0; i < 81; i++) { this.add(new JTextField("Field")); } private void addComponents()

我目前正在用Java编写一个数独解算器。我现在需要的是某种Swing GUI来输入已知的数字。我创建了一个
JFrame
,但是从工具箱中手动添加81个文本字段似乎是一个糟糕的解决方案。我还可以添加如下代码:

this.setLayout(new GridLayout(9, 9));

for (int i = 0; i < 81; i++)
{
    this.add(new JTextField("Field"));
}
    private void addComponents()
{
    this.setLayout(new GridLayout(9, 9));

    for (int i = 0; i < fields.length; i++)
    {
        fields[i] = new JTextField("" + i);
        this.add(fields[i]);
    }
}
this.setLayout(新的GridLayout(9,9));
对于(int i=0;i<81;i++)
{
添加(新JTextField(“字段”));
}

但是,我不知道以后如何处理这些文本字段,以便将用户输入收集到二维数组中。我怎样才能做到这一点呢?

另一种解决方案是使用一个。您可以允许TableModel维护完整的数据解决方案,以及用户尝试的副本。CellRenderer和CellEditor可以处理用户体验。请参阅。

JTable是您的朋友。使用具有可编辑字符串值的DefaultTableModel

String[] columnNames = new String[9];
for(int i=0; i<9; i++){columnNames[i]="";}
String[][] data = new String[9][9]; 
JTable tab = new JTable(columnNames,data);
String[]columnNames=新字符串[9];

对于(int i=0;i我自己的数独解算器对此有些挣扎,但最终在JPanel上画画,并添加了鼠标侦听器..然后使用鼠标位置和他的函数确定当前字段:

    addMouseListener(new MouseAdapter() {
        private int t(int z) {
            return Math.min(z / factor, 8);
        };

        @Override
        public void mouseMoved(MouseEvent e) {
            setToolTipPossibilities(t(e.getX()), t(e.getY()));
        }

        @Override
        public void mousePressed(MouseEvent e) {
            clickColumn = t(e.getX());
            clickRow = t(e.getY());
        }
    });

首先,您需要声明JTextFields的数组

因此,就像存储用户输入的阵列一样,您需要:

private JTextField[] textFields;
之后,您可以使用一些数学来将一维数组映射到二维数组。 像这样的方法应该会奏效:

楼层(索引/9),索引%9

对于x,y第一个方向:

您可以将文本字段放入一个数组中,该数组将镜像单元格值所在的数组

这种方法的问题在于,当您需要将mouseListener或ActionListener绑定到文本字段时,您将很难确定它所对应的单元格号

第二种方式:

您可以使用存储单元号的新实例变量将JTextField扩展到自定义类中


使用此方法,您还可以在扩展类上实现MouseListener或ActionListener,并获得所需字段的任何信息,而无需搜索数组。与第一个方法相结合,将它们放入数组中,以便于快速访问。

只想发布一点更新

我在表单中添加了一个文本字段数组作为字段:

private JTextField[] fields;
初始化它:

fields = new JTextField[81];
最后,我将字段添加到我的表单中,如下所示:

this.setLayout(new GridLayout(9, 9));

for (int i = 0; i < 81; i++)
{
    this.add(new JTextField("Field"));
}
    private void addComponents()
{
    this.setLayout(new GridLayout(9, 9));

    for (int i = 0; i < fields.length; i++)
    {
        fields[i] = new JTextField("" + i);
        this.add(fields[i]);
    }
}
private void addComponents()
{
这个.setLayout(新的GridLayout(9,9));
for(int i=0;i
目前的结果如下:

是的,这将用于显示数组。要从数组中读取,您只需要为每个元素调用getText方法。

是的……我创建了81个文本字段……看起来很酷,需要一段时间才能在tho中输入。PI补充说,使用此解决方案,您可以使用任意九个图像作为符号。此外,我还使用它来显示s有关求解算法的一些详细信息;显示光标和尝试的值(以及您可以看到的工具提示)。