본문 바로가기

JAVA 공책/수업 메모

Swing



Swing

1. javax.swing.JList

여러개의 항목을 출력하고 그 중 여러 개의 항목을 선택할 수 있도록 해주는 컴포넌트
데이터 없이 생성할 수 있고 Generic과 배열을 이용해서 생성할 수 있고 Vector를 이용해서 생성할 수 있습니다.

package swing;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;

//frame이나 Jframe을 상속하면 윈도우 클래스가 만들어집니다.
public class B_SwingJListPractice extends JFrame {
    // 자료는 보통 여기서 만듭니다.
    String[] data = { "Encapsulation", "Inheritance", "Polymorphism", "Information Hiding" };

    public B_SwingJListPractice() {
        
        // 메소드가 찾기 어려우면 어차피 JFrame에서 가져오는 메소드이기 때문에 this.으로 메소드를 찾아도 됩니다.
        // 이름이 겹치지 않는다면 나중에 this.은 제거해도 괜찮습니다.
        this.setBounds(100, 100, 400, 400);
        this.setTitle("Swing");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.pack();
        // 만들 때 제너릭을 조정하세요 제너릭=<String>
        JList<String> list = new JList<>(data);
        JComboBox<String> combo = new JComboBox<>(data);
        
        // 패널 설치
        JPanel p = new JPanel();
        p.add(list);
        p.add(combo);
        
        add(p);
        setVisible(true);
    }
}


2. Javax.swing.JTable

행과 열로 구성된 데이터를 출력하기 위한 스윙의 컴포넌트

1) MVC

Model: 데이터를 만드는 부분

View: 데이터를 출력하는 부분

Controller: Model과 View를 연결시켜주는 부분

MVC Pattern 역할 별로 별도로 구현해서 어느 한 부분에 변화가 생기더라도 다른 부분을 수정하지 않아도되도록 구현하는 패턴

즉, Model에 변화가 생기더라도 View를 수정할 필요가 없도록 하는 패턴

2) Swing의 JTable은 데이터를 만드는 TableModel 과 화면출력을 위한 JTable을 별도로 구현해서 연결하는 방식을 취합니다.

데이터의 수정과 삭제는 TableModel을 이용하고 화면 출력은 JTable을 이용합니다.

TableModel에서 데이터를 수정하고 JTable에서 UpdateUI 메소드만 호출하면 변경된 내용이 JTable에 적용되서 출력이 되는 구조입니다.

3)JTable은 항상 JScollPane 위에 배치해야 출력 영역 크기를 벗어나게 되면 스크롤 바를 만들어 줍니다.

4)데이터는 컬럼 이름을 나타내는 1차원 배열 또는 Vector와, 셀에 보여질 데이터를 나타내는 2차원 배열 또는 Vector의 Vector가 있어야 합니다.

이 2가지 배열이나 Vector를 이용해서 TableModel을 만들고 이 Model을 JTable의 생성자에 대입하거나 setModel 메소드에 대입해서 연결시킵니다.

편집하기 위해서 가져올 때는 getModel 메소드를 이용합니다.

ex) 데이블에 데이터 출력(이름, 전화번호, 주소를 출력)


package swing;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class D_AdressBook extends JFrame {
     //컬럼 이름 배열
     String [] columns = {
              "이름","전화번호","주소"
     };
     String [][] data = {
              {"안정은","01054720094","인천광역시 계양구"},
              {"박보검","01000010001","대한민국 어딘가"},
              {"제임스맥어보이","01022002030","외국 어딘가"},
              {"앤해서웨이","01087839202","외국 멀리 어딘가"}
     };
     public D_AdressBook() {
         this.setBounds(100,100,400,400);
         this.setTitle("연락처");
         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
         
         //테이블 모델을 이용해서 테이블을 만들기
         DefaultTableModel model = new DefaultTableModel(data, columns);
         
         //테이블 모델을 이용해서 테이블 만들기
         // (1)처음에 데이터가 있을 때
         JTable table = new JTable(model);
         
         // (2)처음에 데이터가 없었을 때
         table.setModel(model);
         
         //출력영역의 크기보다 테이블이 커지더라도 스크롤바를 이용할 수 있도록 스크롤 생성
         JScrollPane scrollpane = new JScrollPane(table);
         
         //스크롤 패인을 프레임에 부착
         add(scrollpane);
         
         this.setVisible(true);
     }
}


3. JOptionPane

