我的問題與How to pass mouse events to applications behind mine in C#/Vista?的需求完全相同,但我需要透明Java UI的相同。我可以使用6.0輕鬆創建透明的Java UI,但無法獲得有關將事件通過應用傳遞給任何應用程序(如瀏覽器)的任何信息。將鼠標事件傳遞給Java UI中的應用程序
3
A
回答
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,它允許您指定系統事件到低級操作系統,特別是鼠標事件。
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();
}
}
}
相關問題
- 1. 如何將鼠標事件傳遞給C#/ Vista中我的應用程序?
- 2. 如何將鼠標事件從父項傳遞給子項iframe
- 3. Java - 將鼠標事件發送給Applet
- 4. 將鼠標事件傳遞給重疊控件
- 5. Javascript,傳遞鼠標事件
- 6. 如何將參數傳遞給Java中的鼠標事件(如果可能)?
- 7. NSView覆蓋將鼠標事件傳遞給基礎子視圖?
- 8. 打開一個新的應用程序,並在MSVC++中傳遞鼠標事件
- 9. 將搖動手勢事件傳遞給應用程序代理
- 10. java - 從獨立Java應用程序捕獲鼠標事件
- 11. 爲什麼Firefox不會將所有鼠標滾輪事件傳遞給我的JavaScript應用程序?
- 12. 將鼠標事件發佈到OSX中的應用程序
- 13. 將事件傳遞給UIScrollView
- 14. 將TreeViewItem標籤傳遞給事件處理程序c#
- 15. 如何將應用程序中的事件傳遞給Android中的活動?
- 16. 將XML傳遞給Flex應用程序
- 17. 將參數傳遞給應用程序
- 18. 將散列傳遞給應用程序
- 19. 將事件傳遞給事件處理程序
- 20. 將.NET應用程序的信號傳遞給Java應用程序
- 21. 如何鼠標事件傳遞給小部件在QT
- 22. 將Capistrano deploy.rb文件中的值傳遞給應用程序
- 23. Tizen鼠標向下鼠標事件(網絡應用程序)
- 24. 將Java活動的參數傳遞給Adobe AIR應用程序
- 25. JAVA鼠標事件
- 26. 將參數傳遞給Vba中的事件處理程序
- 27. 將參數傳遞給jQuery中的事件處理程序
- 28. 傳遞鼠標事件與XSendEvent
- 29. 將應用程序類引用傳遞給構造函數(Java)
- 30. GTK3:小工具鼠標事件傳遞
機器人使部件透明,可用於生成系統事件,但如果我的透明框架已經在那裏我需要點擊的位置,不會java框架再次收到事件? – Varun 2009-07-28 06:32:40
你甚至可以在玻璃板上看到(閱讀java教程),然後簡單地使用事件。 – 2009-07-28 10:10:24
你可以暫時隱藏窗口。它會引入一些閃爍我知道,但我不能想到別的東西.... – 2009-07-28 10:11:00