我目前正在用Java编写一个数独求解器。我现在需要的是某种Swing GUI来输入已知的数字。我创建了一个JFrame
,但是从工具箱手动添加81个文本字段似乎是一个糟糕的解决方案。我也可以添加这样的代码:
this.setLayout(new GridLayout(9, 9));
for (int i = 0; i < 81; i++)
{
this.add(new JTextField("Field"));
}
但是,之后我不知道如何处理这些文本字段以将用户输入收集到二维数组中。我怎么能这样做?
答案 0 :(得分:4)
另一种解决方案是使用JTable。您可以允许TableModel维护完整的数据解决方案,以及用户尝试的副本。 CellRenderers和CellEditors可以处理用户体验。请参阅this tutorial。
答案 1 :(得分:2)
对于我自己的数独求解器,我有点苦苦挣扎,但最终还是想在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());
}
});
答案 2 :(得分:2)
首先,您需要声明JTextFields数组。
就像您存储用户输入的数组一样:
private JTextField[] textFields;
之后,您可以使用一些数学运算将您的一维数组映射到您的二维。 这样的事情应该有效:
floor(index / 9),index%9
表示x,y
答案 3 :(得分:2)
是的,可以显示数组。要从数组中读取,您只需要为每个元素调用getText方法。
答案 4 :(得分:1)
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);
当他们填写时,检查每个字符串是否是合适的数字并提示输入错误。
答案 5 :(得分:1)
您可以将文本字段放入一个数组中,该数组镜像您的单元格值所在的数组。
此方法存在的问题是,当您需要将mouseListener或ActionListener绑定到TextField时,您将很难确定它与哪个单元格号相对应。
第二种方式:您可以将JTextField扩展为具有新实例变量的自定义类,该实例变量将单元格编号存储在其中。
使用此方法,您还可以在扩展类上实现MouseListener或ActionListener,并获取有关所需字段的任何信息,而无需搜索数组。并结合第一个将它们放入数组中以便快速访问它们。
答案 6 :(得分:1)
只想发布一些更新。
我在表单上添加了一个textfields数组作为字段:
private JTextField[] fields;
初始化:
fields = new JTextField[81];
最后我将字段添加到我的表单中:
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]);
}
}
截至目前的结果可以在这里看到: Image of my textfields