JTable


데이터를 테이블 형식으로 표현하고, 사용자가 값을 편집할 수 있게 하는 컴포넌트이다.

 

, 데이터를 저장하지 않고, 단순히 보여주는 용도로 사용된다.

 

생성자

 JTable() 

 기본 테이블 모델을 가진 빈 테이블을 생성한다

 JTable(int numRows, int numColumns)

 지정된 행과 열의 수를 가진 테이블을 생성한다.

 JTable(Object[][] rowData, Object[] columnName)

 첫 번째 매개변수는 테이블에 들어갈 데이터이므로 오브젝트 타입의 2차원 배열을 받는다두 번째 매개변수는 테이블의 첫 번째 행에 들어가 데이터를 구분 짓는 열의 이름이 들어간다.

 JTable(TableModel dm)

 새 테이블 모델을 가진 테이블을 생성한다.

 JTable(TableModel dm, TableColumnModel cm)

 새 테이블 모델과 테이블 컬럼 모델을 가진 테이블을 생성한다.

 JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm)

 테이블의 모든 모델들을 새로 지정받은 테이블을 생성한다.


- 메소드는 너무 많은 자료를 가지고 있어서 아래에 링크를 남깁니다.


https://docs.oracle.com/javase/7/docs/api/javax/swing/JTable.html

 

- 테이블 생성하기 예시


private String[] columnType = { "번호", "이름", "나이", "성별"};

private Object[][] data = {

       {"1", "김철수", "20", "남성"},

       {"2", "김옥자", "43", "여성"},

       {"3", "이순신", "100", "남성"},

       {"4", "유관순", "18", "여성"},

       {"5", "이 도", "54", "남성"}

};

JTable table = new JTable(data, columnType);


이전에도 설명했듯이 ScrollPane은 동적으로 변할 수 있는 컴포넌트와 함께 쓰인다. 주로 JTree, JTable처럼 데이터를 보여주되 사용자의 동작에 따라 컴포넌트의 크기가 변할 수 있는 컴포넌트가 있다. 쉽게 말해 트리나 테이블에는 스크롤바가 붙어야 실용성이 있다는 의미이다.

 

JScrollPane scrollPane = new JScrollPane(table); //스크롤 페인이 테이블의 컨테이너가 된다.

table.setFillsViewportHeight(true); //컨테이너의 전체 높이를 테이블이 전부 사용하도록 설정한다.

 

테이블은 각 셀의 데이터가 변경되면 다른 컴포넌트와 달리 TableModelListener 인터페이스를 구현하여 이벤트를 처리한다. 또한 JTable 객체는 하나의 테이블 모델(model)을 가진다. 따라서 리스너를 추가하는 메소드는 테이블을 관리하는 모델로부터 호출되어야 한다. 아래의 예시에서는 한 번에 보여주기 위해 익명 객체를 사용하였다. 리스너를 구현하는 방법은 본인이 선택하면 될 것이다.

 

table.getModel().addTableModelListener(new TableModelListener {

@Override

public void tableChanged(TableModelEvent e) {

int row = e.getFirstRow(); //첫 번째 행을 얻는다.

int column = e.getColumn(); //변경된 셀의 컬럼 인덱스를 얻는다.

TableModel model = (TableModel) e.getSource();

String columnName = model.getColumnName(column); //해당 인덱스를 가진 열의 이름을 얻는다.

Object data = model.getValueAt(row, column);

//데이터를 처리하는 구간

...

}

});

 

테이블은 정렬필터링을 할 수 있는데, 이들 모두 정렬기 객체를 이용하여 수행할 수 있다. 가장 쉬운 방법은 테이블의 autoCreateRowSorter 특성을 true로 설정하는 것이다. 이 속성을 true로 설정하면, 컬럼 헤더를 클릭했을 때 행을 자동으로 정렬해주는 정렬기를 정의한다.

 

table.setAutoCreateRowSorter(true);

 

테이블은 사용자가 셀의 값을 변경할 수 있는데, 개발자에 의해 정해진 셀의 값을 가질 수도 있다. 또는 정해진 선택지 속에서 사용자가 셀의 값을 변경할 수 있다. 자주 사용되는 것은 콤보 박스이다.

 

