2012-04-16 3 views
4

JMenuItem없이 JMenu (인스턴스 이름 : exitMenu)를 삽입 했으므로 불필요한 메뉴 항목을 사용하지 않고도 프로그램을 종료 할 수 있습니다. 하나의 JMenu 객체 (Someone might might says : WTF !!!하지만 ...).Java JMenu - 선택 및 선택 취소 기능

따라서이 특정 JMenu 구성 요소에서 발생한 이벤트를 캡처하기 위해 my 클래스는 MenuListener 인터페이스를 구현합니다. 모든 사람이 알고 있듯이, menuSelected() 메소드를 하나만 사용해야 할 필요는 있지만 세 가지 필수 구현 메소드가 있습니다.

내 프로그램을 조금 직관적으로 만들려면 의심 할 여지없이 사용자가 exitMenu를 선택하면 유명한 팝업 JOptionPane.showConfirmDialog()가 YES 또는 NO 옵션 중에서 선택해야하는 곳을 제시합니다.

프로그램이 System.exit (0)을 통해 끝났기 때문에 선택한 옵션이 예이면 전혀 문제가 없습니다. 문제는 NO 옵션으로 포커스가 프로그램으로 돌아 왔을 때 exitMenu가 선택된 상태로 남아 있습니다. 이전에 선택했기 때문에 물론입니다. "할 일"은 NO 옵션을 선택한 직후 개체 선택을 제거하여 사용자가 다시 클릭 할 수있게하는 것입니다.

exitMenu 구성 요소가 "선택 해제"되어 있지만 3 개의 필수 메소드 (하나는 다른 하나를 호출)에서 exitMenu.setSelected (false)를 사용하더라도 이벤트 리스너를 호출하려면 두 번 클릭해야합니다.

의견이 있으십니까? 사전에

감사합니다.

+0

MenuListener

  • JMenuItem가 : 뭔가 같은 'mainPanel.requestFocus와 같은 다른 장소 () '? – Fido

  • +0

    나는 빌어 먹을 메서드 (requestFocus)의 이름을 기억하려고했지만 테스트를 통과했지만 불행히도 작동하지 않았습니다. 어쨌든 감사합니다. – LucDaher

    답변

    4

    내가 시도한 한 가지는 menuSelected (...) 메소드 내에서 setSelected(false)을 호출하는 것이지만 부작용이 있습니다. 하나는 메뉴가 선택되지 않은 것으로 나타나고 다른 메뉴는 항상 작동하지 않습니다.

    가능한 해결책 중 하나는 스윙 타이머에서 메뉴 선택을 취소하는 것입니다.

     @Override 
        public void menuSelected(MenuEvent mEvt) { 
         // show JOptionPane 
         // if yes selected, exit. 
    
         // Otherwise... 
         final JMenu menu = (JMenu) mEvt.getSource(); 
         new Timer(200, new ActionListener() { 
    
          @Override 
          public void actionPerformed(ActionEvent e) { 
           menu.setSelected(false); 
           ((Timer)e.getSource()).stop(); 
          } 
         }).start(); 
        } 
    
    +1

    +1 또한'invokeLater()'를 고려하십시오. – trashgod

    +0

    흥미로운 접근 방식 ... 더 많은 작업을해야합니다. Timer를 사용해야합니다 ... 시도해보고 피드백을 드리겠습니다. 감사. – LucDaher

    +0

    죄송합니다 ... 역시 작동하지 않았습니다. 그러나 해결책이있을 수 있습니다 ... 그들은이 이슈를 해결하는 방법을 생각하지 않고 그러한 이벤트를 제공하지 않았습니다. – LucDaher

    2

    • JMenu에 대한 두 가지 수준이 있습니다 당신이 초점을 전송하려고 했 ButtonModel

    관련 문제