2013-09-24 5 views
5

में आइटम का चयन करते समय उदारता जोड़ें, उपमेनू में किसी आइटम पर क्लिक करने का प्रयास करते समय, अपने माउस को नीचे दिए गए मेनू आइटमों में तेज़ी से खींचना स्वाभाविक है। मेनू और मैक दोनों मूल रूप से मेनू खोलने से पहले एक छोटी देरी डालकर इसे संभालते हैं। स्विंग जेमेनस इसे संभाल नहीं लेते हैं, और मेन्यू माउस को संक्षेप में घुमाएगा माउस माउस के इच्छित मेनू आइटम तक पहुंचने से पहले खोला जाएगा।जावा स्विंग - सबमेनस

उदाहरण के लिए, नीचे दी गई छवि में, अगर मैं Item 3 चयन करने के लिए कोशिश की, लेकिन इस प्रक्रिया में मेरी माउस संक्षिप्त Menu 2 भर में गिरावट, Menu 1 सबमेनू गायब हो जाते हैं इससे पहले कि मैं यह करने के लिए मिला है।

क्या किसी के पास इस के आसपास होने के लिए कोई सुझाव या सुझाव हैं? मेरा विचार कस्टम मेनूयूआई को परिभाषित करना था जिसने अपने माउस हैंडलर को टाइमर जोड़ा था। अपने menu चर, जहां delay पैरामीटर मिलीसेकेंड की राशि को दिखाने के लिए मेनू के लिए इंतजार करना है पर

public class Thing extends JFrame { 
    public Thing() 
    { 
     super(); 
     this.setSize(new Dimension(500, 500)); 
     final JPopupMenu pMenu = new JPopupMenu(); 
     for (int i = 0; i < 5; i++) 
     { 
      JMenu menu = new JMenu("Menu " + i); 
      pMenu.add(menu); 
      for (int j = 0; j < 10; j++) 
      { 
       menu.add(new JMenuItem("Item " + j)); 
      } 
     } 

     this.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       pMenu.show(Thing.this, e.getX(), e.getY()); 
      } 
     }); 
    } 

    public static void main(String[] args) 
    { 
     Thing t = new Thing(); 
     t.setVisible(true); 
    } 
} 
+0

[इस पोस्ट] (http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown) एक एल्गोरिथम कि परीक्षण करके इस समस्या का हल करने के लिए संबंधित है उपयोगकर्ता के माउस को पथ के रूप में ले जाता है क्योंकि यह किसी त्रिकोण के विरुद्ध आइटम से दूर चला जाता है, लेकिन मुझे इस बारे में निश्चित नहीं है कि उस पोस्ट के नीचे लिंक की गई jQuery स्क्रिप्ट पोर्टेबल स्विंग फ्रेमवर्क के लिए होगी। – akbiggs

उत्तर

0

मैं एक बहुत ही हैकी समाधान के साथ आया था।

मैंने एक UI कक्षा बनाई जो BasicMenuUI को बढ़ाती है। BasicMenuUI के अंदर निजी handler ऑब्जेक्ट के बजाय कस्टम MouseInputListener वापस करने के लिए createMouseInputListener विधि को ओवरराइड करें।

मैं तो MouseInputListener कार्यान्वयन के लिए कोड handler में GrepCode से [1], और यह अपने कस्टम श्रोता में नकल मिला है। मैंने एक बदलाव किया, mouseEntered में एक टाइमर डाला। mouseEntered के लिए मेरा अंतिम कोड इस तरह दिखता है:

public void mouseEntered(MouseEvent e) { 
     timer.schedule(new TimerTask() { 

      @Override 
      public void run() { 
       if (menuItem.isShowing()) 
       { 
        Point mouseLoc = MouseInfo.getPointerInfo().getLocation(); 
        Point menuLoc = menuItem.getLocationOnScreen(); 
        if (mouseLoc.x >= menuLoc.x && mouseLoc.x <= menuLoc.x + menuItem.getWidth() && 
          mouseLoc.y >= menuLoc.y && mouseLoc.y <= menuLoc.y + menuItem.getHeight()) 
        { 
         originalMouseEnteredStuff(); 
        } 
       } 
      } 
     }, 100); 
    } 

मूल कोड है कि mouseEntered में था कॉल करने से पहले, मुझे यकीन है कि माउस इस मेनू के क्षेत्र के भीतर अब भी है बनाने के लिए जाँच करें। मैं नहीं चाहता कि मेरे माउस ब्रश 100 एमएस के बाद पॉप अप हो जाएं।

कृपया मुझे बताएं अगर किसी ने इसके लिए बेहतर समाधान खोजा है।

[1] http://www.grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/javax/swing/plaf/basic/BasicMenuUI.java/?v=source

2

कॉल setDelay(delay):

a screen

यहाँ कुछ सरल उदाहरण कोड है कि मेरी समस्या को दिखाता है एक int के रूप में।

कोड देरी है, तो उपयोगकर्ता मेनू आइटम "मेनू n" 1 सेकंड अपना माउस ले जाना है, 1 सेकंड के लिए सेट हो जाएगा का यह निम्न पंक्ति से पहले सबमेनू प्रदर्शित होता है: menu.setDelay(1000);

यहाँ संपादित का एक टुकड़ा है कोड:

for (int i = 0; i < 5; i++) 
{ 
    JMenu menu = new JMenu("Menu " + i); 
    pMenu.add(menu); 
    for (int j = 0; j < 10; j++) 
    { 
     menu.add(new JMenuItem("Item " + j)); 
    } 
    menu.setDelay(1000); 
} 
+0

यह काम नहीं करेगा क्योंकि यद्यपि उपमेनू के लिए देरी 1 सेकंड होगी, गलती से मेन्यू आइटम पर आने के लिए, वांछित सबमेनू तुरंत तब भी गायब हो जाएगा जब आपका माउस किसी अन्य मेनू पर हो जाता है। – flutillie

+0

सेटडेले (1000) के साथ ऊपर वर्णित वर्णन का एक स्क्रीनकास्ट यहां है: http://tinypic.com/r/2wel1dy/5 – flutillie

संबंधित मुद्दे