즐겁게!! 자신있게!! 살아보세!!

재밌는 인생을 위하여! 영촤!

Language_Study/JAVA

[JAVA, App] 17.자바GUI

Godwony 2020. 12. 27. 12:11
728x90
반응형

Java GUI

1.awt

  • 운영체제의 자원을 이용해서 GUI 프로그래밍
  • 운영체제 별로 다르게 출력될 수 있습니다.
  • 운영체제에 종속적이라고 느리고 무겁습니다.

2.swing

  • jvm 자원을 이용해서 GUI 프로그래밍
  • 운영체제에 독립적이고 속도가 awt 보다는 빠릅니다.
  • swing 의 대부분의 클래스는 awt로부터 상속받았습니다.

3.javaFX

  • 가볍고 풍부한 UI 제공
  • 레이아웃, 스타일, 애플리케이션 로직의 분리: MVC 구현
  • html 이나 css 도 사용이 가능
  • swing으로 만들어져 있는 많은 애플리케이션들이 javaFX로 변환되고 있는 중

4.awt 와 swing의 이벤트 처리 방식이 안드로이드 이벤트 처리 방식

  • awt 와 swing은 이벤트 처리 클래스가 별도의 클래스로 존재하는데 안드로이드에서는 뷰의 내부 클래스로 존재

AWT

  • 운영체제에 종속적인 GUI 프로그래밍
  • 최근에는 거의 사용 안함

1.GUI 화면 구성 요소

1) Component

  • 화면에 보여지는 개체들의 최상위 클래스

2) Container

  • Component로 부터 상속을 받아서 다른 컴포넌트들을 묶어서 출력하기 위한 컴포넌트
  • 단독으로 출력가능한 객체: Frame, Dialog
  • 단독으로는 출력이 안되는 객체: Panel, Window
  • 브라우저를 이용해서 출력하는 객체: Applet - 사용을 금기시 함
    • HTML5에서는 별도의 플러그 인 없이 웹 애플리케이션을 구현하자는 주의여서 active-X, applet, flash 등의 사용을 배체

2.Component 의 주요 메소드

Color getBackground(), void setBackground(Color color) -> 배경색 관련 메소드
Cursor getCursor(), void setCursor(Cursor cursor) -> 마우스 커서 관련 메소드
Font getFont(), void setFont(Font font) ->폰트
Color getForeground(), void setForeground(Color color) -> 글자 색
Point getLocation(), void setLocation(Point point) ->좌표
Dimension getSize(), void setSize(Dimension dimension)->크기
    * 크기와 좌표는 분할해서 2개로 설정해도 됩니다.
Rectangle getBounds(), void setBounds(Rectanlgle rectangle)-> 좌표와 크기
    * 숫자 4개로 설정이 가능
    * 위치의 기본값은 0,0 크기의 기본값도 0,0

void setEnabled(boolean isEnabled): 활성화 여부 설정
void setVisible(boolean isVisible): 화면 출력 여부

3.Frame

  • 애플리케이션의 가장 기본이 되는 윈도우
  • 기본적으로 화면에 출력되지 않도록 설정되어 있기 때문에 setVisible을 호출해서 화면에 보여지도록 설정해야 합니다.
  • setTitle을 이용하면 제목을 설정할 수 있습니다.
  • 종료버튼이 제공이 되지만 기능은 없습니다.
    • 나중에 이벤트 처리를 해야만 창을 종료 할 수 있습니다.

4.Component를 다른 Component에 추가할 때는 add(Component component)를 호출하면 추가됩니다.

5.윈도우 생성

  • 제공되는 클래스를 사용할 때 제공되는 클래스의 인스턴스를 바로 만들어서 사용하는 경우인데 기능이 충분해서 인스턴스 생성만으로 옵션들을 설정해서 사용합니다.
  • 상속받아서 사용하는 경우는 기능이 부족해서 기능을 추가해서(Overriding) 사용하기 위해서 입니다.
    초기화 작업을 추가하거나 메소드 오버라이딩을 해서 사용

1) Frame 인스턴스를 만들어서 출력

2) Frame으로부터 상속받는 클래스를 만들고 클래스의 인스턴스를 만들어서 출력

  • 이 방법이 권장
  • 생성자를 만들어서 필요한 옵션을 설정

6.Panel

  • 단독으로는 출력될 수 없는 컨테이너로 여러 컴포넌트들을 묶어서 출력하기 위한 객체