[좌측 아래 콤보 박스에 프로그래밍 언어가 나열되있는 것을 볼 수 있다.]


콤보박스를 이용하여 셀 에디터 만들기


TableColumn gender = table.getColumnModel().getColumn(2); //인덱스가 2인 컬럼얻기

...

JComboBox genderCells = new JComboBox();

comboBox.addItem(“남성”);

comboBox.addItem(“여성”);

gender.setCellEditor(new DefaultCellEditor(genderCells);

 

자바에서는 테이블을 출력할 수 있는 기능을 API로 제공한다.

 

...

table.print(); //해당 메소드를 호출할 때는 JMenuBar를 구현하여 메뉴 선택 시 호출하도록 하는 것이 일반적이다.

...

try {

if (!table.print()) {

//사용자가 인쇄를 취소하였을 때의 동작 정의

}

} catch(java.awt.print.PrinterException e) {

System.err.format(“인쇄 도중 오류 발생 : %s%n”, e.getMessage());

}

 

테이블 예제

import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import java.awt.*;

/**
 * Created by with2J on 2017-07-21.
 */
public class JTableTest extends JFrame implements TableModelListener {

    public static void main(String[] args)
    {
        new JTableTest();
    }

    //FIELDS
    private JTable table;
    private JScrollPane scrollPane;
    private String[] columnType = { "번호", "이름", "나이", "성별"};
    private Object[][] data = {
            {"1", "김철수", "20", "남성"},
            {"2", "김옥자", "43", "여성"},
            {"3", "이순신", "100", "남성"},
            {"4", "유관순", "18", "여성"},
            {"5", "이 도", "54", "남성"}
    };

    //CONSTRUCTOR
    JTableTest()
    {
        super("JTable Test!"); //setTitle() 도 가능
        setSize(500, 300);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        table = new JTable(data, columnType);
        scrollPane = new JScrollPane(table);

        table.setPreferredScrollableViewportSize(new Dimension(500, 300));
        table.setFillsViewportHeight(true);

        table.getModel().addTableModelListener(this); // 테이블에 소속된 하나의 모델이 셀들을 관리하므로 항상 getModel() 을 호출해야함
        table.setAutoCreateRowSorter(true); //자동 행 정렬기능

        //성별 컬럼에 지정된 선택지만 추가할 수 있도록 설정한다.
        TableColumn genderColumn = table.getColumn("성별");
        JComboBox gender = new JComboBox();
        gender.addItem("여성");
        gender.addItem("남성");
        genderColumn.setCellEditor(new DefaultCellEditor(gender));

        add(scrollPane);
        setVisible(true);
    }

    @Override
    public void tableChanged(TableModelEvent e) {
        int row = e.getFirstRow();
        int column = e.getColumn();

        if (column == 2) { // 컬럼번호가 2이면 "나이" 컬럼이다. 컬럼인덱스는 0부터 시작한다.
            TableModel model = (TableModel) e.getSource();
            String colName = model.getColumnName(column); //해당 인덱스의 컬럼이름을 받아온다.
            String str = (String) model.getValueAt(row, column); // data는 object 타입이므로 형변환해야 한다.
            if (Integer.parseInt(str) > 100) { //입력한 나이값이 100이 넘을 경우, 경고창을 띄운다.
                JOptionPane.showMessageDialog(this, "나이 범위를 초과하였습니다. 100 미만으로 입력해주세요.", "경고",
                        JOptionPane.WARNING_MESSAGE);
            }
        }
    }
}



[나이의 범위를 넘어서면 팝업창이 뜨는 것을 볼 수 있다.]



[이름을 클릭하면, 이름순으로 행정렬이 이루어지는 것을 볼 수 있다.]





▶ 대화 상자



대화 상자 윈도우는 프레임같은 주 윈도우와는 다르게 임시 정보를 나타내는 데 사용되는 독립적인 서브 윈도우이다.

 

주로 사용자에게 오류나 경고 또는 짧은 메시지를 전달하는 데 사용된다.

 

대화 상자는 프레임에 의존적이므로, 프레임이 삭제되면 대화 상자도 삭제된다. 또한 프레임이 아이콘화되면 대화 상자도 아이콘화된다. (AWTDialog 클래스로부터 상속된 특성)

 

대화 상자의 종류는 크게 모달형(Modal Dialog)”비모달형(Non-Modal Dialog)”로 두 가지가 있다.

  • 모달형(Modal Dialog) : 대화 상자를 끝내야만 다른 작업을 할 수 있다. ex) JOptionPane

  • 비모달형(Non-Modal Dialog) : 대화상자를 끝내지 않고 다른 윈도우를 사용하여 작업할 수 있다. JDialog 클래스를 직접 사용하여야 한다. 또한 다이얼로그는 디폴트로 모달형이며, 모달형인지 지정하는 것은 다이얼로그의 setModal() 메소드를 사용하여 지정하거나 생성자에 지정할 수 있다.

 

