▶ 대화 상자



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

 

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

 

대화 상자는 프레임에 의존적이므로, 프레임이 삭제되면 대화 상자도 삭제된다. 또한 프레임이 아이콘화되면 대화 상자도 아이콘화된다. (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



 JTree

 



트리는 계층적인 데이터를 표시하는데 사용되는 컴포넌트이다.

 

- JTree는 단순히 데이터의 뷰만을 제공하기 때문에 트리 객체 안에는 데이터가 저장되지 않는다.

 

각각의 트리는 하나의 루트 노드(root node)를 가지고 있다다른 노드들(child)은 루트 노드에서 파생된다.

 

노드는 자신의 자식 노드를 가질 수 있고사용자가 노드를 클릭하면 자식 노드를 보이게 할 수도 있다.

 

트리는 스크롤 페인(JScrollPane) 속에 넣는 것이 일반적이다.

 

노드의 확장 상태는 이벤트를 사용하여 감지할 수 있다.


 JTree

 생성자

 JTree()

 비어있는 트리를 생성한다.

 JTree(TreeNode root)

 매개변수로 주어진 노드를 루트 노드로 하는 트리를 생성한다.

 메소드

 void setVisibleRowCount(int row)

 화면에 나타나는 행의 수를 설정한다.

 Object getLastSelectedPathComponent()

 현재 선택된 노드를 반환한다.

 ThreeSelectionModel getSelectionModel()

 트리의 선택 모델을 반환한다.

 Object getUserObject()

 노드로 지정된 객체를 반환한다

 보통 이벤트 처리 시 노드의 이름을 가져올 때 사용한다.

 노드 생성자

 DefaultMutableTreeNode()

 비어있는 트리 노드를 생성한다.

 DefaultMutableTreeNode(Object obj)

 지정된 객체를 가지고 트리 노드를 생성한다.

 노드 수정 메소드

 void add(TreeNode child)

 자식 노드를 추가한다.

 TreeNode getFirstChild() 현재 노드의 첫 번째 자식 노드를 반환한다.
 DefaultMutableTreeNode getNextSibling() 현재 노드의 다음 형제 노드를 반환한다.
 TreeNode getParent() 현재 노드의 부모 노드를 반환한다.

 이벤트 처리

 addTreeSelectionListener(리스너 타입)

 노드를 선택할 때마다 트리 선택 이벤트(TreeSelectionEvent)가 발생하며, TreeSelectionListener 인터페이스를 구현함으로서 이벤트를 처리한다.






- JTree 예제

public class TreeTest extends JFrame implements addTreeSelectionListener {

	//FIELDS
	private JPanel treePanel = new JPanel();
	private JScrollPane treeScroll;
	private JTree tree;
	private JLabel label;
	private DefaultTreeModel model; //트리 모델 인스턴스
	
	//CONSTRUCTOR
	TreeTest() {
		setTitle("트리 예제");
		setSize(400, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		DefaultMutableTreeNode root = new DefaultMutableTreeNode("플레이 리스트");
		DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("힙합");
		DefaultMutableTreeNode child2 = new DefaultMutableTreeNode("재즈");
		DefaultMutableTreeNode child3 = new DefaultMutableTreeNode("락");
		DefaultMutableTreeNode child4 = new DefaultMutableTreeNode("가요");
		DefaultMutableTreeNode child5 = new DefaultMutableTreeNode("팝송");
		DefaultMutableTreeNode child6 = new DefaultMutableTreeNode("동요");

		root.add(child1);
		root.add(child2);
		root.add(child3);
		root.add(child4);
		root.add(child5);
		root.add(child6);

		DefaultMutableTreeNode child6child1 = new DefaultMutableTreeNode("아기공룡둘리");
		DefaultMutableTreeNode child6child2 = new DefaultMutableTreeNode("네모의 꿈");
		DefaultMutableTreeNode child6child3 = new DefaultMutableTreeNode("민들레꽃");
		
		child6.add(child6child1);
		child6.add(child6child2);
		child6.add(child6child3);

		tree = new JTree(root);

		/* 또는 아래와 같이 하여도 된다.
		tree = new JTree();
		model = new DefaultTreeModel(root);
		tree.setModel(model);
		*/

		tree.setVisibleRowCount(10);
		tree.addTreeSelectionListener(this);
		
		treeScroll = new JScrollPane(tree);
		panel.add(treeScroll);
		panel.add(label);
		add(panel);

		setVisible(true);
	}

	//METHODS
	@Override
	public void valueChanged(TreeSelectionEvent e) {
		DefaultMutableTreeNode node; 
		node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
		
		if(node == null) return;

		String nodeName = (String) node.getUserObject(); //캐스팅은 꼭해주어야 한다.
		label.setText("선택된 노드 : " + nodeName);
	}

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





+ Recent posts