2011-02-02 4 views
0

INV 프로그램이 메뉴 항목을 제거하기 전에 OK 였지만 그때는 모두 너무 좋아했습니다. 너무 많이했습니다. 그래서 매번 제거 할 때마다 마우스 오른쪽 버튼으로 클릭 한 특정 항목에 대한 메뉴 항목을 추가하려면 어떻게해야합니까?JMenuItems를 효율적으로 추가하는 방법

그래서 항목 1을 마우스 오른쪽 버튼으로 클릭하면 "사용"및 "놓기"가 메뉴에 추가됩니다. 그런 다음 옵션을 선택하면 JMenu가 모든 것을 삭제하여 시작한 위치에서 올바르게 작동하게됩니다. 그런 다음 ITEM 2를 마우스 오른쪽 버튼으로 클릭하면 "사용"과 "취소"가 추가됩니다. 내가 어디로 가는지 보아라. 당신 같이

popup.add(item = new JMenuItem("Cancel")); 
item.addActionListener(menuListener); 

과 : -

내가 나 자신을 일을 시도하지만, 난 그냥 그것을 할 방법을 알아낼 수 없습니다 예를 들어, 새로운 JMenuItem를 추가하려면이 작업을 수행 할 필요가 볼 수 있습니다, actionlistener를 추가하십시오. 나는 그 아래에서 할 수 없다 if (actItemx == "Item 1") { 그래서 ... 나는 무엇을 하느냐?

은 어쨌든, 여기에 내가 지금까지이 작업은 다음과 같습니다

import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.event.*; 

public class inv extends JApplet implements MouseListener 
{ 
    public JList listbox; 
    public JPopupMenu popup; 
    public JMenuItem item; 

    public void init() 
    { 
     ActionListener menuListener = new ActionListener() 
     { 
      public void actionPerformed(ActionEvent event) 
      { 
       String invAction = event.getActionCommand(); 


       int itemSelect = listbox.getSelectedIndex(); 
       Object actItem = listbox.getModel().getElementAt(itemSelect); 

       System.out.println("Popup menu item [" + invAction + "] [ " + actItem + " ] was pressed."); 
      } 
     }; 

     popup = new JPopupMenu(); 

     popup.add(item = new JMenuItem("Use")); 
     item.addActionListener(menuListener); 

     popup.add(item = new JMenuItem("Drop")); 
     item.addActionListener(menuListener); 

     popup.add(item = new JMenuItem("Cancel")); 
     item.addActionListener(menuListener); 



     String listData[] = 
     { 
      "Item 1","Item 2","Item 3","Item 4" 
     }; 

     listbox = new JList(listData); 
     listbox.addMouseListener(new MouseAdapter() 
     { 
      public void mousePressed(MouseEvent e) 
      { 
       if (SwingUtilities.isRightMouseButton(e)) 
       { 
        System.out.println("Row: " + getRow(e.getPoint())); 
        listbox.setSelectedIndex(getRow(e.getPoint())); 
       } 
      } 
     } 
     ); 

     listbox.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     add(listbox); 
     listbox.setVisible(true); 
     listbox.setFocusable(false); 


     listbox.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()) 
      { 

       int itemSelectx = listbox.getSelectedIndex(); 
       Object actItemx = listbox.getModel().getElementAt(itemSelectx); 
       System.out.println("You pressed on " + actItemx); 

      if (actItemx == "Item 1") { 
       System.out.println("Removed cancel for " + actItemx); 
       popup.remove(itemSelectx); // So upon right-click on Item 1, you won't see "Cancel" menu. 
      } 

       popup.show(inv.this, e.getX(), e.getY()); 
       popup.revalidate(); 
      } 
     } 
    } 

    private int getRow(Point point) 
    { 
     return listbox.locationToIndex(point); 
    } 

    public void mouseEntered(MouseEvent e) 
    { 
    } 

    public void mouseReleased(MouseEvent e) 
    { 
    } 

    public void mousePressed(MouseEvent e) 
    { 
    } 

    public void mouseClicked(MouseEvent e) 
    { 
    } 

    public void mouseExited(MouseEvent e) 
    { 
    } 
} 

답변

1

어떤 항목의 각 유형에 대해 서로 다른 JPopup 메뉴의 설정에 대한.

public JPopupMenu useDropPopup; 
public JPopupMenu useCancelPopup; 

public void init() { 
    ActionListener menuListener = new ActionListener() 
     { 
      public void actionPerformed(ActionEvent event) 
      { 
       String invAction = event.getActionCommand(); 


       int itemSelect = listbox.getSelectedIndex(); 
       Object actItem = listbox.getModel().getElementAt(itemSelect); 

       System.out.println("Popup menu item [" + invAction + "] [ " + actItem + " ] was pressed."); 
      } 
     }; 

    useDropPopup = new JPopupMenu(); 
    useCancelPopup = new JPopupMenu(); 

    JMenuItem useMenuItem = new JMenuItem("Use"); 
    useMenuItem.addActionListener(menuListener); 
    JMenuItem dropMenuItem = new JMenuItem("Drop"); 
    dropMenuItem.addActionListener(menuListener); 
    JMenuItem cancelMenuItem = new JMenuItem("Cancel"); 
    cancelMenuItem.addActionListener(menuListener); 

    useDropPopup.add(useMenuItem); 
    useDropPopup.add(dropMenuItem); 

    useCancelPopup.add(useMenuItem); 
    useCancelPopup.add(cancelMenuItem); 

    // ... etc bring up the appropriate popup depending on the item. 
} 

또한, 당신이 메서드 호출의 내부 항목에의 JMenuItem를 할당해서는 안됩니다 : 내가 그 뜻은이처럼 보이는 무언가가있다. 그건 나쁜 습관입니다.

useMenuItem.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent event) { 
     useMenuAction(event); 
    } 
}; 

// ... after the init method 

public void useMenuAction(ActionEvent evt) { 
    // Add specific use menu code here. 
} 
+0

이 기능은 저를 위해 작동하지 않습니다. 새 Q를 게시 할 것입니다. – nn2

0

이 대부분 jluzwick의 대답에 추가되었습니다 :

대신의의 JMenuItem를 작성하면 각 메뉴 항목, 전직의 기능 코드를 분리 할 수 ​​있도록 각 메뉴 항목에 대해 서로 다른 ActionListener를 사용을 고려 ActionListener를 추가하면 액션을 사용할 수 있습니다 - 이것은 기본적으로 이름이있는 ActionListener와 Icon 및 기타 속성을 조합 한 것입니다. (대부분 간단하게 ActionPerformed-Method를 오버라이드하여 AbstractAction에서 연장됩니다.)

그런 다음 JMenu에 액션을 추가하면 JMenuItem 자체가 생성됩니다. (버튼, "일반"메뉴 막대와 같은 다른 장소에서도 동일한 Action 객체를 사용할 수 있습니다.)