Chapter 12. Awt와 Swing Chapter 13. 배치 관리자 Chapter 14. 이벤트 관리자 Chapter 15. 스윙 컴포넌트 Chapter 16. 고급 스윙 컴포넌트
1. Swing을 시작하기에 앞서
Swing에 대한 여러가지 이야기 √ UI와 기능의 구현을 구분하는 형태로 소프트웨어의 개발 방법은 발전해 나갈 것이다. √ AWT와 Swing은 UI와 기능의 구현을 구분한 모델은 아니다. 하지만, 이에 대한 학습을 통해서 UI 구현 에 대한 전반적인 이해를 갖출 수 있다. √ Swing을 사용하지 않더라도 Swing의 학습은 다른 프레임워크의 이해에 많은 도움이 된다. √ AWT와 Swing을 각각 별도로 공부할 필요는 없다. 둘 중 하나를 선택에서 UI 구현에 대한 경험을 갖는 것에 의미를 두자!
2. Swing 컴포넌트와 이벤트 핸들링
Swing 프로그래밍에 대한 이해 골격이 되는 창은 JFrame의 인스턴스 JFrame이 상속하는 클래스중 하나는 java.awt.Container 클래스! 이 클래스를 상속하는 컴포넌트는 다른 Swing 컴포넌트를 얹을 수 있다. Container 클래스는 배치와 관련된 클래스이다. 따라서 setLayout 메소드 역시 Container 클래스의 메소드이다. FlowLayout 인스턴스가 장착되어 컴포넌트의 배치를 관리하게 된다. 단순히 add 메소드의 호출을 통해서 컴포넌트를 얹으면 FlowLayout 인스턴스가 적절 히 배치한다. setVisible 메소드 호출을 통해서 그간 작성한 JFrame을 눈에 보이게 한다.
Swing과 AWT의 비교 Swing 코드 AWT 코드 JFrame을 대신해서 Frame 사용! JButton을 대신해서 Button 사용! FlowLayout은 양쪽에 모두 사용! 단, Swing 컴포넌트는 운영체제에 상관없이 보이는 모습이 동일하지만 AWT 컴포넌트는 운영체제에 따라서 보이는 모습에 차 이가 있다.
exit 메소드 GUI 창의 우측 상단의 x 버튼을 눌러도 프로그 램은 종료되지 않는다. x 버튼이 눌렸을 때 프 로그램이 종료되기를 원한다면 그에 따른 이벤 트 핸들링이 필요하다!
exit 메소드의 전달 값 exec 메소드를 통해서 다른 자바 프로그램의 실행을 명령할 수 있다. 그리고 이러한 상황에서 실행을 명 령한 자바 프로그램이 종료 시 전달한 값, 예를 들어서 exit 함수 호출 시 전달한 값을 얻을 수 있다.
이벤트 리스너에 대한 간단한 소개1
이벤트 리스너에 대한 간단한 소개2 동일 위치에서 버튼이 눌렸다 놓일 때 호출되는 메소드 MouseEvent 인스턴스를 통해서 얻을 수 있는 정보들 버튼이 눌린 이후 mouseClicked 메소드 호출을 통해서 발생한 상태의 변화
3. 레이아웃 매니저
FlowLayout 배치 관리자 배치의 기준 getPreferredSize 메소드는 JButton 클래스가 상속하는 상 위 클래스에 정의된 메소드로써, GUI창에 그려질 컴포넌트 의 적절한 크기정보를 반환한다. 그리고 FlowLayout 배치 관리자는 이 메소드를 호출해서 반환되는 값을 참조하여 컴 포넌트를 배치한다. Dimension 클래스의 두 인스턴스 변수는 width와 height 이며, 직접 접근이 가능하다.
BorderLayout 배치 관리자 배치의 기준 SOUTH, WEST 채우지 않았을 때의 실행결과 중앙을 제외한 나머지 영역이 비게 되면, 그만큼 다른 영역의 컴포넌트에 의해 빈 영역이 채워짐!
GridLayout 배치 관리자 세로 3, 가로 2로 분할 올리는 대로 왼쪽에서 오른쪽으로, 위에서 아래로 올리는 대로 왼쪽에서 오른쪽으로, 위에서 아래로 위의 생성자를 통해서 세로와 가로의 분할정보 뿐만 아니라, 세로와 가로의 컴포넌트간 간격도 지정할 수 있다. hgap과 vgap에 2를 전달했을때의 실행결과
하나의 JFrame에 둘 이상의 배치 관리자 적용! JPanel 컴포넌트 √ Jpanel은 눈에 보이는 성격의 컴포넌트가 아니다. √ JFrame처럼 다른 컴포넌트를 얹을 수 있고, 또 배치 관리자의 지정도 가능하다! 적용의 예 JFrame에 배치 관리자 지정해서 두 개의 JPanel을 올린다. 각각의 Jpanel에 각각의 배치 관리자를 별도로 지정한다.
4. 이벤트와 이벤트 리스너
이벤트의 종류와 그에 따른 이벤트 리스너 ActionEvent가 발생하는 상황은 컴포넌트에 따라 결정된다. JButton의 경우 JButton이 눌렸을때 ActionEvent가 발생한다. ActionEvent가 발생하는 상황은 컴포넌트에 따라 결정된다. JButton의 경우 JButton이 눌렸을때 ActionEvent가 발생한다. setEnable(false)에 의해서 컴포넌트가 비활성화되면, 눌리지 않기 때문에 ActionEvent가 발생하지 않는다. 그러나 MouseEvent는 발생한다.
ActionEvent 버튼의 눌림에 대해서는 ActionEvent를 기반으 로 이벤트를 처리하는 것이 타당하다.
WindowEvent 1 GUI 창이 등장하면서 호출 GUI 창의 활성화! 비활성화!
WindowEvent 2 우측 상단의 최소화 버튼이 눌릴 때 다시 복원 되었을 때 우 상단의 X 버튼이 눌리면 호출 창이 소멸되면서 호출 X 버튼이 눌리면 호출 windowClosed 함수의 호출로 이어짐 X 버튼이 눌려서 창이 보이지 않 는다고 해서 창이 소멸된 것은 아니다!
프로그램을 종료시키는 또 다른 방법 setDefaultCloseOperation의 인자로 WindowConstant.DISPOSE_ON_CLOSE가 전달되면 X 버튼 눌릴 때 dispose 메소드 호출과 동일한 결과를 보인다.
MouseListener & MouseMotionListener MouseEvent Listener √ MouseListener √ MouseMotionListener 마우스 관련 이벤트 마우스 움직임 관련 이벤트 마우스 버튼이 눌린 상태에서의 움직임
Adapter 클래스 Adapter 클래스 기반의 구현
Anonymous(익명) 클래스의 활용 Adapter 클래스의 메소드를 하나만 정의하고자 하는 경우에는 Anonymous 클래스의 형태로 정의하는 것도 의미가 있다.
5. 다양한 Swing 컴포넌트
JLabel & JTextField JTextField와 JPasswordField의 텍스트상에서 엔터 키가 입력되면 ActionEvent가 발생 JLabel은 문자열 출력을 위한 컴포넌트 JTextField는 문자열 출력을 위한 컴포넌트 JPasswordField는 문자열을 가리며 출력
JTextArea JTextArea는 여러 줄의 문자열 입력을 위한 컴포넌트 세로 10, 가로 20의 JTextArea 생성 자동 줄 바꿈 단어 단위 줄 바꿈 커서 다음 행으로 이동
JScrollPane 스크롤 바가 필요한 시점에 생성됨 VERTICAL_SCROLLBAR_ALWAYS은 계속해서 스크롤 바를 표시함을 의미 HORIZONTAL_SCROLLBAR_NEVER는 스크롤 바를 표시하지 말라는 의미
JCheckBox & JRadioButton
JRadioButton 이벤트 핸들링
Border
JComboBox1 ItemEvent는 선택 받은 컴포넌트를 대상으로도 선택을 잃은 컴포넌트를 대상으로도 발생한다.
JComboBox2 setMaximumRowCount 호출결과 setMaximumRowCount 호출하지 않은 결과
JComboBox3 Yoon에서 Kang을 선택 두 번의 ItemEvent 발생! Yoon을 Jung으로 변경 ActionEvent 발생 입력 후 엔터! 두 번의 ActionEvent 발생
Look And Feel Swing에서는 Look And Feel의 변경을 통해서 모든 컴포넌트의 View를 일괄 변경할 수 있다.