아래는 대화 상자 객체의 종류이다.

  • JOptionPane : 주로 표준화된 간단한 대화 상자

  • ProgressMonitor : 진행 과정을 보여주는 간단한 대화 상자

  • JColorChooser : 색상 선택기

  • JFileChooser : 파일 선택기

  • JDialog :맞춤형 대화 상자 즉, 커스터마이징이 가능하다.


▶ JOptionPane


- 쉽고 빠르게 간단한 대화 상자를 만들 때 주로 사용되는 클래스이다.

 

일반적인 대화 상자를 위한 아이콘 선택, 배치 관리, 제목 및 텍스트, 버튼의 텍스트를 변경할 수 있다.

 

제공하는 메소드는 showXXXDialog() 형태의 메소드명을 가지며, 대부분 간단한 모달형 대화상자를 생성하기 위해 사용된다.


showMessageDialog() : 버튼이 하나 있는 다이얼로그, 아래와 같이 세 가지 종류로 중복 정의되어있다.

      • showMessageDialog(Component parentComp, Object message)

      • showMessageDialog(Component parentComp, Object message, String title, int messageType)
      • showMessageDialog(Component parentComp, Object message, String title, int messageType, Icon icon)

[매개변수 설명]

      • 첫 번째 매개변수로는 다이얼로그를 호출하는 부모 컴포넌트가 들어간다. 나의 경우 JFrame을 상속한 클래스에서 다이얼로그를 호출했고, 코드 또한 해당 클래스에서 작성하였으므로 this를 매개변수로 넘겨주었다.

      • messageType은 총 4가지로 이루어져 있다. 아이콘을 설정하고 싶지 않다면 즉, 메시지의 종류를 구별하지 않기 위해서는 JOptionPane.PLAIN_MESSAGE를 매개변수로 넘기면 된다아래는 예시이다. (예시로 두 번째 메소드를 사용하였다.)

JOptionPane.showMessageDialog(this, "Hi, This is Information message.", "정보", JOptionPane.INFORMATION_MESSAGE);

 



JOptionPane.showMessageDialog(this, "Are you Okay?", "Question", JOptionPane.QUESTION_MESSAGE);

 

 


JOptionPane.showMessageDialog(this, "Hey! Watch Out", "경고", JOptionPane.WARNING_MESSAGE);

 

 


JOptionPane.showMessageDialog(this, "Not Access", "오류", JOptionPane.ERROR_MESSAGE);

 

 [좌측의 아이콘이 messageType과 함께 바뀌는 것을 볼 수 있다.]

 


showOptionDialog() : 맞춤형 대화 상자로, 텍스트를 다르게 하거나 많은 버튼을 가질 수 있다. 또한 텍스트 메시지나 컴포넌트의 컬렉션을 포함할 수 있다.

      • JOptionPane.showOptionDialog(Component parentComp, Objecct message, String title, int optionType, int messageType, Icon icon, Object[] obj, ...);

[매개변수 설명]

      • 네 번째 매개변수인 OptionType 은 세 가지로 구성된다.

