자바

자바 UI - Swing (메뉴 컴포넌트)

록's 2023. 2. 17. 17:47
728x90
반응형



메뉴 컴포넌트

UI 프로그램에서 메뉴는 빠질 수 없는 구성 요소이다. Swing은 메뉴 생성을 위해 다음과 같은 컴포넌트를 javax.swing 패키지에서 제공한다.

 

 

컴포넌트 설명
JMenuBar 메뉴바 컴포넌트
JMenu 주 메뉴 및 자식 메뉴 아이템을 갖는 서브 메뉴 컴포넌트
JPopupMenu 팝업 메뉴 컴포넌트
JMenuItem 메뉴 아이템 컴포넌트
JCheckBoxMenuItem JCheckBox로 선택할 수 있는 메뉴 아이템 컴포넌트
JRadioButtonMenuItem JRadioButton으로 선택할 수 있는 메뉴 아이템 컴포넌트
JSeparator 메뉴를 수직 또는 수평으로 분리시키는 컴포넌트

 

 

각 컴포넌트의 사용 위치를 그림으로 표시 

 

 

 

 

메뉴 생성

 

메뉴를 생성하기 위해서는 제일 먼저 JMenuBar를 생성하고 윈도우 컨테이너 상단에 배치해야 한다.

JMenuBar를 배치할 수 있는 윈도우 컨테이너에는 JFrame, JDialog 등이 있다.

 

이 컨테이너는 JMenuBar를 상단에 배치하기 위해 setMenuBar() 메소드를 제공하고 있다.

JMenuBar jMenuBar = new JMenuBar();
jFrame.setJMenuBar(jMenuBar);

 

JMenuBar는 윈도우 상단에 메뉴를 수평으로 배치하는 역할만 하기 때문에 메뉴가 없을 경우에는 윈도우 상단에 보이지 않는다.

JMenu jMenu = new JMenu("메뉴명");
jMenuBar.add(jMenu);

JMenuBar에 추가된 JMenu는 마우스로 클릭했을 때 보여줄 메뉴 아이템과 서브 메뉴를 가져야 한다.

메뉴 아이템은 JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem이고, 서브 메뉴는 JMenu를 말한다.

JMenu의 add() 메소드에 의해 추가된다.

 

//메뉴 아이템 생성
JMenuItem menuItem1 = new JMenuItem("JMenuItem");
JMenuItem menuItem2 = new JCheckBoxMenuItem("JCheckBoxMenuItem");
JMenuItem menuItem3 = new JRadioButtonMenuItem("JRadioButtonMenuItem");
//서브 메뉴 생성
JMenu subMenu = new JMenu("JMenu");
JMenuItem subMenuItem1 = new JMenuItem("JMenuItem");
JMenuItem subMenuItem2 = new JMenuItem("JMenuItem");
jMenuSub.add(subMenuItem1);
jMenuSub.add(subMenuItem1);
//메뉴 아이템과 서브 메뉴 추가

 

 

 

메뉴 텍스트 앞에 아이콘을 넣고 싶다면 JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem 생성자에 ImageIcon 객체를 다음과 같이 추가.

 

JMenuItem mi = new JMenuItem("메뉴명",
 new ImageIcon(getClass().getResource("파일명")));

 

 

 

 

메뉴바, 메뉴, 서브 메뉴, 메뉴 아이템을 생성하고, 추가하는 방법

import java.awt.MenuBar;

import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import javax.swing.SwingUtilities;

public class JMenuExample extends JFrame {
	private JMenuBar jMenuBar;
	private JMenu menuFile, menuNew, menuHelp;
	private JMenuItem menuItemNewFile, menuItemNewFolder;
	private JMenuItem menuItemOpen, menuItemSave, menuItemExit;
	
	
	public JMenuExample() {
		this.setTitle("JMenuExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setJMenuBar(getJMenuBar());
		this.setSize(300,200);
	}
	
	// 메뉴바 생성
	public JMenuBar getJMenuBar() {
		if(jMenuBar == null) {
			jMenuBar = new JMenuBar();
			// 메인 메뉴 추가 : 젤 상단에 2개의 메뉴 표시
			jMenuBar.add(getMenuFile());
			jMenuBar.add(getMenuHelp());
		}
		return jMenuBar;
	}
	
	// 파일 관련 메뉴 : 새파일, 열기, 저장, 나가기
	public JMenu getMenuFile() {
		if (menuFile == null) {
			menuFile = new JMenu("파일");
			// 서브메뉴와 메뉴 아이템 추가
			menuFile.add(getMenuNew());
			menuFile.add(getMenuItemOpen());
			menuFile.add(getMenuItemSave());
			menuFile.add(new JSeparator());
			menuFile.add(getMenuItemExit());
		}
		return menuFile;
	}
	
	// 도움말에 관련 메뉴 : 도움말
	public JMenu getMenuHelp() {
		if (menuHelp == null) {
		menuHelp = new JMenu("도움말");
		}
		return menuHelp;
	}
	
	// 새로 만들기 서브 메뉴 생성
	public JMenu getMenuNew() {
		if (menuNew == null) {
			menuNew = new JMenu("새로 만들기");
			// 메뉴 아이템 추가
			menuNew.add(getMenuItemNewFile());
			menuNew.add(getMenuItemNewFolder());
		}
		return menuNew;
	}
	
	// 새로 만들기 : 새파일, 새폴더 	서브메뉴
	public JMenuItem getMenuItemNewFile() {
		if (menuItemNewFile == null) {
			menuItemNewFile = new JMenuItem("새 파일");
		}
		return menuItemNewFile;
	}
	
	// 새폴더
	public JMenuItem getMenuItemNewFolder() {
		if(menuItemNewFolder == null) {
			menuItemNewFolder = new JMenuItem("새 폴더");
		}
		return menuItemNewFolder;
	}
	
	// 파일 열기 : 이미지를 포함한 텍스트
	public JMenuItem getMenuItemOpen() {
		if(menuItemOpen == null) {
			menuItemOpen = new JMenuItem("파일 열기", new ImageIcon(getClass().getResource("open.gif")));
		}
		return menuItemOpen;
	}
	
	public JMenuItem getMenuItemSave() {
		if (menuItemSave == null) {
			menuItemSave = new JCheckBoxMenuItem("파일 저장");
		}
		return menuItemSave;
	}
	
	public JMenuItem getMenuItemExit() {
		if(menuItemExit == null) {
			menuItemExit = new JMenuItem("종료");
		}
		return menuItemExit;
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
			JMenuExample jFrame = new JMenuExample();
			jFrame.setVisible(true);
			}
		});	
	}
}

