我有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上显示任何内容。如果我将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();
                }
            });
        }
}

最佳答案

问题是txtVote只是一个Jlabel,您正在尝试将其用于所有5个。由于第五个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();
        }
    });
}
}

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

10-14 04:41