2012-08-07 26 views
8

fareyi izler daire şeklinde pencere oluşturmak ve alttaki pencereler tıklama geçmesine çalışıyorum.Java şeffaf pencere

Python ve Qt (Python overlay window bakınız) fakat bu yaptığını o zaman Java ve vuruşların geçti. Ancak pencereyi şeffaf yapamıyorum. Ancak ben (Java olduğu) Screencast-O-Matic başlarsanız, dikdörtgen aslında şeffaftır çünkü benim sistem şeffaflığı desteklediğini düşünüyorum, ben this method çalıştım ama çalışmıyor.

Nasıl böyle bir şey elde edebilir?

+0

Bu sorun için çözümünüz var mı? Ben aynı sorunla karşılaşıyorum .. Windows işletim sistemi için güzel çalışan ama Linux için çalışmayan Screencast-O-Matic gibi bir uygulama yaptım .. Eğer bir şey bulursanız, lütfen buraya bir göz atın, http://stackoverflow.com/questions/25009276/swing-works-different-on-different-platform – tarkikshah

+0

Hayır, screencast uygulamam için PyQt'ye geri döndüm, çünkü Java ile ilgili başka sorunlar da vardı. –

+0

tamam ... Teşekkürler .. – tarkikshah

cevap

2

bir harici lib kullanmadan, kendi başınıza yapmak isterseniz, gerçekleştiren bir iş parçacığı başlayabileceğini (Linux KDE4 çıkıyorum):

  • görünmez şeffaf pencere ayarlamak

