2012-10-13 1 views
1

내 코드 또는 Java 1.7에 문제가 있는지 확실하지 않습니다.사용자 정의 Popup을 사용하여 Java 1.7의 JMenuItem ActionListener에 마우스를 놓친 경우

아래의 코드 (주로 Java Popup Demo에 기반 함)에서 마우스 오른쪽 버튼을 클릭하면 팝업이 나타납니다. 팝업 메뉴 항목은 마우스를 올리면 강조 표시되고 JmenuItem을 클릭하면 팝업이 사라집니다. 그러나 JMenuItem의 actionEvent는 클릭 할 때 발생하지 않습니다 (JTextArea에보고되어야 함).

기타 흙 받이 : JMenuItem (여기에서 "a")에 대한 니모닉을 입력하면 actionEvent가 실행됩니다 (이벤트는 JTextArea에보고됩니다).

사용자 지정 팝업 (팩토리)을 연결하지 않으면 마우스 클릭으로 actionEvent가 예상대로 발생합니다.

 
    java version "1.6.0_33" 
    Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-11M3720) 
    Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode) 

이 어떤 도움/생각이 크게 감사합니다 :이 코드와 잘 동작

 
    java version "1.7.0_07" 
    Java(TM) SE Runtime Environment (build 1.7.0_07-b10) 
    Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode) 

: 나는이 문제가 발생 OSX 10.7.5

사용하고

! 자체 포함 된 코드 예제는 다음과 같습니다.

감사

앤드류는

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class PopupMenuDemo implements ActionListener { 
    JTextArea output; 
    JScrollPane scrollPane; 
    String newline = "\n"; 

    public Container createContentPane() { 
     JPanel contentPane = new JPanel(new BorderLayout()); 
     contentPane.setOpaque(true); 
     output = new JTextArea(5, 30); 
     output.setEditable(false); 
     scrollPane = new JScrollPane(output); 
     contentPane.add(scrollPane, BorderLayout.CENTER); 
     return contentPane; 
    } 

    public void createPopupMenu() { 
     JMenuItem menuItem; 
     JPopupMenu popup = new JPopupMenu(); 
     menuItem = new JMenuItem("A popup menu item", 'a'); 
     menuItem.addActionListener(this); 
     popup.add(menuItem); 
     MouseListener popupListener = new PopupListener(popup); 
     output.addMouseListener(popupListener); 
    } 

    public void actionPerformed(ActionEvent e) { 
     JMenuItem source = (JMenuItem)(e.getSource()); 
     String s = "Action event detected." 
     + newline 
     + " Event source: " + source.getText() 
     + " (an instance of " + source.getClass().getName() + ")"; 
     output.append(s + newline); 
     output.setCaretPosition(output.getDocument().getLength()); 
    } 

    private void createAndShowGUI() { 
     JFrame frame = new JFrame("PopupMenuDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    PopupFactory.setSharedInstance(new MyPopupFactory()); 
     PopupMenuDemo demo = new PopupMenuDemo(); 
     frame.setContentPane(demo.createContentPane()); 

     demo.createPopupMenu(); 

     frame.setSize(450, 260); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new PopupMenuDemo().createAndShowGUI(); 
     } 
     }); 
    } 

    class PopupListener extends MouseAdapter { 
     JPopupMenu popup; 

     PopupListener(JPopupMenu popupMenu) { 
      popup = popupMenu; 
     } 

     public void mousePressed(MouseEvent e) { 
      maybeShowPopup(e); 
     } 

     public void mouseReleased(MouseEvent e) { 
      maybeShowPopup(e); 
     } 

     private void maybeShowPopup(MouseEvent e) { 
      if (e.isPopupTrigger()) { 
       popup.show(e.getComponent(), e.getX(), e.getY()); 
      } 
     } 
    } 

    class MyPopupFactory extends PopupFactory { 
    public Popup getPopup(Component owner, Component contents, int x, int y) throws IllegalArgumentException { 
     return new MyPopup(owner, contents, x, y); 
    } 
    } 

    class MyPopup extends Popup { 
    private JWindow popupWindow; 

    MyPopup(Component owner, Component contents, int ownerX, int ownerY) { 
     popupWindow = new JWindow(); 
     popupWindow.setLocation(ownerX, ownerY); 
     popupWindow.getContentPane().add(contents, BorderLayout.CENTER); 
     contents.invalidate(); 
    } 

    public void show() { 
     popupWindow.setVisible(true); 
     popupWindow.pack(); 
    } 

    public void hide() { 
     popupWindow.setVisible(false); 
     popupWindow.removeAll(); 
     popupWindow.dispose(); 
    } 
    } 
} 
+0

반투명 팝업을 얻기위한 것이라면 [최근 QA] (http : // stackoverflow .com/q/12801035/203657)는 한 번 볼만한 가치가 있습니다. – kleopatra

답변

0

첫째, 나는 팝업 트리거를 모니터링 할 MouseListener을 사용하여 멀리 할 것, 당신은 JComponent#setComponentPopupMenu를 사용하는 것이 더 낫다 당신이 자기 번거 로움있어 저장합니다.

둘째, 왜 자신 만의 팝업 공장을 제공하고 싶은지 모르지만 문제가 발생합니다. popupWindow.dispose 행을 주석 처리하면 작동합니다. 이유에 관해서는, 내가 코드를 디버깅 할 수 있도록 IDE가 재생할 수 있습니다 : P

+0

setComponentPopupMenu와 관련하여 조언 해 주셔서 감사합니다. 내 팝업에서 픽셀 당 투명성을 얻기 위해 내 자신의 팝업 공장을 만들고 있습니다. 어느 쪽도 UIManager.put ("ToolTip.background", 새로운 Color (0,0,0,0)); 또는 UIManager.put ("PopupMenu.background", new Color (0,0,0,0)); 일했다. 그래서 모든 팝업을 배경색 = (0, 0, 0, 0) 인 JWindows로 설정합니다. 그것은 1.6에서 일하고있었습니다. 다른 접근법은 대단히 환영 할 것입니다. 다시 한번 감사드립니다. – user1743927

+0

자바 팝업 메뉴에서 PopupMenuListener를 사용자 정의 팝업/popupfactory로 설정하면 JMenuItem을 클릭하면 popupMenuCanceled()가 호출되고 popupMenuWillBecomeInvisible()이 호출됩니다. 내 사용자 지정 팝업/popupfactory가없는 Java 1.7 (또는 사용자 지정 팝업/popupfactory가없는 Java 1.6 또는 OR)에서는 JMenuItem을 클릭 할 때 popupMenuWillBecomeInvisible() 만 호출됩니다. 코드를 게시하는 것이 유용한 지 알려주십시오. popupMenuCanceled()는 메뉴 항목을 클릭 할 때 호출되어야합니다. 그렇지 않습니다. – user1743927

+0

동의합니다. 팝업 취소가 잘못되었습니다. 질문은 당신이 공장에서이 행동을 일으키는 이유는 무엇입니까? – MadProgrammer

관련 문제