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






 

 JSlider

 




슬라이더는 사용자가 특정 범위 안에서 하나의 값을 선택할 수 있는 컴포넌트이다.

 

미디어 옆에 볼륨을 조정할 때 자주 사용된다.

 

JSlider

 생성자

  JSlider()

 0~100사이의 수평 슬라이더를 생성한다.

  JSlider(int min, int max)

 지정된 최소값과 최대값을 가지는 슬라이더를 생성한다.

  Jslider(int min, int max, int value)

 위와 같으면 value는 슬라이더의 초기값이다.

 메소드

  void setMajorTickSpacing(int space)

 큰 눈금 간격을 설정한다.

  void setMinortickSpacing(int space) 

 작은 눈금 간격을 설정한다.

  void setPaintTicks(booelan visible) 

 눈금을 표시할 지를 설정한다.

  void setPaintLabels(boolean visible)

 값을 레이블로 표시할지 설정한다.

 이벤트 처리

  addChangeListener(ChangeListener cl)

 슬라이더의 값이 변경되었을 경우 ChangeEvent가 발생한다체인지 이벤트는 ChangListener 인터페이스를 구현하여 처리한다.




- JSlider 예제


public class SliderTest extends JFrame implements ChangeListener { //FIELDS public static final int INIT_VAL = 15; private JButton button = new JButton(); private JPanel panel = new JPanel(); private JLabel label = new JLabel("슬라이더 움직이기", JLabel.CENTER); private JSlider slider; //CONSTRUCTOR SliderTest() { setTitle("슬라이더 예제"); setSize(300, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); label.setAlignmentX(Component.CENTER_ALIGNMENT); panel.add(label); slider = new JSlider(0, 20, INIT_VAL); slider.setMagorTickSpacing(5); //큰 눈금 간격 5로 설정 slider.setMinorTickSpacing(1); //작은 눈금 간격 1로 설정 slider.setPaintTicks(true); //눈금을 표시한다. slider.setPaintLabels(true); //값을 레이블로 표시한다. slider.addChangeListener(this); panel.add(slider); button.setText("멍멍"); button.setSize(INIT_VAL, INIT_VAL); panel.add(button); add(panel); setVisible(true); } //METHODS @Override public void stateChanged(Change Event e) { JSlider selectedSlide = (JSlider) e.getSource(); if(!selectedSlide.getValueIsAdjusting()) { int val = (int) source.getValue(); button.setSize(val*5, val*5); //슬라이더 값에 따라 버튼 크기 조절 } } public static void main(String[] args) { new SliderTest(); } }






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

30. JColorChooser, JFileChooser - 색상 선택기, 파일 선택기  (0) 2017.06.29
29. JTree - 트리  (0) 2017.06.29
27. JSpinner - 스피너  (0) 2017.06.29
26. JComboBox - 콤보박스  (0) 2017.06.29
25. JList - 리스트  (0) 2017.06.25

+ Recent posts