매일 조금씩

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
728x90
반응형

 

▷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);
	}

}

 

 

 

 

 

 

728x90
반응형