JOptionPane.YES_NO_CANCEL_OPTION

 예아니오취소 3가지의 대답(선택지의 개수가 3개)

 JOptionPane.YES_NO_OPTION

 예아니오 2가지의 대답(선택지의 개수가 2개)

 JOptionPane.YES_OPTION

 예만 있는 1가지의 대답(선택지의 개수가 1개)

      • messageType 은 위에서 설명한 showMessageDialog의 매개변수와 동일하다.

      • Icon은 다이얼로그에서 나타낼 아이콘을 의미하는데 아래의 예시에서는 사용하지 않아서 null 을 매개변수로 넘겼다.

      • 마지막 매개변수인 오브젝트 배열타입의 obj는 대답을 커스터마이징할 수 있는 방법을 제공한다. , optionType으로 몇 개의 선택지를 만들 것인지 정하고, 이 매개변수로 선택지를 설정하는 것이다.

String[] answer = {"First", "Second", "Third"};

int ans = JOptionPane.showOptionDialog(this, "What's your number?", "Number Check", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, answer, answer[0]);

//맨 마지막 매개변수로 answer[0]을 준 것은 리턴할 때의 초기값을 First로 하기 위함이다. null을 두어도 된다.

System.out.println("ans : " + ans); //인덱스번호(대답) 리턴 - First를 눌렀다면 0, Second면 1, Third면 2가 리턴된다.

 

 

showConfirmDialog() : 사용자로부터 다시 확인하고 싶은 경우에 사용된다.

      • showConfirmDialog(Component parentComp, Object message)

      • showConfirmDialog(Component parentComp, Object message, String title, int optionType);

      • showConfirmDialog(Component parentComp, Object message, String title, int optionType, int messageType);

      • showConfirmDialog(Component parentComp, Object message, String title, int optionType, int messageType, Icon icon);

int ans = JOptionPane.showConfirmDialog(this, "Are you sure?", "확인", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE);

System.out.println("ans = " + ans); //예는 0, 아니오는 1을 리턴함

 

[messageType을 PLAIN_MESSAGE 로 지정하였기 때문에 아이콘이 나타나지 않는다.]

 

 

showInputDialog() : 사용자로부터 입력을 받고 싶은 경우에 사용된다. 6가지의 메소드가 중복 정의되어있다.

      • showInputDialog(Component parentComponent, Object message)

      • showInputDialog(Component parentComponent, Object message, Object initialSelectionValue)

      • showInputDialog(Component parentComponent, Object message, String title, int messageType)

      • showInputDialog(Component parentComponent, Object message, String title, int messageType, Icon icon, Object[] selectionValues, Object initialSelectionValue)

      • showInputDialog(Object message)

      • showInputDialog(Object message, Object initialSelectionValue)

String ans_str = (String) JOptionPane.showInputDialog(this, "Write a word", "Input Dialog", JOptionPane.PLAIN_MESSAGE, null, null, null);

System.out.println("ans_str : " + ans_str); //입력한 단어가 리턴된다.

 




 

▶ JDialog


사용자 정의 대화 상자 : JOptionPane에서 제공하는 간단한 대화 상자 외에 제작자가 만들고 싶은 대화 상자가 있다면 JDialog 클래스를 상속(extends)함으로서 해결할 수 있다.


 생성자

 JDialog(Frame parent)

 타이틀이 없는 다이얼로그를 생성한다.

 JDialog(Frame parent, boolean modal) 

 타이틀이 없는 다이얼로그를 생성하고모달형 다이얼로그로 하고 싶으면 modal값에 true비모달형 다이얼로그로 하고 싶으면 false를 매개변수로 넘겨주면 된다.

 JDialog(Frame parent, String title)

 타이틀이 있는 다이얼로그를 생성한다.

 JDialog(Frame parent, String title, boolean modal) 

 타이틀모달유무가 설정된 다이얼로그를 생성한다.

 메소드

 void show() 

 다이얼로그를 띄운다.

 void setModal(boolean modal)

 true로 지정하면 모달형이고, false이면 비모달형이다.

 void setTitle(String title) 

 다이얼로그의 타이틀을 설정한다.

 boolean isModal()

 다이얼로그가 모달이면 true, 아니면 false를 반환한다.

 String getTitle() 다이얼로그의 타이틀을 반환한다.
 boolean isResizable() 크기를 변경할 수 있으면 true, 아니면 false를 반환한다.
 void setResizable(boolean b) 사용자가 크기를 변경할 수 있게 하려면 true, 변경할 수 없게 하려면 false를 지정하면 된다.


 

