체크 박스는 다중 선택을 할 때 사용하는 버튼이다.
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 -> {
});
라디오 버튼은 단일 선택을 할 때 사용하는 버튼이다.
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());
});
콘솔 로그를 보면 알 수 있듯 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);
}
}
추가 필요한 설명이 있으면 댓글로 달아주세요.
감사합니다. 😀