[그림 14-9] 스윙에서 팝업 메뉴
[그림 14-10] JPopupMenu 클래스 다이어그램
public void processMouseEvent(MouseEvent e) { if (e.isPopupTrigger( )) { popup.show(this, e.getX( ), e.getY( )); } else { super.processMouseEvent(e); } }마우스 이벤트가 팝업 트리거인지 아닌지 체크하는 java.awt.event.MouseEvent의 isPopupTrigger()와 같은 플랫폼 독립적인 방법의 사용을 주의해서 살펴보기 바란다. SDK 1.3이후부터 JPopupMenu는 같은 방식으로 사용할 수 있는 동등한 메소드를 제공하고 있다.
속성 | 데이터 타입 | get | is | set | 디폴트 값 |
---|---|---|---|---|---|
accessibleContexto | Accessible Context | · | JMenuItem.AccessibleJMenuItem( ) | ||
borderPaintedo | boolean | · | · | true | |
component | Component | · | |||
componentAtIndexi | Component | · | |||
invoker | Component | · | · | ||
labelb | String | · | · | "" | |
layouto | LayoutManager | · | · | GridBagLayout( ) | |
lightWeightPopupEnabled | boolean | · | · | getDefaultLightWeightPop-upEnabled( ) | |
locationo | Point | · | |||
margin | Insets | · | |||
popupMenuListeners1.4 | PopupMenuListener[ ] | · | |||
popupSize | Dimension | · | |||
selectionModel | SingleSelectionModel | · | DefaultSingleSelectionMo-del( ) | ||
subElements | MenuElement[ ] | · | |||
UIb | PopupMenuUI | · | · | BasicPopupMenuUI( ) | |
UIClassIDo | String | · | "PopupMenuUI" | ||
visibleb, o | boolean | · | · | false | |
1.4since 1.4, bbound, iindexed, ooverridden |
참고 도서 Java Swing, 2nd Edition |
public void addPopupMenuListener(PopupMenuListener l) public void removePopupMenuListener(PopupMenuListener l)객체 이벤트 큐(Queue)로부터 PopupMenuListener를 추가하거나 삭제 할 수 있다.
public JPopupMenu( ) public JPopupMenu(String title)첫 번째는 메뉴 타이틀이 없는 팝업 메뉴를 생성하고 그 다음 것은 메뉴 타이틀을 위해 String 을 사용할 수 있다.
public JMenuItem add(JMenuItem menuItem) public Component add(Component c) public JMenuItem add(Action a)다양한 요소들을 팝업 메뉴에 추가할 수 있다. JmenuItem 또는 Jcomponent 중에 하나를 상속 받은 객체는 팝업 메뉴에 추가될 수 있다. 만약 MenuElement 인터페이스를 상속 받았다면 가장 후자의 기능을 이용하는 것이 좋다. 만약 Action을 명시하면 JmenuItem의 많은 속성을 사용할 수 있고 텍스트는 이미지 아이콘의 오른쪽에 오게된다. 또한 메뉴 아이템은 이름, 아이콘, 상태의 변경을 갱신 하기 위한 Action과 관계를 지속하며 그 결과 JmenuItem이 리턴되고 이것을 통해 메뉴 아이템 포맷을 변경할 수 있다.
public JMenuItem insert(Action a, int index) public Component insert(Component component, int index)JComponent 또는 Action을 이용하여 특정 인덱스에 특정한 메뉴 아이템을 추가할 수도 있다. MenuElement 인터페이스를 상속 받고 Jcomponent를 사용하는 것이 가장 좋다. Action을 명시하면 JmenuItem의 많은 속성을 사용할 수 있고 텍스트는 이미지 아이콘의 오른쪽에 오기 때문이다. 또한 메뉴 아이템은 이름, 아이콘, 상태의 변경을 갱신 하기 위한 Action과 관계를 지속하며 그 결과 JmenuItem이 리턴되고 이것을 통해 메뉴 아이템 포맷을 변경할 수 있다. 특정한 위치 이전이나 이후에 있는 모든 메뉴 아이템의 인덱스들은 증가된다.
public void addSeparator( )팝업 메뉴에 구분자를 추가할 수 있다. 일반적으로 구분자는 메뉴 내 수평선으로 표현된다. 주의할 것은 메뉴 아이템과 마찬가지로 구분자에 인덱스가 할당된다는 것이다. 구분자는 표준 Jseparator와 다르게 내부(inner) 클래스의 인스턴스로 사용되고 항상 수평선이다.
public void show(Component invoker, int x, int y)팝업 메뉴를 원하는 좌표에 오도록 할 수 있다. 이 메소드는 invoking 컴포넌트에 레퍼런스를 갖고 있으며 setInvoker( ), setLocation( ), setVisible( )와 동일한 기능을 수행한다.
public void setPopupSize(int width, int height)팝업 메뉴의 크기를 조절할 수 있는 두 가지 방법 중 한가지이다. 나머지 하나는 Dimension을 취하는 popupSize 속성이다.
public int getComponentIndex(Component c)컴포넌트 레퍼런스 c에 연관된 인덱스를 리턴한다. 만약 연관되는 컴포넌트가 없을 경우 -1을 리턴 한다.
public static boolean getDefaultLightWeightEnabledlightWeightPopupEnabled 속성의 기본 값을 리턴 한다.
public boolean isPopupTrigger(MouseEvent e)SDK 1.3이후, 발생한 마우스 이벤트가 현재 L&F에서 팝업 트리거인지 아닌지의 여부를 가리는 방법 중 하나이다.
public static void setDefaultLightWeightPopupEnabled(boolean aFlag)lightWeightPopupEnabled 속성의 기본값을 설정한다. 이것은 팝업 메뉴를 위해 경량 혹은 중량 컴포넌트 사용 여부를 결정한다.
public void setSelected(Component c)팝업 메뉴 모델에서 특정한 메뉴를 강제로 선택할 수 있다. 이것은 팝업 메뉴에서 단일 선택 모델의 이벤트를 변경시킨다.
public void updateUI( )기본 사용자 인터페이스 매니저를 갱신하고 새로운 PopupMenuUI를 화면에 나타내기 위해 대리자(delegate)를 초기화 한다.
public void menuSelectionChanged(boolean isIncluded) public MenuElement[ ] getSubElements( ) public Component getComponent( ) public void processMouseEvent(MouseEvent event, MenuElement path[ ], MenuSelectionManager manager) public void processKeyEvent(KeyEvent event, MenuElement path[ ], MenuSelectionManager manager)MenuElement 인터페이스를 상속한 것은 다음 챕터에서 다룰 예정이다.
// PopupMenuExample.java // import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; public class PopupMenuExample extends JPanel { public JPopupMenu popup; public PopupMenuExample( ) { popup = new JPopupMenu( ); ActionListener menuListener = new ActionListener( ) { public void actionPerformed(ActionEvent event) { System.out.println("Popup menu item [" + event.getActionCommand( ) + "] was pressed."); } }; JMenuItem item; popup.add(item = new JMenuItem("Left", new ImageIcon("left.gif"))); item.setHorizontalTextPosition(JMenuItem.RIGHT); item.addActionListener(menuListener); popup.add(item = new JMenuItem("Center", new ImageIcon("center.gif"))); item.setHorizontalTextPosition(JMenuItem.RIGHT); item.addActionListener(menuListener); popup.add(item = new JMenuItem("Right", new ImageIcon("right.gif"))); item.setHorizontalTextPosition(JMenuItem.RIGHT); item.addActionListener(menuListener); popup.add(item = new JMenuItem("Full", new ImageIcon("full.gif"))); item.setHorizontalTextPosition(JMenuItem.RIGHT); item.addActionListener(menuListener); popup.addSeparator( ); popup.add(item = new JMenuItem("Settings . . .")); item.addActionListener(menuListener); popup.setLabel("Justification"); popup.setBorder(new BevelBorder(BevelBorder.RAISED)); popup.addPopupMenuListener(new PopupPrintListener( )); addMouseListener(new MousePopupListener( )); } // 마우스 이벤트가 팝업 트리거인지 조사하는 내부(inner) 클래스 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(PopupMenuExample.this, e.getX( ), e.getY( )); } } } // 팝업 이벤트가 발생했을때 보여주는 내부(inner) 클래스 class PopupPrintListener implements PopupMenuListener { public void popupMenuWillBecomeVisible(PopupMenuEvent e) { System.out.println("Popup menu will be visible!"); } public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { System.out.println("Popup menu will be invisible!"); } public void popupMenuCanceled(PopupMenuEvent e) { System.out.println("Popup menu is hidden!"); } } public static void main(String s[ ]) { JFrame frame = new JFrame("Popup Menu Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(new PopupMenuExample( )); frame.setSize(300, 300); frame.setVisible(true); } }이 프로그램의 흥미로운 부분은 MousePopupListener의 메소드 사용일 것이다. 이것은 팝업 메뉴를 화면에 나타나게 하는 이벤트를 받았는지 보기위해 private 메소드 checkPopup( )를 호출한다. 유효한 트리거 이벤트를 발생시켰다면 적절한 위치에 팝업 메뉴가 보일 것이다. 이것은 앞서 보여준 "팝업 메뉴 나타내기"의 processMouseEvent( ) 오버라이딩 접근법 가운데 하나이다.
public PopupMenuEvent(Object source)생성자는 이벤트를 발생시킨 객체의 레퍼런스를 가지고 있다.
public abstract void popupMenuCanceled(PopupMenuEvent e)팝업 메뉴가 취소되었거나 화면에서 사라질 때 호출된다. (실제로는 드물게 발생한다)
public abstract void popupMenuWillBecomeInvisible(PopupMenuEvent e)팝업 메뉴가 화면에서 사라지려고 할 때 발생한다.
public abstract void popupMenuWillBecomeVisible(PopupMenuEvent e)팝업 메뉴가 화면에 보여지려고 할 때 호출된다. 이것은 현재 애플리케이션 상태에 따라 메뉴의 내용을 변경할 수 있는 아주 강력한 기능이다.
이전 글 : 임베디드 시스템과 관련한 하드웨어 기본기를 다지고 싶은 사람에게…
다음 글 : Are you a programmer?
최신 콘텐츠