java - 在 jlabel 中显示选定的 jcheckbox

标签 java swing oop listener jcheckbox

我有 10 个 jcheckbox,只应选择 5 个。我已经完成了这一项的所有编码,但我不知道如何将选定的 5 显示到 jlabel 中。我尝试通过这段代码来做到这一点:

           JCheckBox check;
           JPanel panel=new JPanel();
           for(int i=0; i<10; i++){
                check=new JCheckBox();
                check.addActionListener(listener);
                check.setName("Select"+i);

                panel.add(check); 
            }

这是监听器

ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            check = (JCheckBox) e.getSource();
            name=check.getName();
        }
    };

这是应该显示在 jlabel 中的面板

        panel2=new JPanel(new GridLayout(5,1));
        for(int i=0; i<5; i++){
            txtVote=new JLabel(name);
            panel2.add(txtVote);
        }

但是使用此代码,它不会在 jlabel 上显示任何内容。如果我将 listener 更改为:

ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                check = (JCheckBox) e.getSource();
                txtVote.setText(check.getName());
            }
        };

它只会显示在最后一个标签中。其他 jlabel 将为空白。请帮忙非常感谢

编辑

这是可运行的代码

public class JCheckBoxtoLabel{
    JCheckBox check;
    String name;
    JLabel txtVote;

     public JCheckBoxtoLabel() {
            JFrame frame = new JFrame();
            JPanel panel = createPanel();
            JPanel panel2 = panel2();

            frame.setLayout(new GridLayout(1,2));
            frame.add(panel); frame.add(panel2);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(500, 300);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }

        private JPanel createPanel() {
               JPanel panel=new JPanel(new GridLayout(10,1));
               for(int i=0; i<10; i++){
                    check=new JCheckBox();
                    check.addActionListener(listener);
                    check.setName("Select"+i);

                    panel.add(check); 
                }

            return panel;
        }

        private JPanel panel2(){
            JPanel panel2=new JPanel(new GridLayout(5,1));
            for(int i=0; i<5; i++){
                txtVote=new JLabel();
                txtVote.setBorder(BorderFactory.createLineBorder(Color.RED));
                panel2.add(txtVote);
            }
         return panel2;
     }

        ActionListener listener = new ActionListener() {
            @Override   
            public void actionPerformed(ActionEvent e) {
                check = (JCheckBox) e.getSource();
                txtVote.setText(check.getName());
            }
        };

        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new JCheckBoxtoLabel();
                }
            });
        }
}

最佳答案

考虑更改您正在执行的操作并在 JList 中而不是在 JLabels 中显示文本。这可以帮助您整合您的信息。您还可以为您的 JCheckBoxes 或 JRadioButtons 和 ItemListener 提供一次仅允许选择 5 个按钮的功能 - 取消选择当前选择的最旧的一个。例如:

import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;

@SuppressWarnings("serial")
public class FiveNames extends JPanel {
    private static final String[] ALL_NAMES = {"Bob", "Bill", "Frank", "Helen", 
            "Erica", "Mickey", "Donald", "Hillary", "Michael", "Peter", "Roger"};
    private static final int ALLOWED_SELECTIONS_COUNT = 5;
    private DefaultListModel<String> displayListModel = new DefaultListModel<>();
    private JList<String> list = new JList<>(displayListModel);

    public FiveNames() {
        JPanel namePanel = new JPanel(new GridLayout(0, 1, 0, 5));
        RButtonItemListener rButtonListener = new RButtonItemListener();
        for (String name : ALL_NAMES) {
            JRadioButton rButton = new JRadioButton(name);
            rButton.setActionCommand(name);
            rButton.addItemListener(rButtonListener);
            namePanel.add(rButton);
        }

        list.setVisibleRowCount(ALLOWED_SELECTIONS_COUNT);
        list.setPrototypeCellValue("                            ");
        list.setBackground(null);

        setLayout(new GridLayout(1, 0));
        add(namePanel);
        add(list);
    }

    // listener to only allow the last 5 radiobuttons to be selected
    private class RButtonItemListener implements ItemListener {
        private List<ButtonModel> buttonModelList = new ArrayList<>();

        @Override
        public void itemStateChanged(ItemEvent e) {
            JRadioButton rBtn = (JRadioButton) e.getSource();
            ButtonModel model = rBtn.getModel();
            if (e.getStateChange() == ItemEvent.SELECTED) {
                buttonModelList.add(model);
                if (buttonModelList.size() > ALLOWED_SELECTIONS_COUNT) {
                    for (int i = 0; i < buttonModelList.size() - ALLOWED_SELECTIONS_COUNT; i++) {
                        ButtonModel removedModel = buttonModelList.remove(0);
                        removedModel.setSelected(false);
                    }
                }
            } else {
                buttonModelList.remove(model);
            }
            displayListModel.clear();
            for (ButtonModel buttonModel : buttonModelList) {
                displayListModel.addElement(buttonModel.getActionCommand());
            }
        }

    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("FiveNames");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new FiveNames());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

关于java - 在 jlabel 中显示选定的 jcheckbox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40186107/

相关文章:

java - Swing 中光滑的圆角

java - 我无法在我的 SQL 数据库中插入日期

java - 非法参数异常 : No interpolator found for float during implementing Substance LAF

c++ - 类内部的强制初始化函数

java - 使用 Socket 与服务器通信

java - 从应用程序发送带有附件的电子邮件

java - 使用 Proguard 将 Guava 嵌入到另一个 jar 中

java - 从列表中删除项目 - 转换

php - 查询类内的MYSQL

c# - 一个接口(interface)和一个只有虚拟抽象方法的抽象类是一回事吗?