-사용자 정의형 대화 상자 예제


public class ExamDialog extends JDialog implements ActionListener {

    //FIELDS
    private JPanel panel1, panel2;
    private JLabel label;
    private JButton okBtn;
    private JButton cancelBtn;

    //CONSTRUCTOR
    ExamDialog(JFrame frame, String str) {
        super(frame, str, true);
        panel1 = new JPanel();
        panel1.setLayout(new BorderLayout());
        add(panel1);

        label = new JLabel("Exam Dialog ~~ Good !", JLabel.CENTER);
        panel1.add(label, BorderLayout.CENTER);
        panel2 = new JPanel();
        panel1.add(panel2, BorderLayout.SOUTH);

        okBtn = new JButton("OK");
        okBtn.addActionListener(this);
        panel2.add(okBtn);
        cancelBtn = new JButton("CANCEL");
        cancelBtn.addActionListener(this);
        panel2.add(cancelBtn);
        setSize(300, 300);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                dispose(); //다이얼로그 제거
            }
        });
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        dispose(); //다이얼로그 제거
    }
}

public class Test extends JFrame implements ActionListener{
    public static void main(String[] args) {
        new Test();
    }

    //FIELDS
    private JPanel panel;
    private JButton btn1, btn2;
    private ExamDialog examDialog;

    Test() {
        setTitle("DialogTest");
        setSize(300, 300);
        panel = new JPanel();
        add(panel, "Center");
        btn1 = new JButton("다이얼로그 열기");
        btn2 = new JButton("나가기");
        btn1.addActionListener(this);
        btn2.addActionListener(this);
        panel.add(btn1);
        panel.add(btn2);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btn1) {
            if (examDialog == null) {
                examDialog = new ExamDialog(this, "Exam Dialog");
            }
            examDialog.setVisible(true);
            btn1.requestFocus();
        }else if (e.getSource() == btn2) {
            System.exit(0);
        }
    }
}


[ "다이얼로그 열기" 버튼을 클릭하면 아래와 같은 다이얼로그 창이 뜬다.]






'Programming Language > JAVA' 카테고리의 다른 글

34. Package - 패키지  (0) 2017.07.23
33. JTable - 테이블  (0) 2017.07.22
31. JMenuBar - 메뉴바 설정하기  (0) 2017.07.13
30. JColorChooser, JFileChooser - 색상 선택기, 파일 선택기  (0) 2017.06.29
29. JTree - 트리  (0) 2017.06.29

 

 

 

JMenuBar



 

메뉴는 공간을 절약함과 동시에 사용자에게 여러 가지 옵션 중에서 하나를 선택하게 하는 컴포넌트이다.

 

다른 컴포넌트와 달리 컨테이너 안에 배치되지 않는다. , 항상 맨 위에 고정적인 자리를 가진다.

 

메뉴바는 프레임에만 부착될 수 있다. 패널은 부착불가.

 

메뉴는 메뉴바에 나타나거나 팝업 메뉴로만 나타난다.

 

- 메뉴바에 메뉴를 나열하고, 메뉴바에 나열된 메뉴들에서 각 메뉴 항목을 가진다.


- 메뉴 항목에는 텍스트뿐만 아니라 이미지도 올 수 있고 체크 박스도 올 수 있다. 또한, 폰트나 색상도 변경 가능하다.

 

팝업 메뉴란 사용자가 팝업이 가능한 컴포넌트 위에서 마우스 우클릭을 할 때 등장한다.

 

메뉴는 JAbstractButton 클래스를 상속하고 있으므로 일종의 버튼이라 보면 된다. 따라서 누르면 이벤트가 발생한다.

 

메뉴바는 JMenuBar 객체, 메뉴는 JMenu 객체, 메뉴 항목은 JMenuItem 객체로 만들어진다.