->미리 만들어 둔 대화상자
->메시지를 출력하는 대화상자, 예/아니오 와 같은 버튼을 선택하는 대화상자, 한 줄의 텍스트를 입력받는 대화상자가 있습니다.
->static 메소드인 showMessageDialog, showConfirmDialog, showInputDialog 를 호출해서 화면서 출력합니다.
->3가지 메소드 모두 3번째 매개변수까지는 동일한데(부모의 주소, 타이틀, 메시지입니다) 4번째 매개변수가 달라지게 됩니다.(MessageDialog-아이콘 모양을 설정해야 하고 ConfirmDialog는 버튼모양을 설정해야 하고 InputDialog는 YES_NO를 설정합니다.
->MessageDialog는 리턴하지 않고 ConfirmDialog는 누른 버튼 값을 정수로 리턴하고InputDialog는 예를 누르면 입력한 텍스트를 String으로 리턴하고 아니오를 누르면 null을 리턴합니다.

4. Common Dialog

GUI 프로그램을 할 때 자주 사용하는 기능의 대화상자를 미리 만들어서 제공

->Swing에서는 파일을 선택하고 저장할 수 있는 JFileChooser와 색상을 선택할 수 있는 JColorChooser를 제공합니다

5.Menu

->메뉴는 프로그램의 상단에 고정적으로 부착되는 메뉴와 화면에 떠다니는 메뉴(Popup Menu)로 구분합니다.

->JMenuBar, JMenu, JMenuItem(체크박스와 라디오 버튼 메뉴 아이템도 있음)으로 구성

->JMenu와 JMenuItem은 setMnemonic(int key)를 이용해서 ALT+key로 단축키를 만들 수 있습니다.

1)상단메뉴

->JMenuBar를 만들어서 프레임에 부착

->JMenu를 만들어서 JMenuBar나 JMenu에 부착

JMenuItem을 만들어서 JMenu에 부착

2)JPopupMenu팝업메뉴

JPopupMenu 인스턴스를 만들고 메뉴를 추가하면됩니다.

Menu를 여러 개의 칼럼으로 만들지 못합니다.

출력할 때는 show(부모윈도우, x좌표, y좌표)를 호출하면 됩니다.


Swing의 이벤트 처리는 AWT와 동일합니다.

String의 메소드

int length():문자열의 길이를 리턴하는 메소드

char charAt(int idx): idx번째 문자를 리턴

String trim(): 좌우 공백을 제거

**데이터 작업을 할 때는 유효성 검사를 하고 작업을 수행해야 합니다.

유효성 검사를 하지 않으면 올바르지 않은 데이터가 삽입되거나 예외가 발생해서 프로그램이 중단 될 수 있습니다.

작업을 완료하거나 실패하면 작업에 대한 완료나 실패 메시지를 출력해주는것이 좋다.

이 때 메세지는 친절하게 길게 작성하는 것이 좋습니다.


