将文本字段与Java中的复选框相关联

时间:2012-12-08 21:38:08

标签: java mysql sql database

此程序要求用户登录并请求数据库访问。然后程序获取一个连接对象,搜索存储列名的数据库到一个向量中供以后使用。问题在于实现文本字段以允许用户在数据库中搜索特定值。

我可以使用gridlayout显示复选框和文本字段,并将它们添加到面板中。如何将文本字段与相应的复选框相关联?

我已经尝试将它们添加到矢量中,但是它们也不能同时添加到面板中。我已经搜索了一种方法来命名文本字段,因为循环遍历列名称,但如果没有提前声明它们似乎是不可能的。这也无法做到,因为无法确定用户将要求的属性。

我只需要能够知道文本字段的名称,这样我就可以测试用户是否输入了信息并执行了必要的逻辑。如果你必须看到其余代码给出答案,请告诉我,但希望你能够大致了解我想要实现的目标。

UI的图片:

Picture of 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);  
        }  
    }  

3 个答案:

答案 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,这样可以更轻松地创建更复杂和动态的屏幕。

http://www.miglayout.com/

完成此操作后,就可以将自定义组件存储在地图中,并将列名称作为键。