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