2012-08-07 14 views
8

Próbuję utworzyć okna w kształcie koła, który następuje myszą i kliknięcia przejść do okna bazowych.Java przezroczyste okno

Robiłem to z Pythonem i Qt (patrz Python overlay window), ale potem przełączyłem się na Java i Swing. Jednak nie jestem w stanie uczynić okna przezroczystym. Próbowałem this method ale to nie działa, jednak myślę, że mój system obsługuje przezroczystość bo jeśli zacznę Screencast-O-Matic (który jest w Javie), prostokąt jest faktycznie przejrzyste.

Jak mogę osiągnąć coś takiego? (Jestem na Linux KDE4)

+0

Masz jakieś rozwiązanie tego problemu? Mam do czynienia z tym samym problemem. Zrobiłem aplikację podobną do Screencast-O-Matic, która działa na system operacyjny Windows ładnie, ale nie działa na Linuksie. Proszę sugerować tutaj, jeśli coś znalazłeś, http://stackoverflow.com/questions/25009276/swing-works-different-on-different-platform – tarkikshah

+0

Nie, przełączyłem się z powrotem do PyQt dla mojej aplikacji do screencastu, ponieważ miałem inne problemy z Javą. –

+0

ok ... Dzięki .. – tarkikshah

Odpowiedz

2

Jeśli chcesz to zrobić na własną rękę, bez użycia zewnętrznego lib, można uruchomić wątku, który wykonuje:

  • ustawić przezroczyste okienko niewidzialną
  • zrobić zrzut ekranu z pulpitu
  • umieścić ten zrzut ekranu jako obraz tła okna

Albo można użyć JavaFX

+0

Nie mogę tego zrobić, ponieważ okno będzie podążać za myszą, więc będę musiał robić zrzuty ekranu co jakiś czas i myślę, że to nieskuteczna metoda. –

+0

i co z wykorzystaniem drugiej opcji? –

+0

Przepraszamy, ale nie mogę znaleźć JavaFX dla systemu Linux i JDK 6 –

9

Dlaczego samouczek Java How to Create Translucent and Shaped Windows nie działa? Czy korzystasz z najnowszej wersji Java 6 lub Java 7? W May/June issue of Java Magazine powstał samouczek dotyczący ukształtowanych i przezroczystych okien wymagających Java 7. Prawdopodobnie będziesz musiał zapisać się do magazynu Java, aby go przeczytać. Sprawdź, czy możesz dostać to, aby uruchomić w systemie:

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

Jestem na Java 6, dlatego właśnie używał metod kompatybilności na dole strony ... Z twoim przykładem otrzymuję [to] (https://dl.dropbox.com/u/9287758/Immagini/JavaNoTransparency.png) –

+0

OK. Strona z tutorialem w Javie wymaga aktualizacji 6 Java w wersji 6, więc tak długo, jak ją masz, powinna działać. Jeśli nie, to musisz mieć problem ze zgodnością linuksa. W takim przypadku zalecam uaktualnienie do JDK 7 i zobaczenie, czy to naprawi. – Thorn

3

Jeśli używasz Java 6, trzeba skorzystać z prywatnych AWTUtilities API. Sprawdź Java SE 6 Update 10 API więcej szczegółów

Przykład

To jest trochę Szybki sposób, ale robi ideę całej

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; 

    } 
} 

W Windows 7 produkuje

Pod Java 6 Java6

Unde r Java 7 Java7

+0

Zrobiłem, z drugim nie skompilowałem nawet –

+0

Nie jestem pewien, co masz na myśli, sprawdź moje przykłady – MadProgrammer

+0

Jestem na Java 6, kompiluje się tylko z AWTUtilities, ale nie ma przezroczystości kiedy go uruchomię . –

3

myślę, że to będzie działać, ja już próbowałem it..to dokonać JFrame lub okienko przezroczyste trzeba undecorate Undecorated(true) ramkę pierwszy. Oto przykładowy kod:

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

    } 

Jedynym problemem jest to, czego potrzebujesz, aby dodać swój własny kod za blisko i zminimalizować za pomocą przycisków.