【问题标题】:Swing remove JTexField and JLabelSwing 移除 JTexField 和 JLabel
【发布时间】:2015-04-24 16:31:06
【问题描述】:

我有一个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();
                    }
                }
            });

【问题讨论】:

  • 点击复选框时是否要删除??
  • 当他取消选中我认为的复选框时,他想删除输入掩码(4 个文本字段)
  • 选中复选框字段后出现取消点击复选框字段消失。

标签: java swing jtable jtextfield jcheckbox


【解决方案1】:

快速-n-肮脏的方式:

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.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 行(例如,当用户在表格中选择 2 个复选框时),这对您来说是最好的方法。

另一种方式:使用CardLayout。这仅在您始终添加一个字段(带标签)时才有效,这与选择了表中的组合框的数量无关。

【讨论】:

  • 显示正常,但它总是删除列表中的最后一个元素,但并非总是如此。例如。我会选择第二个元素,第三个和第五个,然后取消单击第二个,列表会清除我的第五个而不是第二个。
  • @user3193748 尝试第二种方式。只需删除所有字段并根据所选检查提供完整的重新布局。
【解决方案2】:

您可以创建一个包含所有所需字段的向量。当用户点击复选框时,您可以将其添加到 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2023-03-25
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多