일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- bufferedInputStream
- 연산자와의 관계
- foreigen key
- 컬렉션 프레임워크
- jsoup
- 변수와 상수
- 오버로딩
- null/not null
- 프로그래머스
- InterruptedException
- exclusive lock
- 오버라이딩
- 프로그래머스 코테
- 원시타입
- git 기초
- 서버 스크립트
- 지연로딩
- SQL
- 추상메서드
- select
- 참조타입
- 변수와 메서드
- 메세지 큐
- 즉시로딩
- delete
- 멱등성
- N+1
- Shared Lock
- Java
- 피연산자
- Today
- Total
[JAVA_Back-End]
[JAVA] GUI(2) 본문
< 이전 포스팅 정리 >
[JAVA] 멀티스레드 + GUI
< 지난시간 정리 > //용어 정리하기 JDBC java.sql Connection 클래스 - DB 종류 별로 정해지 url - 사용자가 설정한 DB의 Id - 사용자가 설정한 DB의 Password 를 사용해 DB에 연결할 수 있다. Statement 클래스 - SQL
thstnqls.tistory.com
* 프로세스 / 스레드 => 프로그램 튜닝
=> 게임
=> 채팅
* UI(user interface:일반디자인) : 디자이너 (웹디자이너..산출물: psd파일)
UX(user experience: 편리하게(산업디자인) : 디자이너 + 개발자 (퍼블리셔..프론트 개발자)
UI
CUI- prompt
GUI - 2D Graphic 중심으로 사용자 입력 출력 제공
2D Graphic - Color, Font
점 선 면..
=> GUI
awt(java.awt) => swing(javax.swing)
javafx - 최신
swt - eclipse
Container
Window(X)
JFrame(O) -프로그램 당 1개
JDialogue - 팝업창
JPanel
JFrame
1. 상속(O)
2. 객체변수
레이아웃
1. 자동레이아웃
2. 수동레이아웃
Absolute(Null) Layout
배치
다른 컴포넌트(위젯)
다른 컨테이너
이벤트
코딩
=> WindowBuilder
WindowBuilder로 작업한 내용만 import
프로젝트 만들 때 (default)
1. 600*800으로 프레임 크기 맞추기
2. resizable을 false로 설정
3. Layout을 absolute로 설정
Label - JLabel
* 아이콘 삽입
- 프로젝트 파일에 아이콘png파일 넣고 아래 사진과 같이 설정하면 아이콘이 뜬다
JFrameEx02.java - 아이콘 삽입하기 |
import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JLabel; import java.awt.Font; import javax.swing.SwingConstants; import javax.swing.ImageIcon; public class JFrameEx02 extends JFrame { private JPanel contentPane; private JLabel lbl1; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { JFrameEx02 frame = new JFrameEx02(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public JFrameEx02() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); //frame의 크기 default 로 600*800으로 지정하기 contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); lbl1 = new JLabel("<html> <body><font color='red'>라벨1</font><br /> 라벨2</body></html>"); //html을 사용하면 엔터키나 색을 사용할 수 있다. lbl1.setFont(new Font("HY견명조", Font.PLAIN, 14)); lbl1.setBounds(31, 41, 123, 88); //label의 영역을 지정 System.out.println(lbl1.getText()); contentPane.add(lbl1); JLabel lbl2 = new JLabel(""); lbl2.setIcon(new ImageIcon("C:\\Users\\KITCOOP\\Downloads\\Icon.png")); lbl2.setBounds(31, 170, 341, 113); contentPane.add(lbl2); } } |
JButtonEx01.java - background와 foreground를 통해 버튼의 색상조정 + 클릭 이벤트 부여 |
import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JButton; import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; public class JButtonEx01 extends JFrame { private JPanel contentPane; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { JButtonEx01 frame = new JButtonEx01(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public JButtonEx01() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JButton btn1 = new JButton("버튼1"); btn1.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { System.out.println("버튼 1 클릭!"); } }); btn1.setForeground(Color.RED); btn1.setBackground(Color.BLUE); btn1.setBounds(12, 10, 97, 23); contentPane.add(btn1); JButton btn2 = new JButton("New button"); btn2.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { System.out.println("버튼 2 클릭!"); } }); btn2.setIcon(new ImageIcon("C:\\Users\\KITCOOP\\Downloads\\Icon.png")); btn2.setBounds(12, 43, 281, 127); contentPane.add(btn2); } } |
기존 프로그램 - 순차처리
GUI - 이벤트 중심 (이벤트가 돌지 않으면 무한루프같이 멈춰있는 것이다)
JTextFieldEx01.java - 버튼으로 입력 후 label로 출력하기 |
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 java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JLabel; public class JTextFieldEx01 extends JFrame { private JPanel contentPane; private JTextField textField1; //textfield는 이미 인스턴스변수로 선언되어 있다 private JLabel lbl1; private JTextField textField2; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { JTextFieldEx01 frame = new JTextFieldEx01(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public JTextFieldEx01() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); textField1 = new JTextField(); textField1.setBounds(12, 22, 229, 21); contentPane.add(textField1); textField1.setColumns(10); JButton btn1 = new JButton("New button"); btn1.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { lbl1.setText(textField1.getText()); //textField1의 내용을 get후 lbl1에 set한다. textField2.setText(textField1.getText()); } }); btn1.setBounds(12, 55, 229, 23); contentPane.add(btn1); lbl1 = new JLabel("New label"); lbl1.setBounds(12, 88, 229, 15); contentPane.add(lbl1); textField2 = new JTextField(); textField2.setEditable(false); // 편집기능을 빼면 출력용으로 사용 가능하다 textField2.setBounds(12, 113, 229, 21); contentPane.add(textField2); textField2.setColumns(10); } } |
* JTextFieldEx02.java - 이름 앞글자 대문자로 바꾸기 (hong gil dong -> Hong Gil Dong) |
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 java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.border.TitledBorder; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class JTextFieldEx02 extends JFrame { private JPanel contentPane; private JTextField textField1; private JTextField textField2; private JPanel panel; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { JTextFieldEx02 frame = new JTextFieldEx02(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public JTextFieldEx02() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); panel = new JPanel(); panel.setBorder(new TitledBorder(null, "이름 대문자로 바꾸기", TitledBorder.LEADING, TitledBorder.TOP, null, null)); panel.setBounds(12, 10, 560, 122); contentPane.add(panel); panel.setLayout(null); textField1 = new JTextField(); textField1.setBounds(12, 17, 536, 21); panel.add(textField1); textField1.setColumns(10); JButton btn1 = new JButton("변경"); btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); btn1.setBounds(12, 49, 536, 23); panel.add(btn1); textField2 = new JTextField(); textField2.setBounds(12, 82, 536, 21); panel.add(textField2); textField2.setEditable(false); textField2.setColumns(10); btn1.addMouseListener(new MouseAdapter() { //처리부 @Override public void mouseClicked(MouseEvent e) { textField2.setText(Capitalize(textField1.getText())); } }); } public String Capitalize(String name) { //모듈화 String[] text2=name.split(" "); String result=""; for(int i=0;i<text2.length;i++) { result+=text2[i].substring(0,1).toUpperCase()+text2[i].substring(1)+" "; } return result; } } |
=> panel로 기능을 묶어 표현할 때는 기능들을 shift로 묶고 오른쪽 클릭 => surround with => border 시킨다.
=> 클릭이벤트에 처리로직을 두지 않고 따로 메소드화 시켜서 깔끔하게 처리만 할 수 있도록 한다.
=> scrollPane선택 -> horizontal 설정 -> always 혹은 필요할때만 사용가능
=> textarea를 통해 여러줄 작성 가능 (editable을 false로 하여 출력용으로도 가능)
JTextAreaEx01.java - textarea 사용하기 (구구단 출력하기) |
import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JTextArea; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.border.TitledBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class JTextAreaEx01 extends JFrame { private JPanel contentPane; private JTextField textField1; private JTextArea textArea1; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { JTextAreaEx01 frame = new JTextAreaEx01(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public JTextAreaEx01() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JPanel panel = new JPanel(); panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, new Color(255, 255, 255), new Color(160, 160, 160)), "\uAD6C\uAD6C\uB2E8", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0))); panel.setBounds(16, 19, 545, 52); contentPane.add(panel); panel.setLayout(null); JLabel lbl1 = new JLabel("단수입력 :"); lbl1.setBounds(6, 21, 57, 15); panel.add(lbl1); textField1 = new JTextField(); textField1.setBounds(75, 18, 305, 21); panel.add(textField1); textField1.setColumns(10); JButton btn1 = new JButton("구구단 출력"); btn1.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { textArea1.setText(gugudan(textField1.getText())); //overwrite // textArea1.append(gugudan(textField1.getText())); 이어쓰기
} }); btn1.setBounds(392, 17, 137, 23); panel.add(btn1); JScrollPane scrollPane1 = new JScrollPane(); scrollPane1.setBounds(12, 82, 548, 581); contentPane.add(scrollPane1); textArea1 = new JTextArea(); scrollPane1.setViewportView(textArea1); textArea1.setEditable(false); } public String gugudan(String num) { String result=""; for(int i=1; i<=9;i++) { result+= num+"x"+i+"="+ Integer.parseInt(num)*i+"\n"; } return result; } } |
*append를 사용하여 구구단 만들기 (다른방식, 마우스 이벤트 부분만 변경해서 사용하면 된다.)
데이터(베이스) 연결 클래스 :DAO(Data Access Object)
데이터 전송 클래스: TO(Transfer Object)
: VO(Value Object)
-> db사용 전 드라이브 연결 필수
ZopcodeSearchEx01.java |
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.border.TitledBorder; import javax.swing.JTextArea; import javax.swing.JScrollPane; import javax.swing.border.EtchedBorder; import java.awt.Color; 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 ZipcodeSearchEx01 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 { ZipcodeSearchEx01 frame = new ZipcodeSearchEx01(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public ZipcodeSearchEx01() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JPanel panel = new JPanel(); panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, new Color(255, 255, 255), new Color(160, 160, 160)), "\uC6B0\uD3B8\uBC88\uD638 \uAC80\uC0C9\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0))); panel.setBounds(6, 12, 566, 70); contentPane.add(panel); panel.setLayout(null); textField = new JTextField(); textField.setBounds(12, 24, 416, 21); panel.add(textField); textField.setColumns(10); JButton btn = new JButton("우편번호 검색"); btn.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { String strDong = textField.getText(); textArea.setText( "" ); String url = "jdbc:mariadb://localhost:3306/project"; String user = "project"; 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 = "select zipcode, sido, gugun, dong, ri, bunji from zipcode where dong like ?"; pstmt = conn.prepareStatement( sql ); pstmt.setString( 1, strDong + "%" ); rs = pstmt.executeQuery(); while( rs.next() ) { //System.out.println( rs.getString( "zipcode" ) ); 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" ); String address = String.format("[%s] %s %s %s %s %s", zipcode, sido, gugun, dong, ri, bunji ); //System.out.println( address ); textArea.append( address + System.lineSeparator() ); } } catch (ClassNotFoundException e1) { // TODO Auto-generated catch block System.out.println( "에러 " + e1.getMessage() ); } catch (SQLException e1) { // TODO Auto-generated catch block 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(440, 23, 114, 23); panel.add(btn); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(12, 95, 560, 656); contentPane.add(scrollPane); textArea = new JTextArea(); textArea.setEditable(false); scrollPane.setViewportView(textArea); } } |
ZipcodeSearchEx02.java |
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.border.TitledBorder; import javax.swing.JTextArea; import javax.swing.JScrollPane; import javax.swing.border.EtchedBorder; import java.awt.Color; 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; import java.util.ArrayList; public class ZipcodeSearchEx02 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 { ZipcodeSearchEx02 frame = new ZipcodeSearchEx02(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public ZipcodeSearchEx02() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JPanel panel = new JPanel(); panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, new Color(255, 255, 255), new Color(160, 160, 160)), "\uC6B0\uD3B8\uBC88\uD638 \uAC80\uC0C9\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0))); panel.setBounds(6, 12, 566, 70); contentPane.add(panel); panel.setLayout(null); textField = new JTextField(); textField.setBounds(12, 24, 416, 21); panel.add(textField); textField.setColumns(10); JButton btn = new JButton("우편번호 검색"); btn.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { String strDong = textField.getText(); textArea.setText( "" ); ZipcodeDAO dao = new ZipcodeDAO(); ArrayList<ZipcodeTO> datas = dao.searchZipcode(strDong); //System.out.println( datas ); for( ZipcodeTO to : datas ) { String address = String.format( "[%s] %s %s %s %s %s", to.getZipcode(), to.getSido(), to.getGugun(), to.getDong(), to.getRi(), to.getBunji() ); textArea.append( address + System.lineSeparator() ); } } }); btn.setBounds(440, 23, 114, 23); panel.add(btn); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(12, 95, 560, 656); contentPane.add(scrollPane); textArea = new JTextArea(); textArea.setEditable(false); scrollPane.setViewportView(textArea); } } |
ZipcodeDAO.java |
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; public class ZipcodeDAO { private Connection conn; // 데이스베이스 연결 public ZipcodeDAO() { // TODO Auto-generated constructor stub String url = "jdbc:mariadb://localhost:3306/project"; String user = "project"; String password = "123456"; try { Class.forName( "org.mariadb.jdbc.Driver" ); this.conn = DriverManager.getConnection( url, user, password ); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block System.out.println( "[에러] : " + e.getMessage() ); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println( "[에러] : " + e.getMessage() ); } // finally(X) } // 각 쿼리별로 메서드 생성 public ArrayList<ZipcodeTO> searchZipcode( String strDong ) { //public ArrayList<String> searchZipcode( String strDong ) { PreparedStatement pstmt = null; ResultSet rs = null; ArrayList<ZipcodeTO> datas = new ArrayList<ZipcodeTO>(); try { String sql = "select zipcode, sido, gugun, dong, ri, bunji from zipcode where dong like ?"; pstmt = this.conn.prepareStatement( sql ); pstmt.setString( 1, strDong + "%" ); rs = pstmt.executeQuery(); while( rs.next() ) { ZipcodeTO to = new ZipcodeTO(); to.setZipcode( rs.getString( "zipcode" ) ); to.setSido( rs.getString( "sido" ) ); to.setGugun( rs.getString( "gugun" ) ); to.setDong( rs.getString( "dong" ) ); to.setRi( rs.getString( "ri" ) ); to.setBunji( rs.getString( "bunji" ) ); datas.add( to ); } } catch (SQLException e) { // TODO Auto-generated catch block System.out.println( "[에러] : " + e.getMessage() ); } finally { if( rs != null ) try { rs.close(); } catch( SQLException e ) {} if( pstmt != null ) try { pstmt.close(); } catch( SQLException e ) {} if( conn != null ) try { conn.close(); } catch( SQLException e ) {} } return datas; } } |
ZipcodeTO.java |
public class ZipcodeTO {
// DTO / VO // table의 열 또는 select 열을 생각하면서(중요) // 멤버필드를 설정 private String zipcode; private String sido; private String gugun; private String dong; private String ri; private String bunji; private String seq; public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } public String getSido() { return sido; } public void setSido(String sido) { this.sido = sido; } public String getGugun() { return gugun; } public void setGugun(String gugun) { this.gugun = gugun; } public String getDong() { return dong; } public void setDong(String dong) { this.dong = dong; } public String getRi() { return ri; } public void setRi(String ri) { this.ri = ri; } public String getBunji() { return bunji; } public void setBunji(String bunji) { this.bunji = bunji; } public String getSeq() { return seq; } public void setSeq(String seq) { this.seq = seq; } } |
DAO와 DTO에 대해 이해하기
'Programming > JAVA' 카테고리의 다른 글
[JAVA] GUI(4) (0) | 2023.09.15 |
---|---|
[JAVA] GUI(3) (0) | 2023.09.14 |
[JAVA] 멀티스레드 + GUI(1) (0) | 2023.09.12 |
[JAVA] Data/객체 입출력 (0) | 2023.09.01 |
[JAVA] 파일 입출력 (0) | 2023.08.31 |