1) 생성자

  • Panel(): 기본 배치 방법으로 생성
  • Panel(LayoutManager layoutManager): 배치 방법을 설정해서 생성

2) 주요 메소드

  • add(Component component): 패널위에 컴포넌트를 추가

7.Dialog(대화상자)

1) Modal 과 Modeless

  • Modal: 화면에 출력되어 있으면 다른 곳으로 제어권을 뺐기지 않는 대화상자, 열기와 저장 대화상자

  • Modeless: 화면에 출력된 상태에서 다른 곳으로 제어권을 옮길 수 있는 대화상자, 찾기와 바꾸기

    • 옵션을 대화상자에서 변경하고 바로 적용하고자 할 때 사용
  • modeless는 지역변수로 만들면 나중에 대화상자를 닫지 못하는 경우가 발생할 수 있습니다.

2) 생성자

  • Dialog(Frame 이나 Dialog owner): 대화상자가 닫히고 난 후 포커스를 받을 윈도우를 설정해서 생성
    Dialog(Frame 이나 Dialog owner, String title)
    Dialog(Frame 이나 Dialog owner, boolean modal)
    Dialog(Frame 이나 Dialog owner, String title, boolean modal)

8.Button

1) 생성자
Button()
Button(String title)

2) 메소드
String getLabel()
void setLabel(String label)

9.CheckBox

1) 생성자
CheckBox()
CheckBox(String title)
CheckBox(String title, boolean state)
CheckBox(String title, CheckboxGroup group, boolean state)

  • CheckboxGroup 인스턴스를 생성해서 대입하면 라디오 버튼

10.Choice

  • 여러 개의 항목을 출력하고 그 중에 하나를 선택할 수 있도록 해주는 컴포넌트

1) 생성자
Choice()

2) 메소드
void add(String item)
String getItem(int index)
int getItemCount()
int getSelectedIndex(): 선택된 인덱스를 리턴
String getSelectedItem(): 선택된 문자열을 리턴
void remove(int index 또는 String item)

11.Label

  • 텍스트 출력 컴포넌트

1) 생성자
Label()
Label(String text)
Label(String text, int alignment): 맞춤을 지정해서 출력

  • alignment는 정수지만 옵션이기 때문에 직접 숫자를 설정하지 않고 클래스의 상수 이용

2) 메소드
String getText()
void setText(String text)
void setAlignment(int alignment)

12.List

  • 여러 개의 항목을 출력하고 선택할 수 있도록 해주는 컴포넌트
  • Multiple Mode 설정을 이용해서 여러 개 선택이 가능

1) 생성자
List()
List(int rows): 보여 줄 행의 개수
List(int rows, boolean multipleMode): 행의 개수를 설정하고 다중 선택 모드를 설정

2) Choice의 메소드에 추가
int [] getSelectedIndexes(): 여러 개 선택한 경우 선택된 인덱스를 배열로 리턴
String [] getSeletedItems()

13.TextField

  • 한 줄의 문자열을 입력받는 컴포넌트

1) 생성자
TextField()
TextField(int columns): 크기(글자 개수) 설정
TextField(String text): 초기 문자열
TextField(String text, int columns): 초기 문자열

2) 메소드
void setEchoChar(char ch): 화면에 보여질 문자

14.TextArea

  • 여러 줄 입력받는 컴포넌트
  • TextArea(String text, int rows, int columns, int scrollbars)

15.ScrollPane

  • GUI 프로그래밍에서는 자신의 부모보다 더 큰 콘텐츠는 화면에 출력할 수 없습니다.
    • 부모보다 큰 경우에는 Scroll이 가능한 컴포넌트에 배치를 해서 스크롤 바를 이용해서 보여주도록 해야 합니다.
  • 생성자
    • ScrollPane(int 스크롤바정책): 항상 보여줄 것인지 아니면 필요할 때만 보여줄 것인지 등

16.메뉴

  • MenuBar, Menu, MenuItem(CheckboxMenuItem)
  • MenuBar 인스턴스를 만들고 Frame에 add
  • Menu를 만들고 Menu는 MenuBar에 add, Menu를 만들 때는 문자열과 함께 생성
  • MenuItem 이나 Menu를 만들어서 Menu에 부착

17.Common Dialog

=>자주 사용하는 기능의 대화상자를 미리 만들어서 제공
=>awt 에서는 FileDialog 를 제공

