0

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

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

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

我只需要知道文本字段的名称,这样我就可以测试用户是否输入了信息并执行必要的逻辑。如果您必须查看其余代码才能给出答案,请告诉我,但希望您能大致了解我要完成的工作。

用户界面图片:

用户界面图片:

 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);  
        }  
    }  
4

3 回答 3

1

首先,Vector 是一个不应该使用多年的老类。请改用 ArrayList。

其次,如果您想将一个对象与另一个对象关联,请使用 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);

在收藏教程中了解收藏。这是任何 Java 程序员都必须知道的。

于 2012-12-08T22:39:36.037 回答
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 应用程序)这样的面向对象框架来使用组合来构建自己的组件是相当普遍的。

于 2012-12-08T23:01:35.687 回答
0

正如 GaragantuChet 所说,最好编写一个自定义组件。这也使布局和自定义焦点遍历策略更容易。我还建议查看 miglayout,它可以更轻松地创建更复杂和动态的屏幕。

http://www.miglayout.com/

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

于 2012-12-09T07:18:51.077 回答