2012-07-06 56 views
8

Tôi đang cố gắng tạo một cửa sổ toàn màn hình bao phủ toàn bộ màn hình bằng cách sử dụng Java. Cửa sổ này cũng phải có độ trong suốt (khoảng 30% -50% trong suốt). Khi nói toàn bộ màn hình, tôi có nghĩa là nó bao gồm mọi thứ (bao gồm dock/taskbar/menubar trong OSX/Linux/Windows), và khi tôi nói với transparancy, tôi có nghĩa là một thời gian thực trong suốt và không chỉ là một ảnh chụp màn hình bị tấn công. Dưới đây là những gì tôi biết/đã thử:cửa sổ toàn màn hình java với độ trong suốt

  • Sử dụng Java toàn màn hình API: trong khi nó tạo ra một chế độ toàn màn hình thực sự, bạn không thể minh bạch với nó (chỉ màu đục). Một hack là chụp ảnh màn hình của toàn bộ màn hình nền và đặt nó làm nền cho cửa sổ, nhưng điều này có nghĩa là nó không phải là thời gian thực trong suốt.
  • Đặt kích thước cửa sổ để phù hợp với kích thước màn hình: trong khi nó lấp đầy toàn màn hình, trong một số hệ điều hành nhất định (ví dụ: Mac OS X), cửa sổ sẽ được hiển thị phía sau thanh dock/menubar chứ không phải phía trên nó. Tuy nhiên, tính minh bạch làm việc ở đây.
  • Sử dụng API setWindowOpacity: nó hoạt động trong trường hợp thứ hai, nhưng không phải trong API đầu tiên (Fullscreen API)
  • Sử dụng setBackground with alpha: hoạt động như setWindowOpacity, nhưng chỉ trong một số hệ điều hành nhất định. Nhưng cũng không hoạt động với API toàn màn hình.
  • Sử dụng JFrame/JWindow/JDialog/Khung/Window: cố gắng mỗi mô hình cửa sổ tôi có thể, mà không cần bất kỳ may mắn

Vì vậy, tôi hỏi nếu điều này có thể thông qua một hack khác mà tôi không biết, sau đó Tôi rất vui khi được nghe về.

Mục tiêu là phủ lớp toàn màn hình nửa suốt trên màn hình.

+0

tôi một thời gian ngắn đang theo đuổi một cái gì đó tương tự như trong tuần này. Tôi đã hy vọng tạo ra một bộ lọc màu. Nhấp chuột sẽ cần phải nhấn các mục phía sau bộ lọc chứ không phải bộ lọc. Tôi đã không nghiên cứu quá chăm chỉ, vì vậy nếu có ai đó ở đó biết thì tuyệt vời! – mrswadge

+1

@mrswadge: bạn có thể thêm người nghe chuột vào cửa sổ của mình và sau đó khi sự kiện chuột được kích hoạt (ví dụ: nhấp), chuyển cửa sổ và sử dụng java.awt.Robot để mô phỏng sự kiện (mousePress). Điều này giải quyết một phần vấn đề của bạn. Cho phép hy vọng họ giải quyết một phần về sự thật toàn màn hình/minh bạch. – ccit

Trả lời

6
  • chỉ có thể thực hiện với TaskBar e.i.

.

GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); 
  • nếu không bạn có và ngoại lệ

.

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

hoặc bằng cách sử dụng brutte_force-DirectX freezed twicw máy tính của tôi, chỉ power_off để lưu GPU PC của

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' Ví dụ đó là một trong số ít lý do tốt nhất mà tôi đã thấy khi delving vào các lớp' com.sun'. Cám ơn vì đã chia sẻ! :) –

+0

Tôi đã làm một cái gì đó tương tự như những gì bạn đặt lại với nhau. Bạn đã sử dụng API setWindowOpacity' (điểm 3) cùng với việc chỉ định kích thước màn hình để phù hợp với độ phân giải màn hình (điểm 2). Bạn có thể làm cho nó phù hợp với toàn bộ màn hình bằng cách sử dụng 'getDefaultToolkit(). GetScreenSize()' và gọi 'setWindowOpacity' động, nhưng nó vẫn sẽ nằm sau dock/menubar/... etc. Ngoài ra 'DirectX' không phải là nền tảng chéo. Bạn có được minh bạch hoặc toàn màn hình nhưng không phải cả hai.Tôi đang tìm cách để đạt được cả hai như được giải thích trong câu hỏi. Nếu java có thể làm cả hai, thì tại sao chúng không triển khai/cho phép chúng cùng nhau. Cảm ơn. – ccit

+0

không chắc chắn với OpenGL, ở đó tôi không thể tìm thấy cách rõ ràng (không giết máy tính của tôi), chắc chắn ai đó có thể làm điều đó, nhưng tôi nghĩ rằng không có sẵn cho nền tảng Windows, tôi hy vọng rằng tôi sai – mKorbel

Các vấn đề liên quan