질문은 How to pass mouse events to applications behind mine in C#/Vista?과 정확히 같지만 투명 자바 UI에 대해 동일한 질문이 필요합니다. 6.0을 사용하여 투명한 Java UI를 쉽게 만들 수 있지만, 응용 프로그램을 통해 이벤트를 응용 프로그램 (예 : 브라우저)에 전달하는 것에 대한 정보는 얻을 수 없습니다.자바 UI 뒤에있는 응용 프로그램에 마우스 이벤트 전달
답변
귀하의 질문에 대한 답변입니다. 이를 실행하려면 Java 6 update 10 이상이 필요합니다. 나는 Windows Vista에서 당신이 장식되지 않은 창 또는 형 Java으로 장식되어 하나의 (안 기본 OS 장식), 그렇지 않으면 코드가 작동하지 않습니다을 가지고 중 필요
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);
}
}
주를 시험했다.
로보트 클래스 http://java.sun.com/javase/6/docs/api/java/awt/Robot.html을 사용하면 시스템 이벤트를 낮은 수준의 운영 체제, 특히 마우스 이벤트와 같이 지정할 수 있습니다.
로봇을 통과하는 구성 요소 투명을해야한다 자바 프레임이 다시 이벤트를 수신합니까? – Varun
당신은 유리 창 (이것에 대한 자바 튜토리얼 읽기)에서 심지어 잡을 수 있으며, 단순히 이벤트를 소비합니다. –
일시적으로 창을 숨길 수 있습니다. 내가 아는 깜박 거림을 소개 하겠지만 뭔가 다른 것을 생각할 수는 없다. ... –
Java 1.6.0_31을 사용하여 SavOS의 대답이 MacOS X 10.7.3에서도 완벽하게 도움이되었습니다. 감사! 유일한 : 나는 또한
f.setUndecorated(true);
이 대답하지 않는 설정했지만, 자바 7+
와 호환 위험 허용 대답에 대한 문제뿐만 아니라 예를 제공하는 수정 갱신 Per-Pixel alphering은 투명 여부를 결정하기 위해 창의 각 픽셀을 검사합니다. 투명하면 마우스 이벤트가 통과 할 수 있습니다. 투명하지 않으면 마우스 이벤트가 창에 걸리게됩니다. 이것은 일반적으로 OS 레벨 문제입니다.
예를 들어 실제로 위험한 일부 작업을 수행하고 있다면 먼저 불투명 한 구성 요소 위에 반투명 색상을 페인팅합니다. 즉, 스윙은 실제로 구성 요소 아래에 그림을 그려야한다는 것을 모르고 결과도 발생할 수 있음을 의미합니다. Swing은 불투명하고 투명한 구성 요소에 대해서만 알고 있기 때문에 매우 불쾌한 페인트 인공물에서 반투명 구성 요소에 대해 알지 못하므로 API를 속일 필요가 있습니다.
사용자 지정 그림을 수행 할 때 그림을 그리기 전에 Graphics
컨텍스트가 올바르게 설정되었는지 항상 확인하려면 super.paintComponent
을 호출해야합니다. 귀하의 경우에는, 당신은 또한 내 투명 프레임이 내가 클릭해야 할 위치에 이미있는 경우,없는 것 시스템 이벤트를 생성하기 위해 사용 할 수 있지만 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();
}
}
}
은 jdk 1.6, 1.7의 Windows 7, jdk 1.6, 1.7의 XP에서 잘 클릭 할 수 있습니다. 그래도 다른 OS에 대해서는 잘 모르겠다. – rogerdpack
이것은 불투명 한 구성 요소의 투명도를 "가짜"로 만들려고 할 때 위험한 예이며 그래픽 고스트 및 기타 그래픽 가공물이 생길 수 있습니다. 더 나은 단순한 해결책은'setOpaue'를 사용하고'false'를 사용하여 단순히'Component''c'를 투명하게 만드는 것입니다. 페인트 체인이 깨졌습니다. – MadProgrammer