java中的动态复选框
我想在java中动态创建复选框,这样每当按下一个按钮时,就会创建并出现一个新的复选框,每当按下另一个按钮时,所有复选框都会被删除。有人能帮忙吗 到目前为止,我只有手动创建的复选框java中的动态复选框,java,swing,Java,Swing,我想在java中动态创建复选框,这样每当按下一个按钮时,就会创建并出现一个新的复选框,每当按下另一个按钮时,所有复选框都会被删除。有人能帮忙吗 到目前为止,我只有手动创建的复选框 cb1=new JCheckBox("Task 1"); cb2=new JCheckBox("Task 2"); cb3=new JCheckBox("Task 3"); cb4=new JCheckBox("Task 4"); cb5=new JCheckBox("Task 5"); cb6=new JC
cb1=new JCheckBox("Task 1");
cb2=new JCheckBox("Task 2");
cb3=new JCheckBox("Task 3");
cb4=new JCheckBox("Task 4");
cb5=new JCheckBox("Task 5");
cb6=new JCheckBox("Task 6");
addTask= new JButton("Add Task");
removeTask= new JButton("Remove Checked");
addTask.addActionListener(this);
removeTask.addActionListener(this);
假设您创建了
JCheckBox
es的ArrayList
,而不是cb1、cb2、cb3等,并仅为复选框创建面板,而不是为按钮创建面板。现在,每次按下添加按钮都会创建另一个复选框,并将其添加到面板和阵列列表
。当按下移除按钮时,清除阵列列表和面板。下面的代码只是一个示例片段,不是经过完整测试的代码,但它应该为您提供一个方向
// Up in your code
List<JCheckBox> cbarr = new ArrayList<JCheckBox>();
// The listener code
public void actionPerformed(ActionEvent e) {
if (e.getSource() == addTask) // add checkbox
{
JCheckBox cb = new CheckBox("New CheckBox");
cbarr.add(cb);
cbpanel.add(cb);
}
else // remove checkboxs
{
cbarr = new ArrayList<JCheckBox>();
cbpanel.removeAll()
}
}
假设您创建了JCheckBox
es的ArrayList
,而不是cb1、cb2、cb3等,并仅为复选框创建面板,而不是为按钮创建面板。现在,每次按下添加按钮都会创建另一个复选框,并将其添加到面板和阵列列表
。当按下移除按钮时,清除阵列列表和面板。下面的代码只是一个示例片段,不是经过完整测试的代码,但它应该为您提供一个方向
// Up in your code
List<JCheckBox> cbarr = new ArrayList<JCheckBox>();
// The listener code
public void actionPerformed(ActionEvent e) {
if (e.getSource() == addTask) // add checkbox
{
JCheckBox cb = new CheckBox("New CheckBox");
cbarr.add(cb);
cbpanel.add(cb);
}
else // remove checkboxs
{
cbarr = new ArrayList<JCheckBox>();
cbpanel.removeAll()
}
}
而不是为每个复选框创建新变量。将对复选框的引用存储在列表中。创建新复选框时,将其添加到列表中。如果要全部删除它们,请从GUI中删除它们并清除列表。而不是为每个复选框创建新变量。将对复选框的引用存储在列表中。创建新复选框时,将其添加到列表中。当您想全部删除它们时,请从GUI中删除它们并清除列表。您应该使用一些布局管理器,例如,您可以通过在布局构造函数中将行或列设置为0来为其指定动态的行或列
在actionPerformed方法中,您可以使用JPanel.add()方法将新复选框添加到面板中,并在后面验证它,这样就完成了
关于删除,您可以遍历面板的组件列表并调用JPanel.remove()方法,然后验证面板
祝您好运,Boro。您应该使用一些布局管理器,例如,您可以通过在布局构造函数中将行或列设置为0来为其指定动态的行或列
在actionPerformed方法中,您可以使用JPanel.add()方法将新复选框添加到面板中,并在后面验证它,这样就完成了
关于删除,您可以遍历面板的组件列表并调用JPanel.remove()方法,然后验证面板
祝你好运,波罗。左边有一个JButton
,用于添加另一个标签。它在两列中添加标签。相同的基本原则可用于添加任意数量的JCheckBox
要删除它们,请调用Container.removeAll()
,然后调用相同的方法来更新GUI。左侧有一个JButton
,用于添加另一个标签。它在两列中添加标签。相同的基本原则可用于添加任意数量的JCheckBox
要删除它们,请调用Container.removeAll()
,然后调用相同的方法来更新GUI。动态添加/删除GUI组件时,需要告诉布局管理器已进行了更改。您可以使用如下代码执行此操作:
panel.add(....);
panel.revalidate();
panel.repaint();
动态添加/删除GUI组件时,需要告知布局管理器已进行更改。您可以使用如下代码执行此操作:
panel.add(....);
panel.revalidate();
panel.repaint();
以上所有解决方案都非常出色。另一种选择是,如果在列中有一个重要的复选框列表,那么可以考虑使用具有复选框列的JTALE,或者将列列为“标签”。将向您展示如何执行此操作,但只需扩展DefaultTableModel类并重写其getColumnClass方法,以使用复选框为列返回Boolean.class。然后用布尔对象填充模型。然后,您可以从模型中添加或删除行,并让JTable处理GUI的细节。如果您想尝试这种方式,我们可以帮助您了解具体情况
编辑1:
例如:
编辑2:
添加/删除显示的功能
编辑3:
将removeChecked和showAll方法移动到模型类中
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
@SuppressWarnings("serial")
public class CheckBoxTable extends JPanel {
public static final String[] COLUMNS = {"Purchased", "Item"};
public static final String[] INITIAL_ITEMS = {"Milk", "Flour", "Rice", "Cooking Oil", "Vinegar"};
private CheckBoxDefaultTableModel model = new CheckBoxDefaultTableModel(COLUMNS, 0);
private JTable table = new JTable(model);
private JTextField itemTextField = new JTextField("item", 10);
public CheckBoxTable() {
JButton addItemBtn = new JButton("Add Item");
addItemBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addItemActionPerformed();
}
});
JButton removeCheckedItemsBtn = new JButton("Remove Checked Items");
removeCheckedItemsBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
removeCheckedItemsActionPerformed();
}
});
JButton showAllBtn = new JButton("Show All");
showAllBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
showAllActionPerformed();
}
});
itemTextField.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
itemTextField.selectAll();
}
});
JPanel btnPanel = new JPanel(new GridLayout(1, 0, 5, 0));
btnPanel.add(itemTextField);
btnPanel.add(addItemBtn);
btnPanel.add(removeCheckedItemsBtn);
btnPanel.add(showAllBtn);
setLayout(new BorderLayout(5, 5));
add(new JScrollPane(table), BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
for (int i = 0; i < INITIAL_ITEMS.length; i++) {
Object[] row = {Boolean.FALSE, INITIAL_ITEMS[i]};
model.addRow(row);
}
}
private void showAllActionPerformed() {
model.showAll();
}
private void removeCheckedItemsActionPerformed() {
model.removeCheckedItems();
}
private void addItemActionPerformed() {
String item = itemTextField.getText().trim();
if (!item.isEmpty()) {
Object[] row = {Boolean.FALSE, item};
model.addRow(row);
}
}
private static void createAndShowUI() {
JFrame frame = new JFrame("CheckBoxTable");
frame.getContentPane().add(new CheckBoxTable());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
@SuppressWarnings("serial")
class CheckBoxDefaultTableModel extends DefaultTableModel {
private List<String> removedItemsList = new ArrayList<String>();
public CheckBoxDefaultTableModel(Object[] columnNames, int rowCount) {
super(columnNames, rowCount);
}
public void showAll() {
if (removedItemsList.size() > 0) {
Iterator<String> iterator = removedItemsList.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
Object[] row = {Boolean.TRUE, next};
addRow(row);
iterator.remove();
}
}
}
@Override
public Class<?> getColumnClass(int columnNumber) {
if (columnNumber == 0) {
return Boolean.class;
}
return super.getColumnClass(columnNumber);
}
public void removeCheckedItems() {
int rowCount = getRowCount();
for (int row = rowCount - 1; row >= 0; row--) {
if ((Boolean) getValueAt(row, 0)) {
removedItemsList.add(getValueAt(row, 1).toString());
removeRow(row);
}
}
}
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
导入javax.swing.*;
导入javax.swing.table.DefaultTableModel;
@抑制警告(“串行”)
公共类CheckBoxTable扩展了JPanel{
公共静态最终字符串[]列={“已购买”、“项目”};
公共静态最终字符串[]首字母_项={“牛奶”、“面粉”、“大米”、“食用油”、“醋”};
私有CheckBoxDefaultTableModel=新的CheckBoxDefaultTableModel(列,0);
专用JTable表=新JTable(模型);
私有JTextField itemTextField=新的JTextField(“项”,10);
公共CheckBoxTable(){
JButton addItemBtn=新JButton(“添加项”);
addItemBtn.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
addItemActionPerformed();
}
});
JButton removeCheckedItemsBtn=新JButton(“删除选中项”);
removeCheckedItemsBtn.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
removeCheckedItemActionPerformed();
}
});
JButton showAllBtn=新JButton(“全部显示”);
showAllBtn.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
表演表演(