Swing 删除 JTexField 和 JLabel

Swing remove JTexField and JLabel

我有一个 JTable 2 列,列名和复选框。如果用户单击创建数据输入新字段的列名称旁边的复选框。我希望取消点击复选框输入字段已经消失。

我该怎么做?

我添加新字段的代码:

 headerTable.getModel().addTableModelListener(new TableModelListener() {

                @Override
                public void tableChanged(TableModelEvent e) {
                    if(e.getColumn() >= 0  && e.getFirstRow()>-1){
                        int id =  e.getFirstRow();
                        String colName = (String)headerTable.getValueAt(e.getFirstRow(), 1);
                        boolean colValue = (boolean)headerTable.getValueAt(e.getFirstRow(), 2);

                        System.out.println("Row : " + e.getFirstRow() +
                                   " value :" + headerTable.getValueAt(e.getFirstRow(), 2));
                        appListener.getColumnId(id);
                        //create texfield
                        if(colValue==false){
                            System.out.println("Delete");
                        }                         
                        jTextField = new JTextField(20);
                        textField.put(id,jTextField);
                        if (textField != null && !textField.isEmpty()) {
                            textField.get(textField.size()-1);
                            System.out.println("Add");
                        }
                        JLabel kolor1name = new JLabel(colName+": ");
                        operationContent.add(kolor1name,"");
                        operationContent.add(jTextField, "growy, wrap");

                        revalidate();
                        repaint();
                    }
                }
            });

快捷方式:

if(colValue){
    jTextField = new JTextField(20);

    textField.put(id,jTextField);

    if (textField != null && !textField.isEmpty()) {
        textField.get(textField.size()-1);
        System.out.println("Add");
    }

    JLabel kolor1name = new JLabel(colName+": ");
    operationContent.add(kolor1name,"");
    operationContent.add(jTextField, "growy, wrap");

} else {                         
    System.out.println("Delete");
    Component[] comps = operationContent.getComponents();
    operationContent.remove(comps[comps.length - 2]);
    operationContent.remove(comps[comps.length - 1]);
}
revalidate();
repaint();

但这种方式可能(并非总是)导致布局问题(面板在移除后看起来很糟糕)。

更好的方法:提供面板的完整重新布局"operationContent"

operationContent.removeAll();
// add all the components above the kolor1name
if(colValue){
    jTextField = new JTextField(20);

    textField.put(id,jTextField);

    if (textField != null && !textField.isEmpty()) {
        textField.get(textField.size()-1);
        System.out.println("Add");
    }

    JLabel kolor1name = new JLabel(colName+": ");
    operationContent.add(kolor1name,"");
    operationContent.add(jTextField, "growy, wrap");
}
revalidate()
repaint();

这种方式可以,但在某些情况下也可以提供布局问题。但是,如果您想添加超过 1 行(例如,当用户 select 2 个复选框 table 时),这可能是最适合您的方式。

另一种方法:使用CardLayout。这仅在您始终添加一个字段(带有标签)时才有效,该字段取决于 table 中有多少组合框被 selected。

您可以创建包含所有所需字段的 Vector。当用户单击复选框时,您可以将其添加到 Vector。例如:

Vector fields = new Vector();

当你收​​到通知时,你在向量中添加字段的名称,并调用 refreshPanel() 方法,该方法删除其中的所有字段,并且向其中添加新字段。

// In the tableChanged(...) method
fields.addElement(colname);
refreshPanel();

然后refreshPanel()方法:

public void refreshPanel()
{
     String fNames[] = (String[]) fields.toArray();
     panel.removeAll();
     for(String fname : fNames)
     {
          //add the fields in `newPanel`, the field name is in `fname` variable
     }
     revalidate();
     repaint();
}

并且当用户取消选中复选框时,然后从 Vector 中删除字段名称:

fields.removeElement(colname);
refreshPanel();