@stepango

Полупрозрачное окно на java которое игнорирует клики мышкой?

Встала задача создать приложение одним из компонентов которого будет полупрозрачное окно которое находится всегда на переденем плане, при этом ведет себя так как будто его нет. Тоесть если за этим коном находится приложение то на нажатия мышки будет реагировать только это приложение. Реально ли сделать такое с помощью java? Вопрос только в игнорировании кликов.
  • Вопрос задан
  • 3170 просмотров
Пригласить эксперта
Ответы на вопрос 2
mgarin
@mgarin
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. У меня встречный вопрос — Вам нужно именно окно висящее над Вашим основным (например потому, что висящее может выходить за границы)?
Если же висящее окно (игнорирующее любые события) всегда находится в границах основого — я могу предложить другой, более эффективный и простой вариант реализации.
Ответ написан
taliban
@taliban
php программист
Мне кажется такое сделать в любом языке нереально, разве что рисовать на экране нужную информацию, если есть окно, то оно принимает сигналы, и соответственно будет реагировать на мышь…
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы