2014-06-23 24 views
8

Renklendirilmemiş alwaysOnTop çerçevesinde bir araç çubuğu oluşturmaya çalışıyorum. Bu yüzden, çerçevemin ana çerçevemin üstünde olmasını, ancak diğer programların kareleri üzerinde olmamasını istiyorum. Bu kodu çalıştı:Çerçeve her zaman programımın en üstündedir

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); 
     } 
    } 
} 

Ama JDialog kullanımı ve sahibi, diğer uygulamaların üstünde çerçeve kalmak precising rağmen (en azından Ubuntu ile Belki sonucun diğer OS ile farklıdır.?)

DÜZENLEME: Tamam, benim iletişim için bu kodu çalıştı :

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(); 
      } 
     }); 
    } 
} 

sorun şimdi ana pencere gevşek odak, iletişim geri odağı çalıyor ve ne zaman anlamak kalmamasıdır. Örneğin, uygulamamı çalıştırıyorum, Firefox'a geçmeye çalışıyorum, Firefox görünür ve mainFrame'i kapatır, ancak A iletişim kutusu odağı alır ve ekranda kalır. Şimdi, Firefox'u tekrar seçersem, iletişim kutusu en sonunda düzgün bir şekilde ortadan kalkar. Diyaloğun odağı neden aldığını açıklayabilir misin?

Teşekkür

+0

/JNA – MadProgrammer

+0

A sınıfı JFrame'i uzatıyor mu? –

+0

'setAlwaysOnTop()' öğesini kaldırırsanız ne olur? Normalde Frame, diğer karelerin üstünde kalmalıdır. SetAlwaysOnTop() 'OS – GameDroids

cevap

4

Tamam, o mükemmel)

Ben setFocusableWindowState (keşfetti (o ... çalışma, bu yüzden oluyor o çözüm olup olmadığını bilmiyorum, ama) bir çözüm buldu araç çubukları için. Bu arada, önceki setFocusable (false) herhangi bir etkisi olup olmadığını bilmiyorum. burada, ben Firefox'a Uygulamam geçerseniz olur::

sonraki konu odak bu kodla çok garip davranış olur olmasıydı

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

sonucu: hiçbir şey değişmedi!

Sonunda hileleri aldım: Sadece MyDialog.toFront() 'dan sonra, odağı önceki sahibine geri verirsin. Ve ben hiçbir hata ile bu konuda bulduğum tek yolu vardı: mainFrame.toBack()

Final kodu: Sana JNI aracılığıyla yerli hack çeşit kullanarak başvurmak gerekir düşünüyorum

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

Bu çözümü Windows 10'da doğruladım. Teşekkürler –

4

Sen ana penceresi aktif gider sadece üstünde her zaman için pencereyi yapmalıdır. Böyle bir şey:

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

Sesler'in ardında iyi gider. Bunu gerçek programımda deneyelim. Seni bilgilendirecegim. – Sharcoux

+0

Tamam. Yaklaşımını denedim. setAlwaysOnTop (false) ile çalışmaz, ancak toBack() ile çalışır. Yine de, hala küçük bir sorunum var. Lütfen benim düzenime bakın. Ve yardımın için teşekkürler! – Sharcoux

+0

@ user1967800 çerçeve üstündeyken odağı çalar. Yani alwaysOnTop'u false olarak ayarlamanız gerekir. –

İlgili konular