2009-07-27 3 views

답변

5

귀하의 질문에 대한 답변입니다. 이를 실행하려면 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); 
    } 

} 

주를 시험했다.

+0

은 jdk 1.6, 1.7의 Windows 7, jdk 1.6, 1.7의 XP에서 잘 클릭 할 수 있습니다. 그래도 다른 OS에 대해서는 잘 모르겠다. – rogerdpack

+0

이것은 불투명 한 구성 요소의 투명도를 "가짜"로 만들려고 할 때 위험한 예이며 그래픽 고스트 및 기타 그래픽 가공물이 생길 수 있습니다. 더 나은 단순한 해결책은'setOpaue'를 사용하고'false'를 사용하여 단순히'Component''c'를 투명하게 만드는 것입니다. 페인트 체인이 깨졌습니다. – MadProgrammer

0

로보트 클래스 http://java.sun.com/javase/6/docs/api/java/awt/Robot.html을 사용하면 시스템 이벤트를 낮은 수준의 운영 체제, 특히 마우스 이벤트와 같이 지정할 수 있습니다.

+1

로봇을 통과하는 구성 요소 투명을해야한다 자바 프레임이 다시 이벤트를 수신합니까? – Varun

+0

당신은 유리 창 (이것에 대한 자바 튜토리얼 읽기)에서 심지어 잡을 수 있으며, 단순히 이벤트를 소비합니다. –

+1

일시적으로 창을 숨길 수 있습니다. 내가 아는 깜박 거림을 소개 하겠지만 뭔가 다른 것을 생각할 수는 없다. ... –

2

Java 1.6.0_31을 사용하여 SavOS의 대답이 MacOS X 10.7.3에서도 완벽하게 도움이되었습니다. 감사! 유일한 : 나는 또한

f.setUndecorated(true); 
+1

Java 1.7이 설치된 OS X 10.9에서 예외없이 실행하려면이 작업이 필요합니다.0_4이지만 투명 영역 **에서는 클릭 이벤트가 ** 아래의 응용 프로그램에 전달되는 것을 허용하지 않았습니다. – dpdearing

+0

이것은 플랫폼 종속적 인 문제인 것으로 보이며 https://bugs.openjdk.java.net/browse/JDK-8013450 및 http://stackoverflow.com/q/13020607/186818에 명시되어 있습니다. – dpdearing

1

이 대답하지 않는 설정했지만, 자바 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(); 
     } 

    } 

}