2012-07-06 12 views
8

Próbuję utworzyć okno pełnoekranowe obejmujące cały ekran przy użyciu języka Java. To okno musi również mieć pewną przezroczystość (około 30% -50% przezroczystości). Mówiąc cały ekran, mam na myśli, że obejmuje on wszystko (w tym dock/pasek zadań/menu w OSX/Linux/Windows), a kiedy mówię z przezroczystością, mam na myśli przezroczystość w czasie rzeczywistym, a nie tylko zhakowany zrzut ekranu. Oto, co znam/wypróbowałem:Okno pełnoekranowe java z przezroczystością

  • Korzystanie z interfejsu Java pełnoekranowego API: podczas gdy tworzy prawdziwy pełny ekran, nie można mieć z nim żadnej przezroczystości (tylko nieprzezroczysty kolor). Jednym z nich jest zrobienie zrzutu ekranu całego pulpitu i ustawienie go jako tła okna, ale oznacza to, że nie jest to przezroczystość w czasie rzeczywistym.
  • Ustawienie rozmiaru okna w celu dopasowania wymiaru ekranu: podczas wypełniania całego ekranu, w niektórych systemach operacyjnych (np. Mac OS X) okno będzie renderowane za dock/menu, a nie nad nim. Jednak przejrzystość działa tutaj.
  • Korzystanie z API setWindowOpacity: działa w drugim przypadku, ale nie w pierwszym (pełnoekranowy interfejs API).
  • Używanie setBackground z alfa: działa jak setWindowOpacity, ale tylko w niektórych systemach operacyjnych. Ale także nie działa z interfejsem API Fullscreen.
  • Zastosowanie JFrame/JWindow/JDialog/Rama/Okno: próbował każdy model okna mogłem, bez powodzenia

Więc pytam, czy jest to możliwe za pośrednictwem innego hack, że nie jestem świadomy, a następnie Byłbym szczęśliwy, słysząc o.

Celem jest nałożenie półprzezroczystego pełnoekranowego na pulpit.

+0

pokrótce ścigał coś podobnego w tym tygodniu. Miałem nadzieję stworzyć kolorowy filtr. Kliknięcia myszą musiałyby trafić elementy za filtrem, a nie filtr. Nie badałem zbyt mocno, więc jeśli ktoś tam wie, to świetnie! – mrswadge

+1

@mrswadge: możesz dodać do okna myszy detektory, a następnie po wywołaniu zdarzenia myszy (np. Kliknięciu), przełącz okno i użyj java.awt.Robot do symulacji zdarzenia (mousePress). To rozwiązuje część twojego problemu. Miejmy nadzieję, że rozwiążą część dotyczącą true-fullscreen/transparency. – ccit

Odpowiedz

6
  • jest możliwe tylko z widocznym paskiem zadań e.i.

.

GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); 
  • inaczej masz i wyjątek

.

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: 
The effects for full-screen windows are not supported. 

lub za pomocą brutte_force do DirectX zamraża moją twicw PC, tylko power_off zapisać GPU PC

import com.sun.awt.AWTUtilities; 
import java.awt.Dimension; 
import java.awt.GraphicsEnvironment; 
import java.awt.Rectangle; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class JFrameOpacityExample { 

    private JFrame myFrame = new JFrame("Test Frame"); 
    private boolean opacity = true; 
    private boolean resize = true; 
    private JButton button = new JButton("Opacity"); 
    private JButton button1 = new JButton("Resize"); 

    public JFrameOpacityExample() { 
     button.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent evt) { 
       Object src = evt.getSource(); 
       if (opacity) { 
        AWTUtilities.setWindowOpacity(myFrame, 0.50f); 
        opacity = false; 
       } else { 
        AWTUtilities.setWindowOpacity(myFrame, 1.0f); 
        opacity = true; 
       } 
      } 
     }); 
     button1.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent evt) { 
       Object src = evt.getSource(); 
       if (resize) { 
        Rectangle dim = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); 
        int h = dim.height; 
        int w = dim.width; 
        myFrame.setBounds(00, 00, w, h); 
        resize = false; 
       } else { 
        myFrame.setBounds(100, 100, 400, 400); 
        resize = true; 
       } 
      } 
     }); 
     JPanel panel = new JPanel(); 
     panel.add(button); 
     panel.add(button1); 
     myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     myFrame.add(panel); 
     myFrame.setSize(400, 400); 
     myFrame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       JFrameOpacityExample jFrameOpacityExample = new JFrameOpacityExample(); 
      } 
     }); 
    } 
} 
+0

'com.sun.awt.AWTUtilities' Ten przykład był jednym z niewielu dobrych powodów, dla których zaglądałem do klasy' com.sun'. Dzięki za udostępnienie! :) –

+0

Zrobiłem już coś podobnego do tego, co złożyliście razem. Użyłeś 'setWindowOpacity' API (punkt 3) wraz z określeniem rozmiaru ekranu, aby dopasować rozdzielczość ekranu (punkt 2). Możesz go dopasować do całego ekranu za pomocą 'getDefaultToolkit(). GetScreenSize()' i dynamicznie wywołując 'setWindowOpacity', ale nadal będzie za dock/menubar/... etc. Również 'DirectX' nie jest wieloplatformowy. Otrzymujesz przezroczystość lub prawdziwy ekran, ale nie oba naraz.Szukam sposobu, aby osiągnąć oba, jak wyjaśniono w pytaniu. Jeśli java może wykonać obie z nich, to dlaczego nie zaimplementują/nie pozwolą na połączenie. Dzięki. – ccit

+0

nie jestem pewien z OpenGL, nie mogę znaleźć jasnego sposobu (bez zabicia mojego komputera), na pewno może ktoś może to zrobić, ale myślę, że nie jest dostępny dla platformy Windows, mam nadzieję, że się mylę – mKorbel

Powiązane problemy