자바 Swing(스윙) - (3)

2022. 10. 6. 08:39Dev.Program/Java & Spring

728x90

 

======== JAVA0421 → Ex.java

기본 틀 만들기!

  • design 탭 열기

  • JPanel 을 만들고 패널에 TextField 넣어보기
  • 근데 이상하게 나온다
  • 그럴 때 이게 필요함! : 크기를 지정
  •  JPanel 에 JTextField 를 부착하는 경우 생성자에 컬럼길이 명시해야함
  • 숫자 입력하면 입력한 크기만큼 보인다!
  • 지금은 디자인탭에 가서 크기 바꿔보려고 해도 안바뀜! (마우스로 바꾸는 거)

(나중에 Absolute Layout 으로 자유자재로 바꿀 수 있게 배울 거!)

  • 여기선 바꿀 수 있긴 한다

 

  • JPanel 에 넣으면 알아서 크기 조절 됨 (그냥 프레임에 넣으면 칸 차지 다 함! 차이점!)

 

btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println(tf.getText());
tf.setText("");
tf.requestFocus();
}
});
  • 추가

  • focus() 커서 깜박깜박

 

======== Ex2.java (기본 틀 만들기)

< 여러개의 패널 활용 >

1. North 영역에 패널을 부착하여 이름 입력받기

2. Center 영역에 패널을 부착하여 나이 입력받기

  • Alt + Shift + R : 내용바꾸기 단축키




3. South 영역에 패널을 부착하여 생년월일 입력받기

> pSouth 는 design 에서 자동 생성 해보기

  • 선언부가 인스턴스 멤버변수로 빠져있음
  • setColumns 가 따로 나와있음

4. East 영역에 버튼을 부착하여 클릭 이벤트 처리

JButton btn = new JButton("확인");
getContentPane().add(btn, BorderLayout.EAST);
btn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

System.out.println("이름 : " + tfName.getText()
+ ", 나이 :" + tfAge.getText() + ", 생년월일 : " + tfBirth.getText());
}
});
  • 확인 누르면 콘솔창에 내가 입력한 값들이 출력됨!

 

======== Ex3.java(기본 틀 만들기)

  • LayoutManager 객체를 받아올 수 있음

  • design 탭을 통해서도 바꿀 수 있다




< GridLayout >

  • 행과 열로 구성된 레이아웃
  • 균등한 크기로 셀을 분할하여 컴포넌트를 차례대로 배치
  • new GridLayout(행크기,열크기,열간격,행간격)

  • GridLayout 으로 변경!
  • 열 / 행
  • 지금은 1행이라 버튼 추가하면 계속 옆으로 배치됨

 

  • 2행 2열

  • 4행 1열
  • 4행 0열이어도 똑같지만 우리는 명확하게 써주자!



  • vgap : Vertical Gap 버티컬 갭!



======== Ex4.java

  • 모양 확인하기



  • 균등하게 됨!
  • 여기선 10을 생략해도 위와 같이 균등하게 배치됨



> GridLayout 4행 1열로 패널 생성

  • 각 행에 들어갈 패널을 생성하여 JLabel 과 JTextField 를 함께 부착

  • 작은 패널을 만들어서 작은 패널은 큰 패널에 붙이고
  • 밑에 라벨이랑 텍스트 필드를 작은 패널에 붙이기
  • 전부 바꿔주기!

  • 실행했을 때 이렇게 바뀜 ( 아직 정렬은 안 한 상태 )
  • ⇒ 
  • 차이 확인하기





======== Test4.java

> 문제!

GridLayout 을 활용하여 계산기를 만들어보자!

 

