[swing] JCheckBox, JRadioButton

jmkim·2023년 6월 27일
0

swing

목록 보기
6/9

JCheckBox

체크 박스는 다중 선택을 할 때 사용하는 버튼이다.

JCheckBox[] checkBoxes = new JCheckBox[10];
for(int i = 0; i < checkBoxes.length; i++) {
    checkBoxes[i] = new CheckBox("테스트 " + (i + 1));

    panel.add(checkBoxes[i]);
}

선택 이벤트는 addActionListener addItemListener 으로 지정하면 된다.
두 Listener은 도일한 로직을 수행한다.

checkBoxes[i].addActionListener(e -> {

});
checkBoxes[i].addItemListener(e -> {

});

JRadioButton

라디오 버튼은 단일 선택을 할 때 사용하는 버튼이다.
ex) 성별, 동의 여부

라디오 버튼은 다른 component와 비슷하게 panel에 넣어 나타내면 된다.

JRadioButton[] radioButtons = new JRadioButton[5];
for(int i = 0; i < checkBoxes.length; i++) {
    String text = "테스트 " + (i + 1);

    radioButtons[i] = new JRadioButton(text);
    panel.add(radioButtons[i]);
}

화면에 버튼은 정상적으로 나타나지만, 보통의 라디오 버튼과 달리 체크박스처럼 다중선택이 된다.

라디오 버튼이 단일 선택만 가능하게 하기 위해서는 ButtonGroup을 사용해서 그룹을 지정해야 한다.
(체크 박스도 ButtonGroup으로 단일 선택으로 설정할 수 있지만 지양해야함)

ButtonGroup group = new ButtonGroup();
RadioButton[] radioButtons = new RadioButton[10];
for(int i = 0; i < checkBoxes.length; i++) {
    String text = "테스트 " + (i + 1);

    radioButtons[i] = new RadioButton(text);
    group.add(radioButtons[i]);

}


addActionListener, addItemListener 두 메소드로 선택 이벤트를 지정할 수 있다.
하지만, 이 두 메소드는 큰 차이가 있다.

radioButtons[i].addActionListener(e -> {
    System.out.println("addActionListener = " + radioButton.getText() + " " + radioButton.isSelected());
});

radioButtons[i].addItemListener(e -> {
    System.out.println("addItemListener = " + radioButton.getText()+ " " + radioButton.isSelected());
});
Console Log

addItemListener = 테스트 4 true
addActionListener = 테스트 4 true
addItemListener = 테스트 4 false
addItemListener = 테스트 6 true
addActionListener = 테스트 6 true

콘솔 로그를 보면 알 수 있듯 addActionListener은 버튼 클릭 시에만 이벤트가 작동한다.
반면에 addItemListener은 버튼 상태가 변할 때 이벤트가 작동한다.
즉 다른 라디오 버튼을 선택해도 이벤트가 작동한다.
각각에 상황에 맞게 이벤트를 지정해야 한다.

swing의 모든 component를 보면 테두리에 톱니바퀴 현상이 나타나있는 것을 확인할 수 있는데, 라디오 버튼은 이것이 더욱 확연하게 보인다.
이를 해결하기 위해 렌더링을 안티에일리어싱으로 지정하면 된다.

@Override
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        super.paint(g);
    }

안티에일리어싱 전후

실습

public class SelectButton {

    public static void main(String[] args) {
        Frame frame = new Frame(500, 300, "");

        Label label = new Label();

        JPanel center = new JPanel();
        center.setBorder(BorderFactory.createEmptyBorder(50, 0, 0, 0));
        center.add(new Label("내가 좋아하는 음식은 "));
        center.add(label);

        String[] arr1 = "한식,양식,중식".split(",");
        String[][] arr2 = {
                "불고기,닭갈비,백반,비빔밥,김밥".split(","),
                "햄버거,파스타,샌드위치,함버그,오므라이스".split(","),
                "짜장면,짬뽕,탕수육,유산슬,볶음밥".split(",")
        };

        JPanel bottom = new JPanel(new GridLayout(1, 0));
        JPanel top = new JPanel(new GridLayout(1, 0));

        ButtonGroup group = new ButtonGroup();
        for(int i = 0; i < 3; i++) {
            int index = i;

            RadioButton radio = new RadioButton(arr1[index]);
            group.add(radio);
            radio.addItemListener(e -> {
                bottom.removeAll();
                label.setText("");

                for(int j = 0; j < 5; j++) {
                    CheckBox checkBox = new CheckBox(arr2[index][j]);
                    checkBox.addActionListener(v -> {
                        String text = label.getText();

                        if(checkBox.isSelected()) {
                            text = text + (checkBox.getText().isEmpty() ? "" : " ") + checkBox.getText();
                        } else {
                            text = text.replace(checkBox.getText() + " ", "").replace(checkBox.getText(), "");
                        }

                        label.setText(text);
                    });

                    bottom.add(checkBox);
                }

                bottom.revalidate();
                bottom.repaint();
            });

            top.add(radio);
        }
        ((JRadioButton) top.getComponent(0)).setSelected(true);

        JPanel panel = new JPanel(new BorderLayout());
        panel.add(center);
        panel.add(top, BorderLayout.NORTH);
        panel.add(bottom, BorderLayout.SOUTH);

        frame.add(panel);
        frame.setVisible(true);
    }
}

class Label extends JLabel {

    public Label() {
        setFont(new Font("맑은 고딕", 1, 30));
    }

    public Label(String text) {
        this();
        setText(text);
    }
}

class CheckBox extends JCheckBox {
    public CheckBox(String text) {
        setText(text);
        setHorizontalAlignment(JLabel.CENTER);
        setFont(new Font("맑은 고딕", Font.PLAIN, 15));
    }

    @Override
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        super.paint(g);
    }
}

class RadioButton extends JRadioButton {
    public RadioButton(String text) {
        setText(text);
        setHorizontalAlignment(JLabel.CENTER);
        setFont(new Font("맑은 고딕", Font.PLAIN, 15));
    }

    @Override
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        super.paint(g);
    }
}


추가 필요한 설명이 있으면 댓글로 달아주세요.
감사합니다. 😀

0개의 댓글