Задать вопрос
  • Не могли бы вы посоветовать источники (книги, сайты) с советами по качественному написанию кода ?

    TheHorse
    @TheHorse
    Основной источник — опыт).
    Из книг — «Совершенный код».
    Ну и конечно очень сильно помогает чтение хорошего кода.
    Ответ написан
    3 комментария
  • Полупрозрачное окно на java которое игнорирует клики мышкой?

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