1) FileDialog의 생성자

  • FileDialog(Frame owner, String title, int mode): mode는 열기 대화상자인지 저장 대화상자로 만들것인지 결정 - FileDialog.LOAD, FileDialog.SAVE

2) FileDialog의 메소드

  • String getFile(): 선택한 파일명 리턴

  • String getDirectory(): 선택한 디렉토리명 리턴

  • void setFile(String file): 파일을 선택

  • void setDirectory(String directory): 디렉토리를 선택

18.Layout

  • 컨테이너에 컴포넌트를 배치하는 방법
  • Panel은 생성할 때 설정이 가능하고 Frame 과 Panel 모두 setLayout 메소드를 이용해서 변경도 가능

1) FlowLayout

  • Panel의 기본 배치 방법으로 가로 방향으로 컴포넌트를 배치하고 더 이상 공간이 없으면 아래쪽으로 배치
  • new FlowLayout() 으로 생성

2) BorderLayout

  • Frame 의 기본 배치 방법으로 동서남북 그리고 중앙에 하나의 컴포넌트만 배치하는 방법
    • add 를 다른 옵션없이 사용하면 중앙에 1개만 배치됩니다.
  • 각 방향에 배치를 할 때는 add(String 방향, Component component)로 배치
  • 방향은 대소문자 구분을 함(East, West, North, South, Center)
  • 동서남북에 배치가 안되면 그 영역은 전부 Center의 영역
  • 하나의 영역에 하나의 컴포넌트만 배치가 가능한데 컴포넌트를 Panel로 만들어서 배치하면 여러 개도 배치 가능

3) GridLayout

  • 격자(표) 모양의 레이아웃
  • 하나의 셀에 하나의 컴포넌트를 배치
  • add를 호출하면 순서대로 배치
  • 셀이 부족하면 자동으로 늘어남
  • new GridLayout(int 행의 수, int 열의 수)로 만들어서 setLayout 메소드에 대입

4) CardLayout

  • 화면에 하나씩 겹쳐서 배치

5) null

  • 지금까지의 레이아웃은 크기 조절이나 위치 조정을 못합니다.
  • 레이아웃에 null을 설정하면 컴포넌트들의 위치나 크기를 조절할 수 있습니다.
  • 위치나 크기를 조절 할 때 해상도나 전체 화면 크기를 고려해서 절대값보다는 상대적인 값으로 설정하는 것을 권장합니다.
  • 화면에 배치되는 모든 컴포넌트들의 좌표와 크기를 설정해야 합니다.

Swing

  • jvm의 자원을 이용해서 GUI(Graphic User Interface) 프로그래밍
  • 플랫폼에 독립적인 프로그래밍
  • AWT 보다 속도도 빠르고 효율적

Container

1.JFrame

  • 윈도우 클래스
  • 종료 기능을 부여할 때는 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)를 호출
  • pack이라는 메소드를 제공해서 윈도우 전체 크기를 하위 Component 들을 배치한 크기로 설정
  • setIconImage(Image image)를 이용해서 아이콘 설정 가능

2.전체 화면 크기 구하기

Tookit toolkit = Tookit.getDefaultToolkit();
Dimension size = toolkit.getScreenSize();

3.JPanel

  • 패널 클래스
  • 생성자에 Panel(boolean isDoubleBuffered): 더블 버퍼링 여부를 설정
    • 더블 버퍼링: 출력할 내용을 메모리에 저장해두고 출력하는 방식
    • 메모리 사용량은 늘어나지만 다음에 다시 출력할 때 출력 속도를 빠르게 해줍니다.

4.JScrollPane

  • 스크롤 기능을 가진 클래스
  • 부모 화면보다 큰 컴포넌트를 배치할 때 사용
  • 생성자를 호출해서 인스턴스를 만들 때 하위 컴포넌트를 대입

Swing 의 일반 컴포넌트

1.경계선 설정 가능(Border)

  • setBorder 메소드에 AbstractBorder 클래스의 하위 클래스 인스턴스를 대입하면 경계선이 만들어집니다.
  • AbstractBorder 클래스의 하위 클래스: BevelBorder, CompoundBorder, EmptyBorder, EctchedBorder, TitledBorder 등

2.컴포넌트에 마우스를 올리면 보여지는 tooltip 설정 가능

  • setTooltipText 메소드에 문자열을 대입하면 툴팁이 만들어집니다.

3.JLabel

  • 문자열 출력을 위한 컴포넌트

  • 생성자에서 Icon 을 대입하면 이미지 출력 가능

    • 맞춤 설정도 가능합니다.
  • 실습 - 이미지 교체 레이블