public void showFrame() {
setBounds(600, 400, 300, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JTextField tf = new JTextField("0");
getContentPane().add(tf, BorderLayout.NORTH);

// GridLayout 4행 1열로 패널 생성
JPanel p = new JPanel(new GridLayout(5, 4));
getContentPane().add(p, BorderLayout.CENTER);

// ------------------ 버튼 --------------------
JButton btnCE = new JButton("CE");
p.add(btnCE);
JButton btnC = new JButton("C");
p.add(btnC);
JButton btnArrow = new JButton("←");
p.add(btnArrow);
JButton btnDivision = new JButton("÷");
p.add(btnDivision);
JButton btn7 = new JButton("7");
p.add(btn7);
JButton btn8 = new JButton("8");
p.add(btn8);
JButton btn9 = new JButton("9");
p.add(btn9);
JButton btnMultiplication = new JButton("×");
p.add(btnMultiplication);
JButton btn4 = new JButton("4");
p.add(btn4);
JButton btn5 = new JButton("5");
p.add(btn5);
JButton btn6 = new JButton("6");
p.add(btn6);
JButton btnMinus = new JButton("-");
p.add(btnMinus);
JButton btn1 = new JButton("1");
p.add(btn1);
JButton btn2 = new JButton("2");
p.add(btn2);
JButton btn3 = new JButton("3");
p.add(btn3);
JButton btnPlus = new JButton("+");
p.add(btnPlus);
JButton btnPlus_Minus = new JButton("+/-");
p.add(btnPlus_Minus);
JButton btn0 = new JButton("0");
p.add(btn0);
JButton btnDot = new JButton(".");
p.add(btnDot);
JButton btnEqual = new JButton("=");
p.add(btnEqual);

setVisible(true);
}

 

  • 숫자 오른쪽으로 옮기기
  • ⇒ 숫자창 입력 불가로 만들기
  • 숫자판만 흰색으로!



======== Ex5.java (Ex3.java 복사해오기)

이벤트가 발생한 컴포넌트 객체가 ActionEvent 타입 객체로 전달됨

1. getActionCommand() : 해당 컴포넌트의 값(이름 등) 리턴

  • 텍스트 중복이 없을 때 사용가능(버튼 텍스트 출력)

2. getSource() : 해당 컴포넌트의 객체 정보 리턴

  • 리턴타입 : 오브젝트
  • 버튼 자체가 구분이 된다!

  • 이렇게 getSource() 를 통하여 버튼 구분 가능
  • 이걸 통해 4단계로도 확인 / 취소 버튼 구분이 가능하다! (꼭 5단계로 안 해도)









< Test4. java >

  • 추가해주기! (숫자 버튼으로만 이벤트 생성 해 볼거라서...ㅎ)

  • 4단계 껍데기 만들어 놓기!
ActionListener listener = new ActionListener() {
@Override

public void actionPerformed(ActionEvent e) {
if(btn0.equals(e.getSource())) {
System.out.println("0");
} else if (btn1.equals(e.getSource())) {
System.out.println("1");
} else if (btn2.equals(e.getSource())) {
System.out.println("2");
} else if (btn3.equals(e.getSource())) {
System.out.println("3");
} else if (btn4.equals(e.getSource())) {
System.out.println("4");
} else if (btn5.equals(e.getSource())) {
System.out.println("5");
} else if (btn6.equals(e.getSource())) {
System.out.println("6");
} else if (btn7.equals(e.getSource())) {
System.out.println("7");
} else if (btn8.equals(e.getSource())) {
System.out.println("8");
} else if (btn9.equals(e.getSource())) {
System.out.println("9");
}

}
};
  • 근데 이렇게 만들면 syso 10번을 만들어야함!
  • System.out.println(e.getActionCommand()); 로 대체!
  • 내부에 텍스트를 가져온다!
  • 근데 이렇게 하면 숫자 외에 + 나 CE 이런 것 까지 추출이 됨

⇒ e.getActionCommand() 로 리턴된 문자열이 0 ~ 9 사이인지 판별해야함

charAt() 을 이용

if(e.getActionCommand().charAt(0)>='0' && 
e.getActionCommand().charAt(0)<='9') {
System.out.println("숫자 : " + e.getActionCommand());
}

 

Character.isDigit() : Character 클래스를 활용하여 동일한 판별 가능

if(Character.isDigit(e.getActionCommand().charAt(0))) {
System.out.println("숫자 : " + e.getActionCommand());
}



======== Ex6.java (Ex5.java 복사해오기)

JCheckBox 와 JRadioButton ⇒ 가장 큰 차이는 복수선택 / 단일선택

JPanel p = new JPanel(new GridLayout(3, 1));
add(p, BorderLayout.CENTER);
  • 패널을 부착해서 그리드레이아웃으로 만들기
  • 일단 주석처리~~

 

setLayout(new GridLayout(3, 1));
  • JFrame 자체를 GridLayout 으로 변경 가능함

 

JPanel p1 = new JPanel();
add(p1);
JPanel p2 = new JPanel();
add(p2);
JPanel p3 = new JPanel();
add(p3);
  • JPanel 3개를 각 GridLayout 에 부착





< JCheckBox >

  • 다중선택이 가능한 체크박스

  • 체크박스!
  • 체크박스 만들어짐!
  • 여러 개 가능!
  • 다중선택 가능

< JRadioButton >

  • 단일선택만 가능한 라디오버튼

⇒ JRadioButton 객체를 ButtonGroup 객체에 추가해야만 단일 선택으로 동작함

  • 라디오버튼

  • 라디오버튼 만들어보기
  • 근데 라디오 버튼도 다중선택이 된다! (그룹화를 안해서!)
  • 버튼 그룹이 있음!

> 버튼 그룹에 집어넣기!

ButtonGroup rGroup = new ButtonGroup();
rGroup.add(rbFemale);
rGroup.add(rbMale);
  • 이제 단일선택만 가능
  • 사실 라디오버튼 말고 체크박스도 버튼그룹에 넣으면 단일선택으로 만들 수 있다

 

  • 이벤트가 너무 많으니까 design 탭에서 찾아보기! (Add event handler)
  • 우리가 쓸 건 item > itemStateChanged

 

  • 클릭할 때마다 이벤트 생성



> 체크가 되었을 때와 안되었을 때를 구분하고 싶다!

  • e.getXXX 해도 많이 나오지만 이번엔 다르게 해보자

  • cbJava. 으로 해보기! cbJava.isSelected();

  • 체크박스 객체의 isSelected() 메서드를 호출하면 체크 여부 판별 가능






> Android 체크박스는 Action리스너로 만들어보기

  • addActionListener도 똑같이 동작!

⇒ 체크박스에서는 액션리스너, 아이템리스너 전부 사용가능!

 

> item 리스너는 이게 가능하다

  • ItemListener 내의 ItemEvent 타입 객체 파라미터를 사용하여 getStateChange() 메서드를 호출해도 체크 여부 판별 가능

⇒ 체크 : 1, 체크해제 : 2

  • 액션리스너에는 stateChange() 가 없음




  • 라디오 리스너를 그룹화 했을 땐 item 리스너 사용 X
  • 해제 된 상태도 State 가 Change 되는 상태기 때문에 이벤트 발생!
  • 그래서 라디오 버튼은 액션 리스너를 사용하는게 좋다!

< 라디오버튼 이벤트 처리 >

  • 그룹화로 인해 ItemListener 의 itemStateChanged() 메서드가 라디오버튼 상태가 변할 때 호출되는데 하나가 선택되면서 다른 하나가 해제되므로 두 가지 모두 상태가 변한다

⇒ 따라서, 한 번의 동작으로 2번의 이벤트가 발생하게 되므로 중복 수행됨

  • isSelected() 메서드 결과가 true 일 때만 동작하도록 하면 된다!

⇒ 결론! 라디오버튼의 경우 ActionListener 를 사용하는 것이 편하다!

(단점 : 선택 후 다시 클릭하더라도 중복으로 동작함)

 

> ActionListener 를 사용하여 라디오버튼 이벤트 처리 - 4단계

ActionListener listener = new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// if문을 사용하여 isSelected() 상태에 따라 라디오버튼 구별
if(rbFemale.isSelected()) {
System.out.println("여 선택됨!");
} else if(rbMale.isSelected()) {
System.out.println("남 선택됨!");
}
}
};

rbFemale.addActionListener(listener);
rbMale.addActionListener(listener);
  • 선택에 따라 이제 달리 나오는데
  • 이미 선택되어 있는 여를 한번 더 선택하면 또 나온다! (액션리스너의 단점)

 

  • p3 에 버튼 두 개 달아주기

 

p2의 라디오 버튼으로 돌아가서

  • 기본적으로 선택되어있음

 

  • 이렇게 기본선택여부 변경도 가능
  • 라디오박스 / 체크박스 둘 다 가능하다!

 

  • 초기화를 누를 경우 전부 체크 풀리도록!
  • 액션리스너를 통해서 selected 를 false 로 돌려놓으면 된다!






728x90

'Dev.Program > Java & Spring' 카테고리의 다른 글

자바 Swing(스윙) - (5)  (0) 2022.10.06
자바 Swing(스윙) - (4)  (0) 2022.10.06
자바 Swing(스윙) - (2)  (0) 2022.10.06
DAO/DTO 패턴 / 자바 Swing(스윙) - (1)  (0) 2022.10.06
JDBC(Java DataBase Connectivity)  (0) 2022.10.06