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







+ Recent posts