此程序要求用户登录并请求数据库访问。然后程序获取一个连接对象,搜索存储列名的数据库到一个向量中供以后使用。问题在于实现文本字段以允许用户在数据库中搜索特定值。
我可以使用gridlayout显示复选框和文本字段,并将它们添加到面板中。如何将文本字段与相应的复选框相关联?
我已经尝试将它们添加到矢量中,但是它们也不能同时添加到面板中。我已经搜索了一种方法来命名文本字段,因为循环遍历列名称,但如果没有提前声明它们似乎是不可能的。这也无法做到,因为无法确定用户将要求的属性。
我只需要能够知道文本字段的名称,这样我就可以测试用户是否输入了信息并执行了必要的逻辑。如果你必须看到其余代码给出答案,请告诉我,但希望你能够大致了解我想要实现的目标。
UI的图片:
try {
ResultSet r2 = con.getMetaData().getColumns("", "", rb.getText(), "");
colNames1 = new Vector<String>();
columns1 = new Vector<JCheckBox>();
while (r2.next()) {
colNames1.add(r2.getString(4));
JCheckBox cb = new JCheckBox(r2.getString(4));
JTextField tf = new JTextField(10);
columns1.add(cb);
p3.add(cb);
p3.add(tf);
}
}
答案 0 :(得分:1)
首先,Vector是一个不应该使用多年的旧类。改为使用ArrayList。
其次,如果要将obect与另一个对象关联,则使用Map:
Map<String, JTextField> textFieldsByColumnName = new HashMap<String, JTextField>();
for (...) {
String columnName = ...;
JTextField tf = new JTextField();
map.put(columnName, tf);
}
然后,当您想要与给定列名相关联的文本字段时,只需使用
JTextField tf = textFieldsByColumnName.get(columnName);
了解collection tutorial中的馆藏。这是任何Java程序员必须知道的东西。
答案 1 :(得分:1)
作为组件组合的示例,您可以使用包含复选框和文本字段的类来扩展JPanel。这可用于构建提供新行为的自定义组件,而无需从头开始编写自己的输入组件。
class CheckableTextField extends JPanel {
JTextField textField;
JCheckBox checkBox;
public CheckableTextField(String label) {
this.checkBox = new JCheckBox(label);
this.textField = new JTextField(10);
this.add(this.checkBox);
this.add(this.textField);
}
public String getValue() {
return this.textField.getText();
}
public isSelected() {
return this.checkBox.isSelected();
}
}
然后,您可以使用CheckableTextField代替各个JTextField和JCheckBox对象。它表现得就像Java带有一个完全符合你想要的组件。您可以通过多种方式进一步自定义自定义组件,例如通过更改构造函数中的布局。
使用组合来构建自己的组件是相当普遍的,使用面向对象的框架,如Swing(用于GUI应用程序)或JSF(用于Web应用程序)。
答案 2 :(得分:0)
最好编写一个自定义组件,就像GaragantuChet所说的那样。这也使布局和自定义焦点遍历策略更容易。我还建议您查看miglayout,这样可以更轻松地创建更复杂和动态的屏幕。
完成此操作后,就可以将自定义组件存储在地图中,并将列名称作为键。