메뉴 컴포넌트
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);
}
});
}
}
- 실행 결과 -
'자바' 카테고리의 다른 글
자바 UI - Swing ( 다이얼로그) (2) | 2023.02.20 |
---|---|
자바 UI - Swing (툴바 컴포넌트) (0) | 2023.02.20 |
자바 UI - Swing (트리 컴포넌트) (0) | 2023.02.17 |
자바 UI - Swing (테이블 컴포넌트) (0) | 2023.02.17 |
자바 UI - Swing (리스트 컴포넌트) (0) | 2023.02.17 |