2009-07-27 69 views

回答

5

我相信這會回答你的問題。要運行它,您需要Java 6 update 10及更高版本。 我測試了它在Windows Vista上

import java.awt.AlphaComposite; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class ClickThrough { 

    public static void main(String[] args) { 
     JFrame.setDefaultLookAndFeelDecorated(true); 
     JFrame f = new JFrame("Test"); 
     f.setAlwaysOnTop(true); 
     Component c = new JPanel() { 
      @Override 
      public void paintComponent(Graphics g) { 
       Graphics2D g2 = (Graphics2D)g.create(); 
       g2.setColor(Color.gray); 
       int w = getWidth(); 
       int h = getHeight(); 
       g2.fillRect(0, 0, w,h); 
       g2.setComposite(AlphaComposite.Clear); 
       g2.fillRect(w/4, h/4, w-2*(w/4), h-2*(h/4)); 
      } 
     }; 
     c.setPreferredSize(new Dimension(300, 300)); 
     f.getContentPane().add(c); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
     com.sun.awt.AWTUtilities.setWindowOpaque(f,false); 
    } 

} 

請注意,您必須要麼有一個未加裝飾的窗口或一個由單獨的Java裝飾(不是默認的操作系統飾),否則該代碼將無法正常工作。

0

您可以嘗試使用機器人類http://java.sun.com/javase/6/docs/api/java/awt/Robot.html,它允許您指定系統事件到低級操作系統,特別是鼠標事件。

+1

機器人使部件透明,可用於生成系統事件,但如果我的透明框架已經在那裏我需要點擊的位置,不會java框架再次收到事件? – Varun 2009-07-28 06:32:40

+0

你甚至可以在玻璃板上看到(閱讀java教程),然後簡單地使用事件。 – 2009-07-28 10:10:24

+1

你可以暫時隱藏窗口。它會引入一些閃爍我知道,但我不能想到別的東西.... – 2009-07-28 10:11:00

2

即使在使用Java 1.6.0_31的MacOS X 10.7.3上,Savvas的答案也幫助完美。謝謝! 的唯一的事情:我還必須設置

f.setUndecorated(true); 
1

這不回答,但糾正危險的問題,接受的答案,以及提供一個實例與Java 7+

兼容的更新每像素alphering檢查窗口中的每個像素以確定它是否透明。如果它是透明的,則允許鼠標事件通過它,如果它不透明,鼠標事件將被窗口捕獲。這通常是操作系統級別的問題。

您提供的示例實際上是在做一些非常危險的事情,首先它將半透明顏色繪製到不透明的組件上,這意味着Swing不知道它實際上應該在組件下面繪製任何東西,在許多非常令人討厭的油漆工件中,因爲Swing只知道不透明和透明的組件,所以它不知道半透明組件,所以您需要欺騙API。

執行自定義繪畫時,應始終呼叫super.paintComponent以確保在繪畫前正確設置Graphics上下文。在你的情況,你也應該使用setOpaque並將其傳遞false

import java.awt.AlphaComposite; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestFrame { 

    public static void main(String[] args) { 
     new TestFrame(); 
    } 

    public TestFrame() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setUndecorated(true); 
       frame.setAlwaysOnTop(true); 
       frame.setBackground(new Color(0, 0, 0, 0)); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setOpaque(false); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(Color.BLUE); 
      g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f)); 
      g2d.fill(new Rectangle(0, 0, getWidth(), getHeight())); 
      g2d.dispose(); 
     } 

    } 

} 
相關問題