- 팝업메뉴는 JPopupMenu라는 객체를, 체크박스 메뉴항목은 JCheckboxMenuItem 객체에 의해 표현된다.

 

- Simple Example


...

JFrame frame = new JFrame(“메뉴바 예제”);


JMenuBar menuBar; //메뉴바 선언

JMenu menu; //메뉴 선언

JMenuItem menuItem; //메뉴 항목 선언

 

menuBar = new JMenuBar(); //메뉴바 초기화

 

menu = new JMenu(“메뉴1”);

menuBar.add(menu);

 

menuItem = new JMenuItem(“메뉴항목1”); //메뉴항목 선언

//menuItem = new JMenuItem(“메뉴항목1”, KeyEvent.VK_T); ->키보드 단축키 설정 가능

menu.add(menuItem); //메뉴에 메뉴항목 추가

 

frame.setJmenuBar(menuBar); //프레임에 메뉴바 설정

...


각 메뉴 항목마다 단축키를 설정하려면 setMenuShortCut 메소드를 불러오면 된다.

 

이벤트 처리 : 메뉴항목(JMenuItem)을 눌렀을 때 발생하는 이벤트를 처리하기 위해 ActionListener 인터페이스를 구현한다.

 

키보드와의 관계 : 메뉴는 기억키(menmontcs)와 가속키(accelerators)의 두 가지 종류의 키보드 선택을 지원한다. 기억키는 모든 사용자를 위한 것이고, 가속키는 고급 사용자를 위한 것이라고 생각하면 된다.


기억키는 setMnemonic() 메소드를가속키는 setAccelerator() 메소드를 사용한다.

  • 기억키 : 키보드를 사용하여 이미 표시되어 있는 메뉴 계층을 둘러보는데 이용된다. 주로 메뉴에 단축키를 설정하여 Alt를 누르면 첫 번째 메뉴가 선택되게 한다.

menuItem.setMnemonic(KeyEvent.VK_T);

  • 가속키 : 메뉴 계층 구조를 통하지 않고 직접 메뉴 항목을 선택할 수 있다. , 메뉴 항목이 선택되는 키들의 조합이다. 예를 들어 Alt + 1을 눌렀을 때 Alt 단축키를 가진 메뉴의 서브 메뉴 항목의 첫 번째를 선택하게 된다. 단말 메뉴 항목만이 가속키를 가질 수 있다.

 menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_t, ActionEvent_ALT_MASK));



예제

public class MenuTest extends JFrame implements ActionListener, ItemListener {
	
	//FIELDS
	private JMenuBar menuBar = new JMenuBar();
	private JMenu firstMenu, secondMenu, submenu;
	private JMenuItem menuItem1, menuItem2;
	private JMenuItem subMenuItem1, subMenuItem2;
	private ButtonGroup group = new ButtonGroup();
	private JRadioButtonMenuItem rbMenuItem1, rbMenuItem2;
	private JCheckBoxMenuItem cbMenuItem1, cbMenuItem2;
	
