2014-06-23 24 views
8

मैं एक अवांछित हमेशाऑनटॉप फ्रेम में एक प्रकार का टूलबार बनाने की कोशिश कर रहा हूं। इस प्रकार, मैं चाहता हूं कि मेरा फ्रेम मेरे मुख्य फ्रेम के शीर्ष पर हो, लेकिन अन्य प्रोग्राम्स से फ्रेम के शीर्ष पर नहीं। मैं इस कोड की कोशिश की:मेरे प्रोग्राम के शीर्ष पर हमेशा फ्रेम

public class Test { 
    private static JFrame mainFrame; 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       mainFrame = new JFrame("test"); 
       mainFrame.setSize(800,600); 
       mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       mainFrame.setVisible(true); 

       A a = new A(); 
      } 
     }); 
    } 

    public static class A extends JDialog { 

     public A() { 
      super(mainFrame); 
      setAlwaysOnTop(true); 
      setFocusable(false); 
      setSize(80,60); 
      setVisible(true); 
     } 
    } 
} 

लेकिन JDialog के उपयोग और मालिक, अन्य अनुप्रयोगों के शीर्ष पर फ्रेम ठहरने precising के बावजूद (कम से कम उबंटू के साथ हो सकता है कि परिणाम अन्य ओएस के साथ अलग है।?)

संपादित: ठीक है, मैं अपने संवाद के लिए इस कोड की कोशिश की:

public static class A extends JDialog { 

    public A(String name) { 
     super(mainFrame, name); 
     setAlwaysOnTop(true); 
     setFocusable(false); 
     setSize(80, 60); 
     setVisible(true); 

     mainFrame.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowActivated(WindowEvent e) { 
       A.this.setAlwaysOnTop(true); 
      } 

      @Override 
      public void windowDeactivated(WindowEvent e) { 
       // A.this.setAlwaysOnTop(false); 
       A.this.toBack(); 
      } 
     }); 
    } 
} 

मुद्दा अब है कि जब मुख्य विंडो ढीला ध्यान, संवाद वापस फोकस चुरा और मैं क्यों समझ में नहीं आता है। उदाहरण के लिए, मैं अपना ऐप चलाता हूं, मैं फ़ायरफ़ॉक्स पर स्विच करने का प्रयास करता हूं, फ़ायरफ़ॉक्स प्रकट होता है और मुख्य फ्रेम को कवर करता है, लेकिन एक संवाद स्क्रीन पर फोकस करता है और रहता है। अब, अगर मैं फिर से फ़ायरफ़ॉक्स का चयन करता हूं, तो संवाद आखिरी बार गायब हो जाएगा। क्या आप मुझे समझा सकते हैं कि संवाद क्यों फोकस करता है?

धन्यवाद

+0

मुझे लगता है कि आप JNI के माध्यम से देशी हैक किसी तरह का उपयोग करने के लिए उपाय करने की आवश्यकता होगी/जेएनए – MadProgrammer

+0

'कक्षा ए जेएफआरएएम' बढ़ाता है? –

+0

यदि आप 'setAlwaysOnTop() 'को हटाते हैं तो क्या होता है? आम तौर पर आप फ्रेम को अन्य फ्रेम के शीर्ष पर रहना चाहिए। 'SetAlwaysOnTop()' ओएस – GameDroids

उत्तर

4

ठीक है, मैं एक समाधान नहीं मिला (अगर यह समाधान है पता नहीं है, लेकिन यह काम कर रहा है, तो ...)

मैं setFocusableWindowState (पता चला), कि एकदम सही है टूलबार के लिए। वैसे, मुझे नहीं पता कि मेरे पिछले सेट फोकसबल (झूठे) का कोई असर पड़ा है या नहीं। , अगर मैं Firefox के MyApp से स्विच यहाँ क्या होता है:

अगले अंक फोकस इस कोड के साथ बहुत अजीब व्यवहार हो जाता है कि था

focus : MyApp -> Firefox 
execution of MyDialog.toFront() 
focus : Firefox -> MyDialog 
MyDialog not focusable ! 
focus : MyDialog -> MyApp !!! 

परिणाम: कुछ भी नहीं बदला!

तो मुझे अंततः चाल मिल गई: MyDialog.toFront() के बाद, आप पिछले मालिक को ध्यान देते हैं। और एक ही रास्ता मैं कोई त्रुटि के साथ ऐसा करने के लिए मिला था: mainFrame.toBack()

अंतिम कोड:

public class Test { 
    private static JFrame mainFrame; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       mainFrame = new JFrame("test"); 
       mainFrame.setSize(800,600); 
       mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       mainFrame.setVisible(true); 

       A a = new A(); 
      } 
     }); 
    } 

    public static class A extends JDialog { 

     public A() { 
      super(mainFrame); 
      setAlwaysOnTop(true); 
      setFocusableWindowState(false); 
      setSize(80,60); 
      setVisible(true); 

      mainFrame.addWindowListener(new WindowAdapter() { 
       @Override 
       public void windowActivated(WindowEvent e) {A.this.setAlwaysOnTop(true);} 
       @Override 
       public void windowDeactivated(WindowEvent e) { 
        A.this.toBack(); 
        mainFrame.toBack(); 
       } 
      }); 
     } 
    } 
} 
+0

मैंने विंडोज 10 में इस समाधान की पुष्टि की। धन्यवाद –

4

आप शीर्ष केवल जब माता-पिता खिड़की सक्रिय हो जाता है पर हमेशा के लिए अपने खिड़की बनाना चाहिए। कुछ इस तरह:

public class Test { 
    private static JFrame mainFrame; 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       mainFrame = new JFrame("test"); 
       mainFrame.setSize(800,600); 
       mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       mainFrame.setVisible(true); 

       final A a = new A(); 
       mainFrame.addWindowListener(new WindowAdapter() { 
        /** 
        * {@inheritDoc} 
        */ 
        @Override 
        public void windowDeactivated(WindowEvent e) { 
         a.setAlwaysOnTop(false); 
        } 

        /** 
        * {@inheritDoc} 
        */ 
        @Override 
        public void windowActivated(WindowEvent e) { 
         a.setAlwaysOnTop(true); 
        } 
       }); 
      } 
     }); 
    } 

    public static class A extends JDialog { 

     public A() { 
      super(mainFrame); 
      setAlwaysOnTop(true); 
      setFocusable(false); 
      setSize(80,60); 
      setVisible(true); 
     } 
    } 
} 
+0

के पीछे चला जाता है अच्छा लगता है। चलिए अपने असली कार्यक्रम में कोशिश करते हैं। मैं आपको बता दूँगा। – Sharcoux

+0

ठीक है। मैंने आपके दृष्टिकोण की कोशिश की। यह setAlwaysOnTop (झूठी) के साथ काम नहीं करता है, लेकिन यह बैक() के साथ करता है। फिर भी, मुझे अभी भी एक छोटी सी समस्या है। कृपया, मेरा संपादन देखें। और आपकी मदद के लिए धन्यवाद! – Sharcoux

+0

@ user1967800 जब फ्रेम शीर्ष पर है तो यह फोकस चुरा लेता है। तो आपको हमेशा ओनटॉप को गलत पर सेट करना होगा। –

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