Yoksa kullanabilirsiniz pencerenizin arka plan görüntüsü olarak bu ekran görüntüsünü koymak masaüstüne

  • bir ekran görüntüsü yapmak JavaFX

  • +0

    Bunu yapamıyorum çünkü pencere fareyi takip edecek, bu yüzden her seferinde ekran görüntüsü almak zorunda kalacağım ve bunun verimsiz bir yöntem olduğunu düşünüyorum. –

    +0

    ve diğer seçeneği kullanma hakkında ne düşünüyorsunuz? –

    +0

    Üzgünüz ama Linux için JavaFX ve JDK bulunamıyor 6 –

    9

    Java öğreticisi How to Create Translucent and Shaped Windows neden çalışmadı? Java 6 veya Java 7'nin en yeni sürümünü mi kullanıyorsunuz? May/June issue of Java Magazine yılında , Muhtemelen okumak için Java dergisi için kayıt gerekecektir java 7. gerektiren şekilli ve şeffaf pencereler bir öğretici oldu. Bu sisteminizde çalıştırmak için alabilirsiniz eğer bakınız:

    import java.awt.*; //Graphics2D, LinearGradientPaint, Point, Window, Window.Type; 
    import javax.swing.JComponent; 
    import javax.swing.JFrame; 
    import javax.swing.SwingUtilities; 
    
    /** 
    * From JavaMagazine May/June 2012 
    * @author josh 
    */ 
    public class ShapedAboutWindowDemo { 
    
        /** 
        * @param args the command line arguments 
        */ 
        public static void main(String[] args) { 
         //switch to the right thread 
         SwingUtilities.invokeLater(new Runnable() { 
          @Override 
          public void run() { 
           JFrame frame = new JFrame("About box"); 
           //turn of window decorations 
           frame.setUndecorated(true); 
           //turn off the background 
           frame.setBackground(new Color(0,0,0,0)); 
           frame.setContentPane(new AboutComponent()); 
           frame.pack(); 
           //size the window 
           frame.setSize(500, 200); 
           frame.setVisible(true); 
           //center on screen 
           frame.setLocationRelativeTo(null); 
          } 
         } 
         ); 
        } 
    
        private static class AboutComponent extends JComponent { 
         public void paintComponent(Graphics graphics) { 
          Graphics2D g = (Graphics2D) graphics; 
    
          //create a translucent gradient 
          Color[] colors = new Color[]{ 
              new Color(0,0,0,0) 
              ,new Color(0.3f,0.3f,0.3f,1f) 
              ,new Color(0.3f,0.3f,0.3f,1f) 
              ,new Color(0,0,0,0)}; 
          float[] stops = new float[]{0,0.2f,0.8f,1f}; 
          LinearGradientPaint paint = new LinearGradientPaint(
                 new Point(0,0), new Point(500,0), 
                 stops,colors); 
          //fill a rect then paint with text 
          g.setPaint(paint); 
          g.fillRect(0, 0, 500, 200); 
          g.setPaint(Color.WHITE); 
          g.drawString("My Killer App", 200, 100); 
         } 
        } 
    } 
    
    +0

    Java 6'dayım, işte bu yüzden sayfanın altındaki uyumluluk yöntemlerini kullandı ... Örneğinizle [aldık] (https://dl.dropbox.com/u/9287758/Immagini/JavaNoTransparency.png) –

    +0

    Tamam. Sitenizde bulunan Java öğreticisi Java 6 10 güncellemesini gerektirmektedir, bu nedenle elinizde olması gerektiği gibi çalışmalıdır. Değilse, o zaman bir linux uyumluluk sorunu olmalı ve bu durumda JDK 7'ye yükseltmenizi ve bunu düzeltip düzeltmediğinizi görmenizi tavsiye ederim. – Thorn

    3

    Java 6 kullanıyorsanız, size özel API AWTUtilities faydalanmak gerekir. Daha fazla ayrıntı

    ÖRNEK için Java SE 6 Update 10 API göz atın

    Bu hızlı kesmek biraz, ama buna Java Altında

    üreten Windows 7'de

    public class TransparentWindow { 
    
        /** 
        * @param args the command line arguments 
        */ 
        public static void main(String[] args) { 
    
         EventQueue.invokeLater(new Runnable() { 
          @Override 
          public void run() { 
    
           MyFrame frame = new MyFrame(); 
           frame.setUndecorated(true); 
    
           String version = System.getProperty("java.version"); 
           if (version.startsWith("1.7")) { 
    
    
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
            GraphicsDevice graphicsDevice = ge.getDefaultScreenDevice(); 
    
            System.out.println("Transparent from under Java 7"); 
            /* This won't run under Java 6, uncomment if you are using Java 7 
            System.out.println("isPerPixelAlphaTranslucent = " + graphicsDevice.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT)); 
            System.out.println("isPerPixelAlphaTransparent = " + graphicsDevice.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT)); 
            System.out.println("isPerPixelAlphaTranslucent = " + graphicsDevice.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT)); 
            */ 
            frame.setBackground(new Color(0, 0, 0, 0)); 
    
           } else if (version.startsWith("1.6")) { 
    
            System.out.println("Transparent from under Java 6"); 
            System.out.println("isPerPixelAlphaSupported = " + supportsPerAlphaPixel()); 
            setOpaque(frame, false); 
    
           } 
    
           frame.setSize(400, 400); 
           frame.setLocationRelativeTo(null); 
           frame.setVisible(true); 
    
          } 
         }); 
    
        } 
    
        public static class MyFrame extends JFrame { 
    
         public MyFrame() throws HeadlessException { 
    
          setContentPane(new MyContentPane()); 
          setDefaultCloseOperation(EXIT_ON_CLOSE); 
    
          addMouseListener(new MouseAdapter() { 
           @Override 
           public void mouseClicked(MouseEvent e) { 
    
            if (e.getClickCount() == 2) { 
    
             dispose(); 
    
            } 
    
           } 
          }); 
    
         } 
        } 
    
        public static class MyContentPane extends JPanel { 
    
         public MyContentPane() { 
    
          setLayout(new GridBagLayout()); 
          add(new JLabel("Hello, I'm a transparent frame under Java " + System.getProperty("java.version"))); 
    
          setOpaque(false); 
    
         } 
    
         @Override 
         protected void paintComponent(Graphics g) { 
    
          super.paintComponent(g); 
    
          Graphics2D g2d = (Graphics2D) g.create(); 
          g2d.setColor(Color.BLUE); 
    
          g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); 
          g2d.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 20, 20); 
    
         } 
        } 
    
        public static boolean supportsPerAlphaPixel() { 
    
         boolean support = false; 
    
         try { 
    
          Class<?> awtUtilsClass = Class.forName("com.sun.awt.AWTUtilities"); 
          support = true; 
    
         } catch (Exception exp) { 
         } 
    
         return support; 
    
        } 
    
        public static void setOpaque(Window window, boolean opaque) { 
    
         try { 
    
          Class<?> awtUtilsClass = Class.forName("com.sun.awt.AWTUtilities"); 
          if (awtUtilsClass != null) { 
    
           Method method = awtUtilsClass.getMethod("setWindowOpaque", Window.class, boolean.class); 
           method.invoke(null, window, opaque); 
    //    com.sun.awt.AWTUtilities.setWindowOpaque(this, opaque); 
    //    ((JComponent) window.getContentPane()).setOpaque(opaque); 
    
          } 
    
         } catch (Exception exp) { 
         } 
    
        } 
    
        public static void setOpacity(Window window, float opacity) { 
    
         try { 
    
          Class<?> awtUtilsClass = Class.forName("com.sun.awt.AWTUtilities"); 
          if (awtUtilsClass != null) { 
    
           Method method = awtUtilsClass.getMethod("setWindowOpacity", Window.class, float.class); 
           method.invoke(null, window, opacity); 
    
          } 
    
         } catch (Exception exp) { 
    
          exp.printStackTrace(); 
    
         } 
    
        } 
    
        public static float getOpacity(Window window) { 
    
         float opacity = 1f; 
         try { 
    
          Class<?> awtUtilsClass = Class.forName("com.sun.awt.AWTUtilities"); 
          if (awtUtilsClass != null) { 
    
           Method method = awtUtilsClass.getMethod("getWindowOpacity", Window.class); 
           Object value = method.invoke(null, window); 
           if (value != null && value instanceof Float) { 
    
            opacity = ((Float) value).floatValue(); 
    
           } 
    
          } 
    
         } catch (Exception exp) { 
    
          exp.printStackTrace(); 
    
         } 
    
    
         return opacity; 
    
        } 
    } 
    

    karşısında fikrini alır 6 Java6

    unde r Java ben bu çalışacaktır tahmin 7 Java7

    +0

    Yaptım, diğeriyle bile –

    +0

    derlemedim Ne demek istediğimi bilmiyorum, örneklerimi kontrol et – MadProgrammer

    +0

    Java 6'deyim, sadece AWTUtilities ile derler, ama çalıştırdığımda şeffaflığı yok . –

    3

    , ben zaten bir JFrame veya ilk Undecorated(true) çerçeveyi undecorate gereken şeffaf bir pencere yapmak it..to çalıştı.

    import javax.swing.*; 
    import com.sun.awt.AWTUtilities; 
    import java.awt.Color; 
    
        class transFrame { 
         private JFrame f=new JFrame(); 
         private JLabel msg=new JLabel("Hello I'm a Transparent Window"); 
    
        transFrame() { 
         f.setBounds(400,150,500,500); 
         f.setLayout(null); 
         f.setUndecorated(true);  // Undecorates the Window 
         f.setBackground(new Color(0,0,0,25)); // fourth index decides the opacity 
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
         msg.setBounds(150,250,300,25); 
         f.add(msg); 
         f.setVisible(true); 
         } 
    
         public static void main(String[] args) { 
         new transFrame(); 
         } 
    
        } 
    

    Tek sorun yakın için kendi kod eklemek ve düğmelerini kullanarak en aza indirilmesi gerektiğidir: İşte örnek kod verilmiştir.