	MenuTest() {
	
		//첫번째 메뉴 초기화
		firstMenu = new JMenu("first menu");
		firstMenu.setMnemonic(KeyEvent.VK_F); //단축키 설정
		menuBar.add(firstMenu);
		
		//메뉴 항목 생성
		menuItem1 = new JMenuItem("menu item 1", KeyEvent.VK_1);
		menuItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, ActionEvent.ALT_MASK));
		menuItem1.addActionListener(this); //리스너 설정해야 이벤트 처리 가능함
		firstMenu.add(menuItem1); //메뉴항목을 첫번째 메뉴에 등록
		
		ImageIcon icon = new ImageIcon("example_icon.png");
		menuItem2 = new JMenuItem("menu item 2", icon); //이미지 등록
		menuItem2.addActionListener(this);
		menu.add(menuItem2);
		
		//라디오 버튼 메뉴 항목 생성
		firstMenu.addSeparator(); // 구분자 생성
		
		rbMenuItem1 = new JRadioButtonMenuItem("radio button item 1");
		rbMenuItem1.setSelected(true); //선택 되어있도록 설정
		group.add(rbMenuItem1); //버튼 그룹에 추가
		firstMenu.add(rbMenuItem1); //그룹에 추가하는 것과 메뉴에 추가하는 것은 별도이다.
		
		rbMenuItem2 = new JRadioButtonMenuItem("radio button item 2");
		group.add(rbMenuItem2);
		firstMenu.add(rbMenuItem2);
		
		//체크 박스 메뉴 항목 생성
		firstMenu.addSeparator();
		cbMenuItem1 = new JCheckBoxMenuItem("check box item 1");
		cbMenuItem1.addItemListener(this); //체크박스는 아이템 이벤트가 발생함 (액션 이벤트와는 별도 처리)
		firstMenu.add(cbMenuItem1);
		
		cbMenuItem2 = new JCheckBoxMenuItem("check box item 2");
		cbMenuItem2.addItemListener(this);
		firstMenu.add(cbMenuItem2);
		
		//서브 메뉴 생성
		submenu.addSeparator();
		submenu = new JMenu("sub menu");
		submenu.setMnemonic(KeyEvent.VK_S); //단축키 설정
		
		subMenuItem1 = new JMenuItem("sub menu item 1");
		subMenuItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, ActionEvent.ALT_MASK));
		submenu.add(subMenuItem1);
		
		subMenuItem2 = new JMenuItem("sub menu item 2");
		subMenuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, ActionEvent.ALT_MASK));
		submenu.add(subMenuItem2);
		
		menu.add(submenu);
		
		//두번째 메뉴 초기화
		secondMenu = new JMenu("second menu");
		secondMenu.addActionListener(this);
		menu.setMnemonic(KeyEvent.VK_S);
		menuBar.add(menu);
		
		//프레임에 메뉴바 추가하기
		setJMenuBar(menuBar);
		setVisible(true);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == menuItem1) {
			System.out.println("This is the menu item 1.");
		}else if (e.getSource() == menuItem2) {
			System.out.println("This is the menu item 2.");
		}
	}
	
	@Override
	public void itemStatedChanged(ItemEvent e) {
		if (e.getSource() == cbMenuItem1) {
			System.out.println("check box item 1");
		else (e.getSource() == cbMenuItem2) {
			System.out.println("check box item 2");
		}
	}
	
	public static void main(String[] args) {
		MenuTest frame = new MenuTest();
		f.setSize(500, 500);
		f.setVisible(true);
	}
}










 JColorChooser




사용자가 색상 팔레트에서 하나의 색상을 선택할 수 있는 색상 선택기” 컴포넌트이다.

 

색상 선택기는 탭이 붙어있는 패널과 미리보기 패널로 구성된다.

 

탭이 붙어있는 패널은 각기 다른 색상 모델을 지원한다.

 

미리보기 패널은 현재 선택된 색상을 다양한 방식으로 표시한다.


JColorChooser

 생성자

설명

 JColorChooser()

 초기 색상으로 Color.white를 표시하는 색상 선택기를 생성한다.

 JColorChooser(Color color)

 매개변수로 지정된 색상을 초기 색상으로 가지는 색상 선택기를 생성한다.





- JColorChooser 예제

 

public class ColorChooserTest extends JFrame implements ChangeListener {

	//FIELDS
	//색상 선택기를 필요로하는 다른 패키지(상속된 클래스만)에서도 사용할 수 있도록 접근 제한자를 protected로 설정
	protected JColorChooser colorChooser = new ColorChooser();
	private JPanel panel = new JPanel();

	//CONSTRUCTOR
	ColorChooserTest() {
		setTitle("색상 선택기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack(); //컴포넌트의 크기에 자동으로 맞춰지게 해주는 프레임용 메소드

		//주의! 색상 선택기의 선택 모델에 리스너를 추가하여야 한다.
		colorChooser.getSelectionModel().addChangeListener(this);
		colorChooser.setBorder(BorderFactory.createTitleBorder("색상 선택"));

		panel.add(colorChooser);
		add(panel);

		setVisible(true);
	}

	//METHODS
	@Override
	public void stateChanged(ChangeEvent e) {
		Color selectedColor = colorChooser.getColor(); //색상 선택기의 현재 컬러값 반환
	}

	public static void main(String[] args) {
		new ColorChooserTest();
	}

}

 

 

 

