Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (7)

Лучшие ответы пользователя

Все ответы (5)
  • Полупрозрачное окно на 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 комментария
  • java перехват выделения

    mgarin
    @mgarin
    Если Вы говорите о прослушивании выделения в сторонних приложениях из Вашего Java-приложения — ничего не выйдет. По крайней мере на pure-java.

    Java в своей комплектации несёт (по большей части) лишь кроссплатформенный функционал.
    Поэтому любая работа с окнами системы, полями, кнопками и прочими компонентами других окон системы, какими-либо хитрыми «штучками» в виде прогресса на статус-баре приложения в Windows 7 и пр. — невозможны на Java без вызова нативных средств (как сделали эти ребята, к примеру). Вызов нативных средств влечёт за собой возможные проблемы совместимости между разными версиями одной ОС, проблемы с переносимостью (кроссплатформенностью) кода, а также может влиять на стабильность работы JVM.

    Различные подобные вещи входят в стандартный «набор» только если они появляются во всех известных ОС (как произошло с определённой версии JDK 6 с прозрачностью и формами окон, например), но происходит это всё ОЧЕНЬ долго и, как понимаете, не тогда когда Вам надо.

    P.S. Всегда можно использовать JNI + код на C, но это уже не то…
    Ответ написан
    1 комментарий
  • Как создать UI?

    mgarin
    @mgarin
    Если я правильно понял посмотрев на Radiant Player - вас интересует кастомизация оформления окна приложения. И как уже было сказано выше - это действительно можно реализовать на том что вы перечислили и даже более.

    Я не эксперт в том что касается C/C++, но однозначно могу сказать что на Java это реализуется достаточно просто как на Swing, так и на Java FX, который сейчас набирает популярность.

    Непосредственно изменить нативное оформление не выйдет, но можно без проблем создать своё предварительно убрав нативное. Далее рисуете средствами языка любое оформление, которое вам по вкусу или же используете предзаготовленную графику - тут уже как вам нравится. К примеру скопировать оформление окна Radiant Player займёт минут 5-10, если конечно вы знакомы со Swing и Graphics2D. На Java FX это займёт примерно столько же.

    Я занимаюсь написанием своей open-source Look & Feel библиотеки для Swing фреймворка - WebLaF - если вы решите смотреть в сторону Swing, то можете покопаться в открытых исходниках этой библиотеки. Там есть реализация кастомной декорации окна со всякими плюшками, которую видно на скриншоте на первой странице GitHub проекта. Если говорить более точно - основная часть оформления находится в реализации RootPaneUI. При желании само визуальное оформление можно без проблем видоизменить.
    Ответ написан
    3 комментария