[표 14-4] JCheckBoxMenuItem 클래스 다이어그램
속성 | 데이터 타입 | get | is | set | 디폴트 값 |
---|---|---|---|---|---|
accessibleContexto | AccessibleContext | · | JCheckBoxMenuItem. AccessibleJCheckBoxMenuItem( ) |
||
selectedObjectso | Object[ ] | · | |||
state | boolean | · | · | false | |
UIb | CheckBoxMenuItemUI | · | · | From L&F | |
UIClassIDo | String | · | "CheckBoxMenuItem" | ||
bbound, ooverridden JmenuItem 클래스를 보려면 [표14-4] 참조. |
public JCheckBoxMenuItem( ) public JCheckBoxMenuItem(Action action) public JCheckBoxMenuItem(Icon icon) public JCheckBoxMenuItem(String text) public JCheckBoxMenuItem(String text, Icon icon) public JCheckBoxMenuItem(String text, boolean checked) public JCheckBoxMenuItem(String text, Icon icon, boolean checked)버전 1.3 이후부터 이러한 생성자들은 특화된 작업, 아이콘, 문자열을 가진 JcheckBoxMenuItem을 초기화 한다. 부가적인 boolean 값은 메뉴가 화면에 보여질 때 메뉴 아이템의 체크 여부 나타내는 state 속성을 초기화 한다.
public void updateUI( )현재의 UI 매니저와 컴포넌트를 위한 대리자(delegate)를 초기화 하고 L&F을 갱신한다.
// CheckBoxMenuItemExample.java // import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class CheckBoxMenuItemExample extends JPanel { public JTextPane pane; public JMenuBar menuBar; public JToolBar toolBar; public CheckBoxMenuItemExample( ) { menuBar = new JMenuBar( ); JMenu justifyMenu = new JMenu("Justify"); ActionListener actionPrinter = new ActionListener( ) { public void actionPerformed(ActionEvent e) { try { pane.getStyledDocument( ).insertString(0 , "Action ["+e.getActionCommand( )+"] performed!\n", null); } catch (Exception ex) { ex.printStackTrace( ); } } }; JCheckBoxMenuItem leftJustify = new JCheckBoxMenuItem("Left", new ImageIcon("left.gif")); leftJustify.setHorizontalTextPosition(JMenuItem.RIGHT); leftJustify.setAccelerator(KeyStroke.getKeyStroke("L", Toolkit.getDefaultToolkit( ).getMenuShortcutKeyMask( ))); leftJustify.addActionListener(actionPrinter); JCheckBoxMenuItem rightJustify = new JCheckBoxMenuItem("Right", new ImageIcon("right.gif")); rightJustify.setHorizontalTextPosition(JMenuItem.RIGHT); rightJustify.setAccelerator(KeyStroke.getKeyStroke("R", Toolkit.getDefaultToolkit( ).getMenuShortcutKeyMask( ))); rightJustify.addActionListener(actionPrinter); JCheckBoxMenuItem centerJustify = new JCheckBoxMenuItem("Center", new ImageIcon("center.gif")); centerJustify.setHorizontalTextPosition(JMenuItem.RIGHT); centerJustify.setAccelerator(KeyStroke.getKeyStroke("M", Toolkit.getDefaultToolkit( ).getMenuShortcutKeyMask( ))); centerJustify.addActionListener(actionPrinter); JCheckBoxMenuItem fullJustify = new JCheckBoxMenuItem("Full", new ImageIcon("full.gif")); fullJustify.setHorizontalTextPosition(JMenuItem.RIGHT); fullJustify.setAccelerator(KeyStroke.getKeyStroke("F", Toolkit.getDefaultToolkit( ).getMenuShortcutKeyMask( ))); fullJustify.addActionListener(actionPrinter); justifyMenu.add(leftJustify); justifyMenu.add(rightJustify); justifyMenu.add(centerJustify); justifyMenu.add(fullJustify); menuBar.add(justifyMenu); menuBar.setBorder(new BevelBorder(BevelBorder.RAISED)); } public static void main(String s[ ]) { CheckBoxMenuItemExample example = new CheckBoxMenuItemExample( ); example.pane = new JTextPane( ); example.pane.setPreferredSize(new Dimension(250, 250)); example.pane.setBorder(new BevelBorder(BevelBorder.LOWERED)); JFrame frame = new JFrame("Menu Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setJMenuBar(example.menuBar); frame.getContentPane( ).add(example.pane, BorderLayout.CENTER); frame.pack( ); frame.setVisible(true); } }
[그림 14-15] 체크박스 메뉴 아이템 예제
참고 도서 Java Swing, 2nd Edition |
[그림 14-16] 라디오 버튼 메뉴 아이템 클래스 다이어그램
속성 | 데이터 타입 | get | is | set | 디폴트 값 |
---|---|---|---|---|---|
accessibleContexto | AccessibleContext | · | JRadioButtonMenuItem. AccessibleJRadioButtonMenu-Item( ) |
||
UIb | RadioButtonMenuItemUI | · | · | From L&F | |
UIClassIDo | String | · | "CheckBoxMenuItem" | ||
bbound, ooverridden JmenuItem 클래스를 보려면 [표14-4] 참조. |
public JRadioButtonMenuItem( ) public JRadioButtonMenuItem(Action action) public JRadioButtonMenuItem(Icon icon) public JRadioButtonMenuItem(String text) public JRadioButtonMenuItem(String text, Icon icon)버전 1.3 이후 이러한 생성자들은 특화된 작업, 아이콘, 문자열을 가진 JRadioButtonMenuItem을 초기화 한다.
public void updateUI( )현재의 UI 매니저와 컴포넌트를 위한 대리자(delegate)를 초기화 하고 L&F을 갱신한다.
// RadioButtonMenuItemExample.java // import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class RadioButtonMenuItemExample extends JPanel { public JTextPane pane; public JMenuBar menuBar; public JToolBar toolBar; public RadioButtonMenuItemExample( ) { menuBar = new JMenuBar( ); JMenu justifyMenu = new JMenu("Justify"); ActionListener actionPrinter = new ActionListener( ) { public void actionPerformed(ActionEvent e) { try { pane.getStyledDocument( ).insertString(0 , "Action ["+e.getActionCommand( )+"] performed!\n", null); } catch (Exception ex) { ex.printStackTrace( ); } } }; JRadioButtonMenuItem leftJustify = new JRadioButtonMenuItem("Left", new ImageIcon("left.gif")); leftJustify.setHorizontalTextPosition(JMenuItem.RIGHT); leftJustify.setAccelerator(KeyStroke.getKeyStroke("L", Toolkit.getDefaultToolkit( ).getMenuShortcutKeyMask( ))); leftJustify.addActionListener(actionPrinter); JRadioButtonMenuItem rightJustify = new JRadioButtonMenuItem("Right", new ImageIcon("right.gif")); rightJustify.setHorizontalTextPosition(JMenuItem.RIGHT); rightJustify.setAccelerator(KeyStroke.getKeyStroke("R", Toolkit.getDefaultToolkit( ).getMenuShortcutKeyMask( ))); rightJustify.addActionListener(actionPrinter); JRadioButtonMenuItem centerJustify = new JRadioButtonMenuItem("Center", new ImageIcon("center.gif")); centerJustify.setHorizontalTextPosition(JMenuItem.RIGHT); centerJustify.setAccelerator(KeyStroke.getKeyStroke("M", Toolkit.getDefaultToolkit( ).getMenuShortcutKeyMask( ))); centerJustify.addActionListener(actionPrinter); JRadioButtonMenuItem fullJustify = new JRadioButtonMenuItem("Full", new ImageIcon("full.gif")); fullJustify.setHorizontalTextPosition(JMenuItem.RIGHT); fullJustify.setAccelerator(KeyStroke.getKeyStroke("F", Toolkit.getDefaultToolkit( ).getMenuShortcutKeyMask( ))); fullJustify.addActionListener(actionPrinter); ButtonGroup group = new ButtonGroup( ); group.add(leftJustify); group.add(rightJustify); group.add(centerJustify); group.add(fullJustify); justifyMenu.add(leftJustify); justifyMenu.add(rightJustify); justifyMenu.add(centerJustify); justifyMenu.add(fullJustify); menuBar.add(justifyMenu); menuBar.setBorder(new BevelBorder(BevelBorder.RAISED)); } public static void main(String s[ ]) { RadioButtonMenuItemExample example = new RadioButtonMenuItemExample( ); example.pane = new JTextPane( ); example.pane.setPreferredSize(new Dimension(250, 250)); example.pane.setBorder(new BevelBorder(BevelBorder.LOWERED)); JFrame frame = new JFrame("Menu Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setJMenuBar(example.menuBar); frame.getContentPane( ).add(example.pane, BorderLayout.CENTER); frame.pack( ); frame.setVisible(true); } }[그림 14-17]은 예제를 실행시킨 것이다. JradioButtonMenuItems의 상호 간섭을 보여주기 위해 ButtonGroup 객체를 사용했다. 하나의 메뉴를 선택하면 다른 메뉴의 선택이 해제된다.
[그림 14-17] 라디오 버튼 메뉴 아이템 예제
속성 | 데이터 타입 | get | is | set | 디폴트 값 |
---|---|---|---|---|---|
accessibleContexto | AccessibleContext | · | JSeparator.accessibleJSeparator( ) | ||
orientation | int | · | · | SwingConstants.HORIZONTAL | |
UIb | SeparatorUI | · | · | From L&F | |
UIClassIDo | String | · | "SeparatorUI" | ||
bbound, ooverridden Jcomponent 클래스를 보려면 [Table 3-6] 참조 |
JSeparator( ) JSeparator(int orientation)구분자를 생성한다. 기본적으로 구분자는 수평이지만 SwingConstants.HORIZONTAL 또는 SwingConstants.VERTICAL을 통해 방향을 조정할 수 있다.
public void updateUI( )현재의 UI 매니저와 컴포넌트를 위한 대리자(delegate)를 초기화 하고 L&F을 갱신한다.
// SeparatorExample.java // import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class SeparatorExample extends JPanel { public SeparatorExample( ) { super(true); setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); Box box1 = new Box(BoxLayout.X_AXIS); Box box2 = new Box(BoxLayout.X_AXIS); Box box3 = new Box(BoxLayout.X_AXIS); box1.add(new JButton("Press Me")); box1.add(new JButton("No Me!")); box1.add(new JButton("Ignore Them!")); box2.add(new JSeparator( )); box3.add(new JButton("I"m the Button!")); box3.add(new JButton("It"s me!")); box3.add(new JButton("Go Away!")); add(box1); add(box2); add(box3); } public static void main(String s[ ]) { SeparatorExample example = new SeparatorExample( ); JFrame frame = new JFrame("Separator Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(example); frame.pack( ); frame.setVisible(true); } }아래 [그림 14-18]은 예제를 실행시킨 것이다. 구분자가 보이지 않는 플랫폼상에서는 이러한 방법으로는 구분자를 나타내기가 까다로울 뿐만 아니라 쉽지도 않다. (심지어 본 예제에서도 구분자는 잘 보이지 않는다.)
[그림 14-18] 두개의 버튼 그룹사이에 독립적인 구분자
public void processMouseEvent(MouseEvent event,MenuElement path[ ], MenuSelectionManager manager)이 메소드는 마우스에 의해 발생된 이벤트를 처리한다. MouseEvent 이외에 추가적으로 선택된 메뉴 요소의 현재 경로 뿐만 아니라 현재 메뉴 매니저의 참조자를 제공한다. 대부분의 작업에 이 메소드는 필수이다.
public void processKeyEvent(KeyEvent event, MenuElement path[ ], MenuSelectionManager manager)이 메소드는 키보드에 의해 발생된 이벤트를 처리한다. MouseEvent 이외에 추가적으로 선택된 메뉴 요소의 현재 경로 뿐만 아니라 현재 메뉴 매니저의 참조자를 제공한다. 대부분의 작업에 이 메소드는 필수적이다.
public void menuSelectionChanged(boolean isIncluded)메뉴 요소가 현재 작업 메뉴에 추가되거나 제거되었을 때 호출된다.
public MenuElement[ ] getSubElements( )현재 작업하는 MenuElement를 위한 하위요소의 배열을 반환한다. 특정 메뉴 요소가 하위 요소를 가질 때 필요한 메소드이다.
public Component getComponent( )메뉴 아이템을 화면에 나타내주는 컴포넌트의 참조자를 반환한다.
// MenuElementExample.java // import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; public class MenuElementExample extends JPanel { public JPopupMenu popup; SliderMenuItem slider; int theValue = 0; public MenuElementExample( ) { popup = new JPopupMenu( ); slider = new SliderMenuItem( ); popup.add(slider); popup.add(new JSeparator( )); JMenuItem ticks = new JCheckBoxMenuItem("Slider Tick Marks"); ticks.addActionListener(new ActionListener( ) { public void actionPerformed(ActionEvent event) { slider.setPaintTicks(!slider.getPaintTicks( )); } }); JMenuItem labels = new JCheckBoxMenuItem("Slider Labels"); labels.addActionListener(new ActionListener( ) { public void actionPerformed(ActionEvent event) { slider.setPaintLabels(!slider.getPaintLabels( )); } }); popup.add(ticks); popup.add(labels); popup.addPopupMenuListener(new PopupPrintListener( )); addMouseListener(new MousePopupListener( )); } // 내부 클래스는 마우스 이벤트가 팝업 트리거 인지 조사한다. class MousePopupListener extends MouseAdapter { public void mousePressed(MouseEvent e) { checkPopup(e); } public void mouseClicked(MouseEvent e) { checkPopup(e); } public void mouseReleased(MouseEvent e) { checkPopup(e); } private void checkPopup(MouseEvent e) { if (e.isPopupTrigger( )) { popup.show(MenuElementExample.this, e.getX( ), e.getY( )); } } } // 내부 클래스는 팝업 이벤트에 대응하는 정보를 출력한다. class PopupPrintListener implements PopupMenuListener { public void popupMenuWillBecomeVisible(PopupMenuEvent e) { } public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { theValue = slider.getValue( ); System.out.println("The value is now " + theValue); } public void popupMenuCanceled(PopupMenuEvent e) { System.out.println("Popup menu is hidden!"); } } public static void main(String s[ ]) { JFrame frame = new JFrame("Menu Element Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(new MenuElementExample( )); frame.setSize(300, 300); frame.setVisible(true); } // 내부 클래스는 슬라이더 메뉴 아이템을 정의한다. class SliderMenuItem extends JSlider implements MenuElement { public SliderMenuItem( ) { setBorder(new CompoundBorder(new TitledBorder("Control"), new EmptyBorder(10, 10, 10, 10))); setMajorTickSpacing(20); setMinorTickSpacing(10); } public void processMouseEvent(MouseEvent e, MenuElement path[ ], MenuSelectionManager manager) {} public void processKeyEvent(KeyEvent e, MenuElement path[ ], MenuSelectionManager manager) {} public void menuSelectionChanged(boolean isIncluded) {} public MenuElement[ ] getSubElements( ) {return new MenuElement[0];} public Component getComponent( ) {return this;} } }이전 팝업 예제 PopupMenuExample와 같이 MouseListener를 상속받고 팝업 출력 여부를 보기 위해 입력되는 마우스 이벤트를 검사한다. 내부 클래스 SliderMenuItem가 MenuElement 인터페이스를 상속 받았다는 것이 이번 예제의 핵심이다. 이러한 방법은 쉬운 편이다. 메뉴 슬라이더는 하위 요소를 가지지 않을 뿐더러 선택의 개념도 없고 마우스나 키보드 이벤트에 대해서 특별한 작업을 수행하지도 않기 때문이다.
[그림 14-19] 두개의 L&F에서 팝업 메뉴 요소 같은 JSlider
이전 글 : 이제막 병아리 티를 벗어난 시스템 관리자라면...
다음 글 : 리눅스 청부 살인 사건
최신 콘텐츠