[JAVA] 221201 - CardLayout, tabbedPane, JCheckBox, JRadioButton
CardLayout
'cardlayout'은 각 컴포넌트들을 카드처럼 겹쳐 놓은 상태로 보여주는 레이아웃이다.
한 번에 하나의 카드만 보이며, 컨테이너는 일련의 카드 역할을 한다.
[매개변수]
CardLayout()
기본 레이아웃을 설정해준다.
CardLayout(int hgap, int vgap);
가로 세로 여백을 설정할 수 있다.
*생성자 소스코드
패널 First와 Second를 Center패널에 추가 한 후, 버튼 2개를 North위치에 배치한 패널에 추가했다.
First 패널에'첫번째 화면' Second 패널에 '두번째 화면'이라는 Label을 추가하고
Center패널에 각각의 패널을 추가하였다.
public TestCard() {
JPanel pn1First = new JPanel();
JPanel pn1Second = new JPanel();
pn1Center = new JPanel();
cardLayout = new CardLayout();
pn1Center.setLayout(cardLayout);
JPanel pn1North = new JPanel();
btn1 = new JButton("첫번째 화면 보기");
btn2 = new JButton("두번째 화면 보기");
pn1North.add(btn1);
pn1North.add(btn2);
btn1.addActionListener(this);
btn2.addActionListener(this);
pn1First.add(new JLabel("첫번째 화면"));
pn1Second.add(new JLabel("두번째 화면"));
pn1Center.add(pn1First, "1st");
pn1Center.add(pn1Second, "2nd");
cardLayout.show(pn1Center, "1st");
add(pn1Center);
add(pn1North, "North");
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}


각 각의 버튼을 누르면 각 버튼의 참조에 맞는 문장이 실행되고, cardLayout에게 'pn1Center'에 있는 1st 패널을 보여달라 2nd 패널을 보여달라고 전달되고 동작된다.
tabbedPane
이클립스 상단에 파일들이 여러탭을 통해 열릴 수 있도록 기능이 제공되는데, 이처럼 창에 탭을 추가하여 여러창을 탭을 통해 볼 수 있도록 해주는 기능이다. carlayout과 비슷하다.


Toolkit

'Toolkit'객체를 불러오는 메소드
Toolkit은생성자가아닌 정적인 메소드를 활용하여 객체를 생성한다.
classLoader

클래스로더는 런타임중에 JVM에서 동적으로 java클래스를 로드하는 역할을 한다.
클래스가 필요한 순간에 메모리로 로드하는 역할

이미지를 불러와주는 도구인 Toolkit 객체 생성, 클래스로더로 '춘식6.png'파일을 가져와 이미지 객체 형태로 인스턴스에 저장한다.
class TestImage extends JFrame implements ActionListener {
private ImageIcon imageIcon;
private ImageIcon imageIcon2;
private JLabel lbl;
private JButton btn;
public TestImage() {
JPanel pnl = new JPanel();
Toolkit kit = Toolkit.getDefaultToolkit();
ClassLoader classLoader = getClass().getClassLoader();
Image image = kit.getImage(classLoader.getResource("춘식6.png"));
imageIcon = new ImageIcon(image);
imageIcon2 = new ImageIcon("춘식16.png");
lbl = new JLabel();
lbl.setIcon(imageIcon);
btn = new JButton(imageIcon);
btn.addActionListener(this);
pnl.add(lbl);
pnl.add(btn);
add(pnl);
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent arg0) {
lbl.setIcon(imageIcon2);
btn.setIcon(imageIcon2);
}
}


JCheckBox
'JFrame'에는 버튼 외에 다양한 이벤트를 발생시키는 객체가 있다. 그 중 하나인 'JCcheckBox'는 체크박스와 텍스트를 입력하여 창에 출력할 수 있다.
체크를 했다, 풀었다 상태를 변경할 수 있고 객체 내에는 이 상태값이 포함되어있어 참조할 수 있다.
체크박스의 상태는 'ItemListener'를 통해 활용가능하다.



'getSource'를 이용해 이벤트객체 e의 참조를 변수o에 초기화하고, instanceOf를 활용해 o가 JCheckBox 클래스인지, 또한 상속관계를 확인한다.
맞다면 o를 다운캐스팅하여 활용한다.

public TestCheckBox() {
JPanel pn1 = new JPanel();
JCheckBox chk1 = new JCheckBox("첫번째 선택지");
JCheckBox chk2 = new JCheckBox("두번째 선택지");
JCheckBox chk3 = new JCheckBox("세번째 선택지");
chk1.addActionListener(this);
//아이템 이벤트
chk1.addItemListener(this);
pn1.add(chk1);
pn1.add(chk2);
pn1.add(chk3);
add(pn1);
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
Object o = e.getSource();
if (o instanceof JCheckBox) {
JCheckBox source = (JCheckBox) o;
boolean isSelected = source.isSelected();
System.out.println(isSelected ? "선택됨" : "해제됨");
}
}
@Override
public void itemStateChanged(ItemEvent e) {
e.getSource();
int state = e.getStateChange();
// 1번 선택, 2번 해제
if (state == ItemEvent.SELECTED) {
System.out.println("선택");
} else if (state == ItemEvent.DESELECTED) {
System.out.println("해제");
}
}
}
JRadioButton
'JRadioButton'은 버튼그룹 클래스를 활용해 각각의 버튼이 상호작용을 하도록 만들 수 있다.
하나의 버튼이 켜지면 다른 버튼은 꺼지고, 서로 관계를 가지는 버튼을 적용할 때 활용하면 된다.

라디오버튼1번은 창이 켜질 때 가장 먼저 켜져있도록 setSelected를 활용한다.
그리고 액션리스너, 아이템 리스너도 추가



첫번째라디오버튼이 체크되어있었고 두번째라디오버튼을 누르자 누르지않은 첫번째라디오버튼이 체크가 풀리며 'ItemEvent'가 발생한 것을 볼 수 있다.
class TestRadio extends JFrame implements ActionListener, ItemListener {
public TestRadio() {
JRadioButton radio1 = new JRadioButton("첫번째 라디오");
JRadioButton radio2 = new JRadioButton("두번째 라디오");
JRadioButton radio3 = new JRadioButton("세번째 라디오");
// 창이 켜질 때 라디오1이 켜진 상태로 시작
radio1.setSelected(true);
radio1.addActionListener(this);
radio1.addItemListener(this);
// 라디오버튼은 그룹이 되기전엔 따로 동작하지만, 그룹이 된 후에는 서로 상호작용을 하게 된다.
ButtonGroup group = new ButtonGroup();
group.add(radio1);
group.add(radio2);
group.add(radio3);
JPanel pn1 = new JPanel();
pn1.add(radio1);
pn1.add(radio2);
pn1.add(radio3);
add(pn1);
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println("1번 라디오버튼의 상태가 변경되었음.");
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("1번 라디오버튼을 눌렀음.");
}
}