代码之家  ›  专栏  ›  技术社区  ›  luh

在jlabel中显示选定的jcheckbox

  •  0
  • luh  · 技术社区  · 8 年前

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

    这是 listener

    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上显示任何内容。如果我改变 听众 为此:

    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();
                    }
                });
            }
    }
    
    3 回复  |  直到 8 年前
        1
  •  1
  •   Hovercraft Full Of Eels    8 年前

    考虑更改正在执行的操作,并在JList中而不是在JLabels中显示文本。这可以帮助您整合信息。您还可以为您的jCheckBox或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());
        }
    }
    
        2
  •  0
  •   Kyal Bond    8 年前

    问题是txtVote只是一个Jlabel,您试图将其用于所有5个。由于第五个jLaber是最后一个创建的,因此它是正在使用的Jlabel。我的建议是创建一个arraylist字段,并在panel12内将每个标签添加到arraylist。然后在监听器内部,它将遍历arraylist中的每个jlabel,检查是否设置了文本,如果是,则检查下一个,直到找到一个没有文本,然后将文本设置为该文本。目前的问题是,在您的代码中,您永远不会定义取消选中该框时会发生什么。

    import java.awt.Color;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    
    import javax.swing.BorderFactory;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class JCheckBoxtoLabel{
    JCheckBox check;
    String name;
    JLabel txtVote;
    ArrayList<JLabel> boxLabels;
    
    public JCheckBoxtoLabel() {
        boxLabels = new ArrayList<JLabel>();
    
        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);
            boxLabels.add(txtVote);
        }
        return panel2;
    }
    
    ActionListener listener = new ActionListener() {
        @Override   
        public void actionPerformed(ActionEvent e) {
            check = (JCheckBox) e.getSource();
            if(!check.isSelected()){
                for(JLabel label: boxLabels){
                    if(label.getText().equals(check.getName())) label.setText("");
                }
            }else{
                for(JLabel label: boxLabels){
                    if(label.getText().isEmpty()){
                        label.setText(check.getName());
                        return;
                    }
                }
            }
        }
    };
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new JCheckBoxtoLabel();
            }
        });
    }
    }
    
        3
  •  0
  •   dahui    8 年前

    你的变量 JLabel txtVote 是单个JLabel对象,而不是数组。

    在panel2()函数中,将5个新的jLabel分配给 txtVote 由于您在一行中指定了5,因此每次都会被覆盖,因此它只包含最终的JLabel。

    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;
    }
    

    因此,当您在动作侦听器中调用VoteText上的getText时,只会得到最后一个标签文本。

    ActionListener listener = new ActionListener() {
        @Override   
        public void actionPerformed(ActionEvent e) {
            check = (JCheckBox) e.getSource();
            for (int i = 0; i < txtVotes.length; i++) {
                txtVotes[i].getText(check.getName());
            }
        }
    };
    

    我不知道你是否意识到或想知道,但每个标签都被设置为相同的值,如果你不想这样,你需要在某处存储一个检查名数组,并对它们进行迭代。