- 실행 결과 -

 

 

 

 

이벤트 처리

사용자가 마우스로 메뉴 아이템을 선택하면 ActionEvent가 발생하게 된다.

메뉴 아이템에 ActionListener를 등록하여 이벤트를 처리할 수 있다.

메뉴 아이템마다 별도의 ActionListener를 추가해도 되지만, 하나만 만들어서 모든 메뉴 아이템의 ActionEvent를 처리하는 것이 편리하다.

 

 

ActionEvent 의 getSource ( ) 는 마우스로 선택한 JMenuItem 을 리턴하고, getActionCommand()는 JMenuItem의 텍스트를 리턴한다.

 

2가지 방법으로 구분이 가능

public class MenuActionListener implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    //선택된 JMenuItem 객체로 구분
    JMenuItem selected = e.getSource();
    if(selected = = menuItem1) { //처리 코드 }
    else if(selected = = menuItem2) { //처리 코드 }
    //선택된 JMenuItem의 텍스트로 구분
    String ae = e.getActionCommand();
    if(ae.equals("메뉴 문자열1")) { //처리 코드 }
    else if(ae.equals("메뉴 문자열2")) { //처리 코드 }
  }
}

JCheckBoxMenuItem과 JRadioButtonMenuItem의 경우 현재 선택되어 있는지, 아닌지에 따라 처리 코드 내용이 달라질 수 있기 때문에 선택 여부를 알 필요가 있고, 선택 및 해제가 코드로 가 능해야 한다.

 

JCheckBoxMenuItem과 JRadioButtonMenuItem는 모두 isSelected() 메소드로 선택 여부를 알 수 있고, setSelected() 메소드로 선택 및 해제를 할 수 있다.

JCheckBoxMenuItem은 추가로 getState()와 setState()를 제공하는데, 이들 메소드를 사용해도 된다

 

jCheckBoxMenuItem.addActionListener( new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    if(jCheckBoxMenuItem.isSelected()) {
     //선택 상태일 때 실행할 코드
    } else {
    //해제 상태일 때 실행할 코드
  }
}

 

 

 

JCheckBoxMenuItem에서 선택과 해제 상태를 메시지 다이얼로그로 보여주는 방법

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class JMenuExample2 extends JFrame {
	private JMenuBar jMenuBar;
	private JMenu menuFile;
	private JMenuItem menuItemSave, menuItemExit;
	
	public JMenuExample2() {
		this.setTitle("JMenuExample2");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setJMenuBar(getJMenuBar());
		this.setSize(300, 200);
	}
	
	// JMenuBar 생성
	public JMenuBar getJMenuBar() {
		if(jMenuBar == null) {
			jMenuBar = new JMenuBar();
			jMenuBar.add(getMenuFile());
		}
		return jMenuBar;
	}
	
	// 파일 메뉴 생성
	public JMenu getMenuFile() {
		if(menuFile == null) {
			menuFile = new JMenu("파일");
			menuFile.add(getMenuItemSave());
			menuFile.add(getMenuItemExit());
		}
		return menuFile;
	}
	
	// 파일 저장 메뉴 아이템 생성(실행 : 리스너 추가)
	public JMenuItem getMenuItemSave() {
		if(menuItemSave == null) {
			menuItemSave = new JCheckBoxMenuItem("파일 저장");
			menuItemSave.addActionListener(actionListener);
		}
		return menuItemSave;
	}
	
	// 종료 메뉴 아이템 생성
	public JMenuItem getMenuItemExit() {
		if(menuItemExit == null) {
			menuItemExit = new JMenuItem("종료");
			menuItemExit.addActionListener(actionListener);
		}
		return menuItemExit;
	}
	
	// 메뉴 선택 이벤트로 처리하는 ActionListener 필드 선언
	private ActionListener actionListener = new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			if(e.getSource() == menuItemSave) {
				if(menuItemSave.isSelected()) {
					JOptionPane.showMessageDialog(
							JMenuExample2.this, "해제 상태 >> 체크 상태.");					
				} else {
					JOptionPane.showMessageDialog(
							JMenuExample2.this, "체크상태 >> 해제 상태.");
				}
			} else if(e.getSource() == menuItemExit) {
				System.exit(0);
			}
		}
	};
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
			JMenuExample2 jFrame = new JMenuExample2();
			jFrame.setVisible(true);
			}
		});
	}
}

 

- 실행 결과 -

 



728x90
반응형