java - 使用值删除 Swing 中的复选框

标签 java swing jlist jcheckbox

此代码我已经发布过一次 Delete check-boxes in swings我得到了答案。但很快我的项目需求发生了变化,所以我决定更改我的代码。尝试直接从列表中删除值,而不是删除索引。

我在此过程中面临一个问题,即如果我一次删除一个复选框,它就会删除,但如果我尝试一次删除多个复选框,它就不会删除,我不不我被困住的地方。

这是我的代码。

import java.awt.*;
import java.util.List;
import java.awt.event.*;
import java.util.*;

import javax.swing.*;
import javax.swing.border.TitledBorder;

@SuppressWarnings("serial")
public class DeleteMapSheets extends JDialog {

    private JList list;
    private JPanel rightPanel;

    TitledBorder title;

    // Adding for progress bar
    JDialog dailog = new JDialog();
    JPanel jContentPa;
    JProgressBar jProgressBar;

    // Add radio buttons
    private final static JRadioButton vector = new JRadioButton("Vector", true);
    private final static JRadioButton raster = new JRadioButton("Raster");
    private final static JRadioButton elevator = new JRadioButton("Elevator");
    private static ButtonGroup buttonGroup = new ButtonGroup();
    private static Object dialog;
    JButton cancel = new JButton("Cancel");
    JButton delbtn = new JButton("Delete");

    List<Integer> indexVal = new ArrayList<Integer>();

    public DeleteMapSheets() {
    }

    public DeleteMapSheets(List<String> vectorMap, List<String> elevatorMap,
            List<String> rastorMap) {

        createList(createData(vectorMap));
        createElevator(createData(elevatorMap));
        createRastor(createData(rastorMap));
        createButtons();
        initUI();
    }

