일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- javascript
- JPA
- alter
- Union-find
- map
- deque
- Java
- 힙덤프
- 리소스모니터링
- priority_queue
- math
- NIO
- Calendar
- sql
- dfs
- 큐
- 스프링부트
- BFS
- 스택
- union_find
- Properties
- CSS
- GC로그수집
- scanner
- string
- spring boot
- List
- set
- date
- html
- Today
- Total
매일 조금씩
12/08 - GUI(1) : Swing, Window Builder (JLabel, JButton, JTextField, JTextArea) 본문
12/08 - GUI(1) : Swing, Window Builder (JLabel, JButton, JTextField, JTextArea)
mezo 2020. 12. 10. 22:27
▷p850
swing을 설명해줄거다
Java FX는 점점 이상해진다.
Swing을 배우면 fx도 다룰수 있다.
Swing
1. widget - widget을 포함할 수 있는 widget
=> Container 설정을 먼저 해야함
AWT - Frame, Dialog, Panel
Swing - JFrame, JDialog, JPanel
JFrame - 가장 기본이 되는 화면, 애플리케이션당 1개 (닫기, 전체화면 등)
JDialog - JFrame의 자식화면(선택창 작게뜨는거)
JPanel - Widget의 그룹 (콤보박스나 선택하는 것들 묶은걸 패널이라함)
2. layout - widget의 배치
3. widget - 입력과 출력을 위한 widget
4. 이벤트
Swing - ui 구성 편리하게 하게끔
- eclipse용 툴(plugin)
- window builder
강사님이 주신 압출 파일 - 오라클에서 준 예제 파일
> demo > jfc > notepad > 주소복사
> demo > jfc > SwingSet2 > 주소복사
Swing을 배우면 저런걸 다 구현할 수 있다.
소스코드도 같이 제공하니까
그거 사용하면 저렇게 그대로 구현할 수 있다.
Look&Feel에서 윈도우로 바꿔주면 화면 이질감 없어짐.
객체화 시켜서 다 그린다.
뭔가 그리거나 폰트 설정을 바꾸거나 할때 그 내용을 단순하게 처리하는게 아니고 클래스라고 보는게 가장 좋다.
클래스화 시켜서 집어넣어야한다.
Container 배울건데 다루려면 메서드가 필요한데 이 메서드가 Component에 정의되어있어서 상속받아서 쓴다.
폰트든 배경색이든 싹다 클래스가 있다.
메서드
ch13_awt와 애플릿.pdf ▷p10
크기를 주려면 setlocation + setsize해야하는데 이걸한게 setbound다.
보이게 하는건 setvisible.
add()를 사용해서 컴포넌트를 컨테이너에 담는다.
컨테이너를 만들어서 거기에 뭘 담고 싶으면 위치와 크기를 잡아서 add()한다.
LayoutManager : 컨테이너안쪽에 배치를 어떻게 할건지
layout의 종류
컴포너느는 기본 레이아웃을 가지고 있고
Swing에선 null 레이아웃도 있다. 좌표랑 크기로 찍어주는거.
ch13_awt와 애플릿.pdf ▷p39
ch13_awt와 애플릿.pdf ▷p13
기본적인 프레임 만들기
import javax.swing.JFrame;
public class SwingEx01 {
public static void main(String[] args) {
// JFrame frame = new JFrame(); // default 생성자
JFrame frame = new JFrame("프레임 타이틀");
frame.setTitle("새로운 타이틀");
System.out.println(frame.getTitle());
// 크기와 위치
frame.setSize(1024, 768);
frame.setLocation(100,100);;
// 보여달라고 반드시 말해야함
frame.setVisible(true);
}
}
상속을 통해서 만들기
1) 클래스만들때 superclass로 JFrame넣어주기 (* 이걸많이씀)
import javax.swing.JFrame;
public class JFrameEx02 extends JFrame {
public JFrameEx02() {
this.setSize(1024, 768);
this.setLocation(100,100);
}
public static void main(String[] args) {
JFrameEx02 frame = new JFrameEx02();
frame.setVisible(true);
}
}
2) 내부 클래스 생성자 분리시키기
import javax.swing.JFrame;
public class UserFrame extends JFrame {
public UserFrame() {
this.setSize(1024, 768);
this.setLocation(100,100);
}
}
public class JFramEx03 {
public static void main(String[] args) {
UserFrame frame = new UserFrame();
frame.setVisible(true);
}
}
* 종료하기 (닫기 버튼 누르면 실행도 종료되는거)
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
* setSize, setLocation 하나로 쓰기 -> setBounds
// this.setSize(1024, 768);
// this.setLocation(100,100);
this.setBounds(100,100,1024,768);
레이아웃 위치 좌표 찾기 어렵다.
스레드와 비슷한 구조로 만든다.
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class JFrameEx05 extends JFrame {
private JPanel contentPane;
public JFrameEx05() {
// 닫을 때 종료되게
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 프레임(창) 사이즈, 위치
this.setBounds(100,100,1024,768);
// JPanel 생성 (대부분 JFrame에 JPanel을 깔아줌)
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(100, 5, 5, 5));
this.setContentPane(contentPane);
contentPane.setBackground(Color.GREEN);
// LayoutManager - layout
// null (좌표 레이아웃)
contentPane.setLayout(null);
// widget 넣기
JButton btn1 = new JButton("new button");
btn1.setBounds(12,10,97,23);
contentPane.add(btn1);
}
public static void main(String[] args) {
// 스레드 형태
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
JFrameEx05 frame = new JFrameEx05();
frame.setVisible(true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
//JFrameEx05 frame = new JFrameEx05();
//frame.setVisible(true);
}
}
window builder 사용
help > eclipse marketplace > window builder 검색
그냥 클래스 만들면 안되고 other눌러서 JFrame선택해줘서 만들어야함
window builder를 쓰면 거기에 의존해서 해야한다.
수동 코딩한걸 여기다가 부르면 안된다.
ui를 그리는 방법
레이아웃을 null로 해준다.
button, Label, backgroundColor 등 수정이 가능하다.
1. JLabel
ch13_awt와 애플릿.pdf ▷p18
label에 html 로 집어넣어도 된다.
label에서 그냥 text에 치면 엔터키가 안먹기 때문에 html구문으로 써줘야한다.
JLabel lbl2 = new JLabel("<html><body><font color='red'>Hello Label</font><br /><font color='red'>Hello Label</font></body></html>");
이렇게 하면
icon으로 이미지를 넣을 수도 있다. (나중에 알아서 해봐라~)
button으로 사용자 입력을 만든다.
만들면 지역변수로 생성되는데
이렇게 하면 소스에서 자연스럽게 선언부가 멤버필드로 올라가 있음
2. JButton
버튼을 눌렀을 때 (이벤트)
하면 소스에서
이렇게 이벤트 코드가 작성 되어 있다.
실습1) btn2라는 button생성하고 클릭하면 "난 클릭됩니다" 출력되게
JButton btn2 = new JButton("New button");
btn2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("난 클릭 됩니다.");
}
});
btn2.setBounds(14, 52, 105, 27);
contentPane.add(btn2);
실습2) 버튼 클릭시 1번 라벨의 내용이 2번 라벨에 들어가기
라벨을 버튼에서 불러오려면 라벨이 멤버 변수여야한다.
멤버변수로 만들고
이미지화 된것에 대해 얘기해보자
실습3) button 에 사진 넣기
icon 눌러서 함
- 숨기기 / 보이기 - setVisible(boolean) - 클릭 안됨
- 활성화 / 비활성화 - setEnabled(boolean) - 클릭 됨. 이벤트가 제거 되는 건아니다.
3. JTextField
- JTextField - 한줄 입력
- JPassworkField - 비밀번호 입력
- JTextArea - 여러 줄 입력
실습4) textField의 내용이 버튼을 누르면 출력되게 하기
editable
enable
-> 테두리가 있는 라벨처럼 됨
실습4) TextField1에 'hong gil dong' 입력 후 버튼 누르면 TextField2에 'Hong Gil Dong' 출력되게 만들기
JTextFieldEx01.java
passwordField
3. JTextArea
여러줄 입력이기 때문에 엔터키까지 출력가능하다.
setText()는 overwrite구조인데
textArea에는 append()메소드가 있어서 append가 가능하다.
< editable, enable 차이 >
- editable : 편집 가능 불가능 (거기에 쓸수 있냐 없냐) (많이 씀)
- enable : 활성화 비활성화 (색 자체가 바뀜) (잘안 씀)
※ 응용 문제 1
구구단 시작단, 끝단 입력 받아서 버튼 누르면 textArea에 구구단 출력하기
시작단, 끝단을 입력받는 textField와 구구단을 출력하는 textArea를 모두 멤버변수로 하고,
textArea의 append()메소드를 사용하여 textArea에 구구단이 출력되게 하였다.
JButton btn = new JButton("구구단 보기");
btn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int start = Integer.parseInt(textField1.getText());
int end = Integer.parseInt(textField2.getText());
for(int i = start; i<=end; i++) {
for(int j=1; j<=9; j++) {
textArea.append(i + "X" + j + "=" + (i*j) + " ");
}
textArea.append("\n");
}
}
});
강사님은 StringBuffer를 사용하셨다.
StringBuffer result = new StringBuffer();
for(int i = start; i<=end; i++) {
for(int j=1; j<=9; j++) {
result.append(i + "X" + j + "=" + (i*j) + "\t");
}
result.append("\n");
}
textArea.setText(result.toString());
이렇게 textArea에 구구단이 잘려서 나올수 있으므로 textArea를 Jscrollpane안에 넣어줘야한다.
※ 응용문제 2
동이름을 집어 넣고 검색을 누르면 우편번호 주소가 모두 출력되게
(1) 내코드
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SearchZipcode01 extends JFrame {
private JPanel contentPane;
private JTextField textField;
private JTextArea textArea;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
SearchZipcode01 frame = new SearchZipcode01();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public SearchZipcode01() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 403, 445);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
textField = new JTextField();
textField.setBounds(14, 12, 245, 24);
contentPane.add(textField);
textField.setColumns(10);
JButton btn = new JButton("New button");
btn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
String url = "jdbc:mysql://localhost:3307/sample";
String user = "root";
String password = "!123456";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 드라이버 로딩
Class.forName("org.mariadb.jdbc.Driver");
// 드라이버 연결
conn = DriverManager.getConnection(url, user, password);
String sql = String.format("select * from zipcode where dong like ?");
pstmt = conn.prepareStatement(sql);
String whatdong = textField.getText();
System.out.println(whatdong);
pstmt.setString(1, whatdong + "%");
rs = pstmt.executeQuery();
StringBuffer address = new StringBuffer();
while(rs.next()) {
String zipcode = rs.getString("zipcode");
String sido = rs.getString("sido");
String gugun = rs.getString("gugun");
String dong = rs.getString("dong");
String ri = rs.getString("ri");
String bunji = rs.getString("bunji");
address.append(String.format("[%s] %s %s %s %s %s\n", zipcode, sido , gugun, dong, ri, bunji));
}
textArea.append(address.toString());
} catch (ClassNotFoundException e1) {
System.out.println("[에러]" + e1.getMessage());
} catch (SQLException e1) {
System.out.println("[에러]" + e1.getMessage());
} finally {
if(rs != null)try {rs.close();} catch(SQLException e1) {}
if(pstmt != null)try {pstmt.close();} catch(SQLException e1) {}
if(conn != null)try {conn.close();} catch(SQLException e1) {}
}
}
});
btn.setBounds(266, 11, 105, 27);
contentPane.add(btn);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(14, 48, 357, 338);
contentPane.add(scrollPane);
textArea = new JTextArea();
scrollPane.setViewportView(textArea);
}
}