public class MyFrame extends JFrame {
    public MyFrame() {

        JPanel p = new JPanel();
        //JLabel lbl = new JLabel("문자열");
        //이미지를 가지고 아이콘을 생성
        //이미지 파일 크기 그대로 생성됩니다.
        ImageIcon icon = new ImageIcon("C:\\Users\\admin\\Documents\\heli1.png");
        JLabel lbl = new JLabel(icon);
        p.add(lbl);

        add(p);

        setTitle("이미지 레이블");
        setLocation(100,100);
        setSize(1000,1000);
        setVisible(true);
        //종료 기능 부여
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        int i=0;
        while(true) {
            try {
                Thread.sleep(100);
                icon = new ImageIcon("C:\\Users\\admin\\Documents\\heli" 
                        + (i%3) +".png");
                lbl.setIcon(icon);
                i = i + 1;
            }catch(Exception e) {}
        }

    }
}

4.버튼

  • AbstractButton(추상 클래스) 클래스로부터 상속받은 클래스를 이용
  • JButton, JToggleButton, JRadioButton, JCheckBox 등 으로 구분
  • 현재 윈도우에 버튼을 추가해서 버튼을 누를 때 마다 애니메이션을 시작하고 중지하는 기능을 구현
  • 일반적인 로직은 실행 중간에 멈출 수 없습니다.
    • 실행 중간에 멈출 수 있도록 만들려면 스레드를 이용해야 합니다.
  • 스레드를 만들어야 하는 순간
    • 중간중간 다른 작업을 수행할 수 있도록 만들어야 할 때
    • 실행 중간에 멈출 수 있도록 해야 할 때
    • 네트워크에서 다운로드나 업로드를 받을 때(오랜 시간이 걸리는 작업)
public class MyFrame extends JFrame {
    JLabel lbl;
    ImageIcon icon;
    JButton btn;
    //애니메이션을 수행할 스레드 변수
    Thread th;
    public MyFrame() {


        JPanel p = new JPanel();
        //JLabel lbl = new JLabel("문자열");
        //이미지를 가지고 아이콘을 생성
        //이미지 파일 크기 그대로 생성됩니다.
        icon = new ImageIcon("C:\\Users\\admin\\Documents\\heli1.png");
        lbl = new JLabel(icon);
        p.add(lbl);

        //버튼을 만들어서 패널에 추가
        btn = new JButton("시작");
        p.add(btn);

        //버튼을 누를 때 이벤트 처리를 위한 인스턴스를 생성
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {

                switch(arg0.getActionCommand()) {
                case "시작":
                    btn.setText("중지");
                    //스레드를 생성해서 시작
                    th = new Thread() {
                        String [] images = {"heli1.png", "heli2.png", "heli3.png"};
                        public void run() {
                            try {
                                int i=0;
                                while(true) {
                                    //0.1초마다 대기
                                    Thread.sleep(100);
                                    //아이콘 생성
                                    icon = new ImageIcon(
                                        "C:\\Users\\admin\\Documents\\" + 
                                    images[i%images.length]);
                                    lbl.setIcon(icon);

                                    i=i+1;
                                }
                            }catch(InterruptedException e) {
                                return;
                            }
                        }
                    };
                    th.start();

                    break;
                case "중지":
                    btn.setText("시작");
                    //스레드를 중지
                    th.interrupt();
                    break;
                }

            }
        };
        btn.addActionListener(listener);

        add(p);

        setTitle("이미지 레이블");
        setLocation(100,100);
        setSize(1000,1000);
        setVisible(true);
        //종료 기능 부여
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
    }
}

5.JTextField

  • 한 줄의 문자열을 입력받기 위한 컴포넌트
  • 현재 커서의 위치를 getCaretPosition으로 가져오고 setCaretPosition(int position)으로 설정
    • 마우스 포인터를 cursor 하는 경우도 있지만 caret이라고 하는 경우도 있습니다.
    • cursor는 데이터를 행 단위로 하나씩 접근하는 포인터의 의미로도 사용

6.JPasswordField

  • 비밀번호를 입력받기 위한 컴포넌트
  • 보여지는 문자를 echoChar 라고 합니다.
  • 입력한 내용을 가져올 때는 getText 가 deprecated 되서 getPassword를 사용하는 것을 권장