    private void createList(final List<CheckListItem> mappedList) {

        vector.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent event) {

                checklistModel mModel = (checklistModel) list.getModel();
                if (event.getStateChange() == 1) {
                    mModel.setItems(mappedList);
                    list.validate();
                    list.repaint();
                }
            }
        });

        checklistModel gChecklist = new checklistModel(mappedList);
        list = new JList(gChecklist);

        // list.setModel(mModel);
        list.setCellRenderer(new CheckListRenderer());

        list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        list.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent event) {

                if (event.getClickCount() == 1) {

                    CheckListItem checkValue = (CheckListItem) list
                            .getSelectedValue();

                    if (checkValue != null) {
                        checkValue.setSelected(!checkValue.isSelected());
                        list.validate();
                        list.repaint(list.getBounds());

                    }
                }
            }
        });

    }

    // Default
    private List<CheckListItem> createData(List<String> list2) {

        int n = list2.size();

        List<CheckListItem> items = new ArrayList<DeleteMapSheets.CheckListItem>();
        for (int i = 0; i < n; i++) {
            items.add(new CheckListItem(list2.get(i)));
        }
        return items;
    }

    // Elevator
    private List<String> createElevator(final List<CheckListItem> list2) {
        elevator.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent event) {

                if (event.getStateChange() == 1) {
                    checklistModel mModel = (checklistModel) list.getModel();
                    mModel.setItems(list2);
                    list.validate();
                    list.repaint();
                }
            }

        });
        return null;
    }

    // Create Vector
    private List<String> createRastor(final List<CheckListItem> list2) {

        raster.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent event) {

                if (event.getStateChange() == 1) {
                    checklistModel mModel = (checklistModel) list.getModel();
                    mModel.setItems(list2);
                    list.validate();
                    list.repaint();
                }
            }
        });

        return null;
    }

    private void createButtons() {

        rightPanel = new JPanel();
        cancel.setMaximumSize(cancel.getMaximumSize());
        delbtn.setMaximumSize(cancel.getMaximumSize());

        // Cancel button taking the action
        cancel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }
        });

        // Cancel
        delbtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {

                /*I am facing the problem here after i checked i am getting only one value */               

                final int dialogButton = JOptionPane.YES_NO_OPTION;
                final int dialogResult = JOptionPane.showConfirmDialog(null,
                        "Are you sure you want to delete the selected map",
                        "Delete", dialogButton);

                SwingWorker<?, ?> worker = new SwingWorker<Void, Integer>() {
                    protected Void doInBackground() throws InterruptedException {
                        checklistModel mModel = (checklistModel) list
                                .getModel();
                        if (dialogResult == JOptionPane.YES_OPTION) {

                            for (CheckListItem items : mModel.items) {
                                if (items.isSelected) {
                                    mModel.removeAt(items);
                                }

                            }
                        }

                        return null;
                    }

                    protected void done() {
                        //RefreshProgressDailog.dispose();
                    }
                };
                if (dialogResult == 0) {
                    worker.execute();
                    //RefreshProgressDailog.setVisible(true);
                }

            }

        });

        rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.LINE_AXIS));
        rightPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4));
        rightPanel.add(Box.createHorizontalStrut(60));
        rightPanel.add(delbtn);
        rightPanel.add(Box.createRigidArea(new Dimension(10, 0)));
        rightPanel.add(cancel);
    }

    private void initUI() {

        // JScroll Panel
        JScrollPane listScroller = new JScrollPane(list);
        listScroller.setPreferredSize(new Dimension(250, 80));
        // listScroller.setAlignmentX(LEFT_ALIGNMENT);

        // Lay out the label and scroll pane from top to bottom.
        JPanel listPane = new JPanel();
        listPane.setLayout(new BoxLayout(listPane, BoxLayout.Y_AXIS));

        // Add all to the panel
        listPane.add(Box.createRigidArea(new Dimension(0, 2)));
        // listPane.add(listScroller);
        listPane.setBorder(BorderFactory.createEmptyBorder(5, 10, 10, 10));

        // Lay out the buttons from left to right.
        JPanel buttonPane = new JPanel();
        buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
        buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
        buttonPane.add(Box.createHorizontalStrut(60));
        buttonPane.add(delbtn);
        buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
        buttonPane.add(cancel);

        JPanel radioPanel = new JPanel();
        radioPanel.setLayout(new BoxLayout(radioPanel, BoxLayout.LINE_AXIS));

        title = BorderFactory.createTitledBorder("Types Of Data");

        // Add the radio buttons
        buttonGroup.add(vector);
        buttonGroup.add(raster);
        buttonGroup.add(elevator);
        radioPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
        radioPanel.add(vector);
        radioPanel.add(raster);
        radioPanel.add(elevator);

        radioPanel.setBorder(title);

        listPane.add(buttonPane);
        listPane.add(radioPanel);
        listPane.add(listScroller);
        // listPane.add(setButton);

        // Put everything together, using the content pane's BorderLayout.
        Container contentPane = getContentPane();
        contentPane.add(listPane, BorderLayout.CENTER);
        contentPane.add(buttonPane, BorderLayout.PAGE_END);
        add(listPane);

        add(listPane);

        setTitle("Delete Map");
        setSize(300, 350);
        setLocationRelativeTo(null);

    }

    class CheckListItem {
        private String label;
        private boolean isSelected = false;

        public CheckListItem(String string) {
            this.label = string;
        }

        public boolean isSelected() {
            return isSelected;
        }

        public void setSelected(boolean isSelected) {
            this.isSelected = isSelected;
        }

        public String toString() {
            return label;
        }
    }


    class CheckListRenderer extends JCheckBox implements ListCellRenderer {
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean hasFocus) {
            setEnabled(list.isEnabled());
            setSelected(((CheckListItem) value).isSelected());
            // System.out.println("i am checked  "+((CheckListItem)
            // value).isSelected());
            setFont(list.getFont());
            setBackground(list.getBackground());
            setForeground(list.getForeground());
            setText(value.toString());
            return this;
        }

    }

    class checklistModel extends AbstractListModel {

        private List<CheckListItem> items;

        public checklistModel(List<CheckListItem> list) {
            super();
            this.items = list;
        }

        public void setItems(List<CheckListItem> createData) {

            this.items = createData;
            fireContentsChanged(this, items.size() - 1, items.size());
        }

        public void setChecklistItems(List<CheckListItem> item2) {
            this.items = new ArrayList<DeleteMapSheets.CheckListItem>();
            for (CheckListItem item : item2) {
                this.items.add(item);
            }
        }

        public void add(CheckListItem item) {
            items.add(item);
        }

        public CheckListItem getElement(CheckListItem items) {
            return items;
        }

        @Override
        public CheckListItem getElementAt(int index) {
            if (index != -1 || index > 0) {
                return items.get(index);
            }
            return null;
        }

        @Override
        protected void fireIntervalRemoved(Object Source, int index0, int index1) {
            super.fireIntervalRemoved(Source, index0, index1);
        }

        @Override
        public int getSize() {
            return items.size();
        }

        public void removeAt(CheckListItem item) {
            items.remove(item);
            fireIntervalRemoved(this, items.size(), items.size());
        }

    }

    public static void main(String[] args) throws ClassNotFoundException,
            InstantiationException, IllegalAccessException,
            UnsupportedLookAndFeelException {
            SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {

                List<String> vectorMap = new ArrayList<String>();

                vectorMap.add("20");
                vectorMap.add("21");
                vectorMap.add("22");
                vectorMap.add("23");
                vectorMap.add("24");
                vectorMap.add("25");
                vectorMap.add("26");
                vectorMap.add("27");
                vectorMap.add("28");

                List<String> elevatorMap = new ArrayList<String>();

                elevatorMap.add("0elevator");
                elevatorMap.add("1elevator");
                elevatorMap.add("2elevator");
                elevatorMap.add("3elevator");
                elevatorMap.add("4elevator");
                elevatorMap.add("5elevator");
                elevatorMap.add("6elevator");
                elevatorMap.add("7elevator");

                List<String> rastorMap = new ArrayList<String>();

                rastorMap.add("0r");
                rastorMap.add("1r");
                rastorMap.add("2r");
                rastorMap.add("3r");
                rastorMap.add("4r");
                rastorMap.add("5r");
                rastorMap.add("6r");
                rastorMap.add("7r");

                DeleteMapSheets ex = new DeleteMapSheets(vectorMap,
                        elevatorMap, rastorMap);

                ex.setVisible(true);
            }
        });
    }

}