package swing;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class D_AdressBook extends JFrame {
     //컬럼 이름 배열
     String [] columns = {
              "이름","전화번호","주소"
     };
     String [][] data = {
              {"안정은","01054720094","인천광역시 계양구"},
              {"박보검","01000010001","대한민국 어딘가"},
              {"제임스맥어보이","01022002030","외국 어딘가"},
              {"앤해서웨이","01087839202","외국 멀리 어딘가"}
     };
     public D_AdressBook() {
         this.setBounds(100,100,1000,400);
         this.setTitle("연락처");
         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
         
         //테이블 모델을 이용해서 테이블을 만들기
         DefaultTableModel model = new DefaultTableModel(data, columns);
         
         //테이블 모델을 이용해서 테이블 만들기
         // (1)처음에 데이터가 있을 때
         JTable table = new JTable(model);
         
         // (2)처음에 데이터가 없었을 때
         //table.setModel(model);
         
         //출력영역의 크기보다 테이블이 커지더라도 스크롤바를 이용할 수 있도록 스크롤 생성
         JScrollPane scrollpane = new JScrollPane(table);
         
         //스크롤 패인을 프레임에 부착
         add(scrollpane);
         //메뉴를 만들고 싶다면 항상 메뉴바부터 생성
         JMenuBar menuBar = new JMenuBar();
         JMenu file = new JMenu("파일(a)");
         //단축키 설정
         file.setMnemonic('a');
         
         JMenuItem item1 =new JMenuItem("열기");
         file.add(item1);
         
         JCheckBoxMenuItem item2 =new JCheckBoxMenuItem("저장");
         file.add(item2);
         
         JRadioButtonMenuItem item3 =new JRadioButtonMenuItem("편집");
         file.add(item3);
         
         menuBar.add(file);
         
         /////////////////////////사용자 입력에 따른 데이터 삽입 삭제/////////////////////////////////////
         
         JLabel lbName = new JLabel("이름");
         JTextField tfName = new JTextField(10);
         JLabel lbPhone = new JLabel("전화번호");
         JTextField tfPhone = new JTextField(15);
         JLabel lbAdress = new JLabel("주소");
         JTextField tfAdress = new JTextField(30);
         
         JButton btnInsert = new JButton("삽입");
         JButton btnDelete = new JButton("삭제");
         
         JPanel southPanel = new JPanel();
         southPanel.add(lbName);
         southPanel.add(tfName);
         southPanel.add(lbPhone);
         southPanel.add(tfPhone);
         southPanel.add(lbAdress);
         southPanel.add(tfAdress);
         southPanel.add(btnInsert);
         southPanel.add(btnDelete);
         
         add("South",southPanel);
         
         
         this.setVisible(true);
         
     /*   //메시지 다이얼로그 출력
         JOptionPane.showMessageDialog(null, "메시지 다이얼로그", "대화상자",
         JOptionPane.QUESTION_MESSAGE);*/
         
     /*   //선택 다이얼로그 출력
         int r = JOptionPane.showConfirmDialog(null, "메시지 다이얼로그","대화상자",JOptionPane.YES_NO_OPTION);
         System.out.println(r);
     */   
     /*   //한 줄 입력받는 다이얼로그 출력
         String s = JOptionPane.showInputDialog(null,"메시지 다이얼로그","대화상자",JOptionPane.YES_NO_OPTION);
         System.out.println(s);*/
         
         ///////////////////삽입 버튼의 클릭 이벤트(ActionListener)처리////////////////////////////
         ActionListener al = new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent e) {
                   //텍스트 필드에 입력된 내용 모두 가져오기
                   String name = tfName.getText();
                   String phone = tfPhone.getText();
                   String adress = tfAdress.getText();
                   
                   //좌우공백제거
                   name = name.trim();
                   phone = phone.trim();
                   adress = adress.trim();
                   
                   //name의 필수입력
                   //이름이 입력되지 않은 경우 길이가 0 /null이 아닙니다.
                   //name은 textfield의 데이터를 가지고 왔다. textfield는 만들어지면서 ""로 초기화를 시키기 때문에 null은 정말 아무것도
                   //없는 것을 뜻하므로 null이라고 하면 안 되는 것이다.
                   if(name.length()==0) {
                        JOptionPane.showMessageDialog(null, "이름은 필수 입력", "이름   ", JOptionPane.WARNING_MESSAGE);
                       //아래쪽을 더이상 수행하지 않도록 리턴
                       return; //함수 밖으로 벗어난다. -->
                   }
                   if(phone.length()==0) {
                        JOptionPane.showMessageDialog(null, "번호 필수 입력", "번호", JOptionPane.WARNING_MESSAGE);
                       //아래쪽을 더이상 수행하지 않도록 리턴
                       return; //함수 밖으로 벗어난다. -->
                   }
                   if(adress.length()==0) {
                        JOptionPane.showMessageDialog(null, "주소 필수 입력", "주소", JOptionPane.WARNING_MESSAGE);
                       //아래쪽을 더이상 수행하지 않도록 리턴
                       return; //함수 밖으로 벗어난다. -->
                   }
                   
                   //테이블에 추가 - 데이터 모델을 가져옵니다.
                   DefaultTableModel model = (DefaultTableModel)table.getModel(); //이 작업을 왜 하는지 물어보기
                   //JTable은 view의 역할만 할 수 있다.
                   //그래서 추가 삭제는 DefaultTableModel을 다시 생성해서 작업을 하는 것이다.
                   
                   //데이터를 추가하기 위해서 추가할 데이터 배열을 생성
                   String [] row = {name, phone, adress};
                   //모델에 추가
                   model.addRow(row);
                   //테이블을 갱신
                   table.updateUI();
                   
                   //텍스트 필드 클리어
                   tfName.setText("");
                   tfPhone.setText("");
                   tfAdress.setText("");
                   
                   //메시지 박스 출력
                   JOptionPane.showMessageDialog(null, "데이터 삽입 성공", "삽입작업", JOptionPane.PLAIN_MESSAGE);
              }};
         btnInsert.addActionListener(al);
         
         ActionListener deleteListener = new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent e) {
                   //어떤 걸 선택했는지 알 수 있어야 한다.
                   
                   int idx = table.getSelectedRow();
                   //진짜로 선택을 햇는지도 확인해야 한다.-데이터를 선택하지 않았다면
                   if(idx<0 || idx>=table.getRowCount()) {
                        JOptionPane.showMessageDialog(null, "행을 선택하세요.", "삭제 실패 ", JOptionPane.WARNING_MESSAGE);
                       return;
                   }
                   //테이블의 모델 가져오기
                   DefaultTableModel model = (DefaultTableModel)table.getModel();
                   //선택한 행에 해당하는 데이터 지우기
                   model.removeRow(idx);
                   table.updateUI();
                   JOptionPane.showMessageDialog(null, "데이터 삭제 성공", "삭제", JOptionPane.WARNING_MESSAGE);
              }
              
         };
         btnDelete.addActionListener(deleteListener);
         
         
         //메뉴바를 윈도우에 부착
         setJMenuBar(menuBar);
     }
}


'JAVA 공책 > 수업 메모' 카테고리의 다른 글

Map추가 & PrintWriter & Serializable : 복습 꼭 필요!  (0) 2018.07.23
java.io.File  (0) 2018.07.19
[완전 중요] Object 클래스에 관하여  (0) 2018.07.19
컨테이너와 컴포넌트  (0) 2018.07.18
Swing  (0) 2018.07.18