7.JTextArea

  • 여러 줄 입력을 위한 컴포넌트
  • 줄 바꿈 모드 설정을 위한 setLineWrap(boolean wrap), setWrapStyle(boolean word): 단어 단위 줄바꿈

8.JComboBox

  • 콤보박스
  • 여러 개의 항목 중에서 화면에 하나만 출력하고 하나만 선택할 수 있도록 해주는 컴포넌트

9.JList

  • 리스트 박스
  • 여러 개의 항목 중 여러 개를 화면에 출력할 수 있고 여러 개를 선택하도록 할 수 있도록 해주는 컴포넌트
  • JComboBox 와 JList는 용도가 Radio 와 CheckBox와 같은데 항목이 많을 때 Radio 와 CheckBox는 영역을 너무 많이 차지 하기 때문에 이런 경우에는 ComboBox 와 List를 사용

10.JTable

  • 테이블 모양으로 데이터를 출력하는 컴포넌트

1) 생성자

  • JTable(): 비어있는 상태로 생성
  • JTable(int rows, int cols): 행과 열 수를 지정해서 생성
  • JTable(TableModel model): 데이터 모델을 이용해서 생성 - MVC 구현을 위해서 존재

2) 데이터 출력

  • setValueAt(Object value, int row, int col) : row 와 col에 해당하는 셀에 value의 toString의 결과를 출력

setModel(TableModel model): 테이블 모델을 만들어서 출력

3) DefaultTableModel

DefaultTableModel()
DefaultTableModel(int 행개수, int 열개수)
DefaultTableModel(Object [][] data, Object [] columnNames): 첫번째 매개변수는 셀에 출력할 데이터의 이차원배열이고 뒤의 데이터는 컬럼이름 배열

4) 테이블 모델을 이용해서 데이터를 설정한 경우의 데이터 편집
addRow(Object [] data)
insertRow(int row, Object [] data)
moveRow(int start, int end, int to): start 부터 end 까지의 행을 to 위치로 이동
updateUI(): 다시 출력

5) 테이블 모델을 이용하기를 권장하는 이유

  • JTable은 출력하는 모양에만 관여를 하고 실제 데이터의 삽입과 삭제는 TableModel이 관여

Pane

  • 특정 목적에만 이용하도록 만든 컴포넌트

1.JScrollPane

  • 스크롤을 만들어주는 컴포넌트

2.JEditorPane

  • 텍스트를 출력하기 위한 컴포넌트
  • TextArea 와 다른 점은 URL을 연결해서 html을 출력할 수 있고 rtf 포맷도 출력이 가능

3.JTabbedPane

  • 탭을 만들기 위한 컴포넌트

4.javax.swing.JOptionPane

  • 메시지나 한 줄의 입력을 받기 위한 대화상자

1) MessageDialog

  • 단순 메시지 출력을 위한 대화상자
  • JOptionPane.showMessageDialog()를 이용해서 생성

2) ConfirmDialog

  • 버튼을 2개 이상 배치해서 선택한 버튼에 따라 다른 작업을 하고자 할 때 사용
  • JOptionPane.showConfirmDialog()를 이용해서 생성
    • 누른 버튼의 인덱스를 리턴합니다.

3) InputDialog

  • 하나의 텍스트필드를 배치해서 한 줄의 텍스트를 입력받을 수 있는 대화상자
  • JOptionPane.showInputDialog()를 이용해서 생성
    • 확인 버튼을 누르면 입력한 내용이 String으로 리턴되고 취소버튼을 누르면 null 이 리턴됩니다.
    • 입력한 내용이 없는데 확인을 누르면 null이 아니고 ""가 리턴됩니다.

메뉴

  • JMenuBar, JMenu, JMenuItem(JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem)
  • 메뉴에 setMnemonic(int 단축키)를 설정하면 ALT 와 조합해서 단축키로 사용 가능
    • 응용프로그램을 만들 때 ALT 를 포함해서 단축키를 만드는 것은 권장하지 않습니다.

Stream

1.입출력 Stream

2.1.8에서 등장한 Map Reduce 프로그래밍을 위한 스트림

728x90
반응형

'Language_Study > JAVA' 카테고리의 다른 글

[JAVA, App] 19.통신  (0) 2020.12.27
[JAVA, App] 18.Stream  (0) 2020.12.27
[JAVA, App] 16.이벤트처리  (0) 2020.12.27
[JAVA, App] 15.MutualExclusion  (0) 2020.12.27
[JAVA, App] 14.기본API클래스  (0) 2020.12.27