最佳答案

尝试使用此代码。阅读内嵌评论。

if (dialogResult == JOptionPane.YES_OPTION) {
    // First collect all the selected CheckListItem
    List<CheckListItem> removed = new ArrayList<CheckListItem>();
    for (CheckListItem item : mModel.items) {
        if (item.isSelected) {
            removed.add(item);
        }
    }

    // Finally remove the selected CheckListItem
    for (CheckListItem item : removed) {
        mModel.removeAt(item);
    }
}
<小时/>

这是您的代码,您在迭代导致问题的相同项目时删除了该项目。

if (dialogResult == JOptionPane.YES_OPTION) {
    for (CheckListItem items : mModel.items) {   // Iterating Items
        if (items.isSelected) {
            mModel.removeAt(items);     // REMOVE Item
        }
    }
}

关于java - 使用值删除 Swing 中的复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23729786/

相关文章:

java - java中大十进制精度零是什么意思

java - 我必须做一个 Java 挑战,将真/假值显示为 1 和 0

java - 不兼容类型 : Object cannot be converted to ParseObject

Java - Jframe 加载后如何更新 JList

java - 使用 ListModel 更改 JComboBox 模型。它有隐藏的后果吗?

java - 如何在 Gradle 构建中指定所需的 Java 版本?

java - 使用 Java 在 Jtable 中显示客户数据

java - 删除 JTable 单元格中可编辑 JCombobox 的边框

java - jFreeChart重新加载数据集问题

java - 如何在jList中存储多个字符串