1. У меня была мысль, что подобный вариант может сработать:
public class NonResponsiveWindow extends JFrame
{
public NonResponsiveWindow ()
{
super ();
setLayout ( new BorderLayout () );
add ( new JPanel()
{
{
setOpaque ( false );
}
public boolean contains ( int x, int y )
{
return false;
}
public boolean contains ( Point p )
{
return false;
}
protected void paintComponent ( Graphics g )
{
super.paintComponent ( g );
Graphics2D g2d = ( Graphics2D ) g;
g2d.setRenderingHint ( RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON );
g2d.setComposite ( AlphaComposite.getInstance ( AlphaComposite.SRC_OVER, 0.5f ) );
g2d.setPaint ( Color.GRAY );
Area area = new Area ( new Ellipse2D.Double ( 0, 0, getWidth (), getHeight () ) );
area.subtract ( new Area (
new Ellipse2D.Double ( 25, 25, getWidth () - 50, getHeight () - 50 ) ) );
g2d.fill ( area );
}
public Dimension getPreferredSize ()
{
return new Dimension ( 300, 300 );
}
} );
setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
setAlwaysOnTop ( true );
setUndecorated ( true );
AWTUtilities.setWindowOpaque ( this, false );
pack ();
}
public boolean contains ( int x, int y )
{
return false;
}
public boolean contains ( Point p )
{
return false;
}
public static void main ( String[] args )
{
new NonResponsiveWindow ().setVisible ( true );
}
}
(На момент JDK 1.6.0_26 — данный код работает нормально только под Win/Mac)
Но, как можно заметить, полупрозрачная область по прежнему перехватывает все события на окне, даже учитывая то, что панель «якобы» не попадает в видимую для событий область засчет переопределённых методов contains (...).
Вероятно нужно переопределить его также и в JRootPane, который используется на окне (т.е. заменить стандартный RootPane своей имплементацией) — но не факт что поможет. У меня есть подозрение, что что-то ещё проверяет действительно ли находится окно над мышью или же можно пропускать события «сквозь» него.
2. Говоря о других вариантах… Вы спросили Выше:
А если например после получаения сигнала воспроизводить его но уже для другово окна?
Это должно быть вполне реализуемо засчёт стандартных средств (нужно лишь корректно передавать координаты низлежащему окну).
3. У меня встречный вопрос — Вам нужно именно окно висящее над Вашим основным (например потому, что висящее может выходить за границы)?
Если же висящее окно (игнорирующее любые события) всегда находится в границах основого — я могу предложить другой, более эффективный и простой вариант реализации.