 JFileChooser

 



파일 시스템을 탐색하여 파일이나 디렉토리를 선택하는 파일 선택기” 컴포넌트이다.

 

단순히 파일을 선택하기 위한 것으로프로그램 내에서 읽거나 쓰거나 수정하는 등의 동작들은 UI를 구현해야한다.

 

파일 선택기를 생성할 때 final 키워드를 붙이는 것이 일반적이다파일 선택기를 바꿔가며 사용하지는 않기 때문이다.


final JFileChooser fileChooser = new JFileChooser();



파일 선택기는 다음에 배울 대화상자이므로 파일을 선택하기 위한 창으로 다이얼로그를 사용한다.

 

파일 선택기 열기 주로 파일 열기 동작(이벤트)을 처리하기 위한 액션 리스너에 등장한다.


int showOpenDialog(Component component)

  • 반환값은 사용자의 파일 선택여부를 나타내는 정수값이다.

  • 일반적으로 APPROVE_OPTION 인지만 검사하면 된다.

  • 매개변수로 대화상자의 부모 컴포넌트를 전달한다.

  • 부모 컴포넌트는 대화상자의 위치에 영향을 준다디폴트 값은 사용자의 홈 디렉토리에 있는 모든 파일을 표시하는 것이다.

 

선택된 파일 얻기 선택된 파일을 File 객체로 반환한다.


File getSelectedFile();


초기 디렉토리 설정 : 매개변수로 디렉토리 경로를 준다. 경로의 종류는 절대경로와 상대경로가 있다.


void setCurrentDirectory("~");

 

파일 저장하기 반환값과 매개변수는 showOpenDialog 메소드와 유사하다.


int showSaveDialog(Component component)





- JFileChooser 예제


public class FileChooserTest extends JFrame implements ActionListener {

	//FIELDS
	JButton openBtn = new JButton("File Open!");
	JButton saveBtn = new JButton("File Save!");
	JFileChooser fileChooser = new JFileChooser();
	JPanel fcPanel = new JPanel();
	JLabel pathLabel = new JLabel("선택한 파일의 경로 보여주기");

	//CONSTRUCTOR
	FileChooserTest() {
		setTitle("파일 선택기 예제");
		setSize(400, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		openBtn.addActionListener(this);
		saveBtn.addActionListener(this);

		fcPanel.add(openBtn);
		fcPanel.add(saveBtn);

		add(pathLabel, BorderLayout.NORTH);
		add(fileChooser, BorderLayout.CENTER);
		setVisible(true);
	}

	//METHODS
	@Override
	public void actionPerformed(ActionEvent e) {
		int returnValue;
		
		//파일 오픈 버튼에 대한 액션 이벤트 처리
		if(e.getSource() == openBtn) {
			returnValue = fileChooser.showOpenDialog(this);

			if(returnValue == JFileChooser.APPROVE_OPTION) { //실제 파일 오픈
				//선택된 파일의 경로 얻기
				String path = fileChooser.getSelectedFile().getPath();
				pathLabel.setText(path);
			}else {
				//사용자 취소 동작이 있음
			}
		} else if(e.getSource() == saveBtn) { //파일 저장 버튼에 대한 액션 이벤트 처리
			returnValue = fileChooser.showSaveDialog(this);

			if(returnValue == JFileChooser.APPROVE_OPTION) {
				//실제 파일 저장
			}else {
				//사용자 취소 동작이 있음
			}

		}
	}

	public static void main(String[] args) {
		FileChooserTest fct = new FileChooserTest();
	}
}





'Programming Language > JAVA' 카테고리의 다른 글

32. JOptionPane, JDialog - 대화 상자  (0) 2017.07.22
31. JMenuBar - 메뉴바 설정하기  (0) 2017.07.13
29. JTree - 트리  (0) 2017.06.29
28. JSlider - 슬라이더  (0) 2017.06.29
27. JSpinner - 스피너  (0) 2017.06.29

+ Recent posts