Обнаружить изменение разрешения экрана, сделанное пользователем (Java Listener?)

У меня есть приложение Java, которое запускается, создает графический интерфейс и отлично работает. Если пользователь изменит разрешение экрана (переключится с 1440x900 на 1280x768), я хотел бы иметь возможность прослушивать это событие.

Любые идеи?

PS - я хотел бы сделать это в режиме события/слушателя, а не в режиме опроса, чтобы дополнительные циклы ЦП не тратились впустую на что-то вроде таймера, постоянно опрашивающего размер экрана каждые N секунд, чтобы увидеть, изменился ли он.


person Rick Hodgin    schedule 17.09.2011    source источник
comment
Это Swing-приложение?   -  person Santosh    schedule 17.09.2011


Ответы (5)


Этот пост устарел, но: - опрос размера экрана раз в секунду не окажет никакого влияния на производительность - при изменении размера экрана каждое окно должно получать вызов repaint() (вам нужно проверить это для ОС, на которые вы ориентируетесь)

person JayC    schedule 04.12.2012

Я не думаю, что Java может сделать это сама по себе. У вас должен быть «крюк» в операционной системе, который обнаруживает это изменение, и вы можете рассмотреть возможность использования JNA. , JNI или отдельной утилитой, такой как Sigar, которая отчитывается перед вашей Java-программой. Из любопытства, почему вы хотите это сделать? Это для игры, которую вы делаете, или для изменения размера приложения с графическим интерфейсом?

person Hovercraft Full Of Eels    schedule 17.09.2011
comment
Судно на воздушной подушке (хорошая отсылка к MP), я так и думал. С помощью JNI я могу перехватывать WinProc, перехватывая все сообщения WM_*, и отслеживать их таким образом. Надеялся, что есть собственная функция, поскольку было бы желательно, чтобы приложение Java знало такую ​​​​вещь, поэтому она будет предоставлена ​​​​JVM и собственными слушателями. - person Rick Hodgin; 19.09.2011

Помимо предложения Hovercrafts, вы можете рассмотреть фоновый поток, который проверяет текущее разрешение экрана, используя Toolkit.getScreenSize().

Вам нужно будет протестировать это, чтобы узнать, насколько велико влияние этого потока на производительность системы. Как часто он проверяет изменения, зависит от ваших требований (насколько быстро ваше приложение должно реагировать на изменение).

person a_horse_with_no_name    schedule 17.09.2011

Вы можете создать глобальный прослушиватель PAINT для обнаружения изменения размера экрана.

// screen resize listener
    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

        @Override
        public void eventDispatched(AWTEvent event) {
// take a look at http://stackoverflow.com/questions/10123735/get-effective-screen-size-from-java
            Rectangle newSize = getEffectiveScreenSize(); 
            if (newSize.width != windowSize.width || newSize.height != windowSize.height)
                resize();

        }
    }, AWTEvent.PAINT_EVENT_MASK);
person acimutal    schedule 21.07.2014

Вот мое предложение по этой проблеме,

  1. Каждый объект Swing может реализовать интерфейс с именем java.awt.event.ComponentListener.
  2. Один из его методов — componentResized(ComponentEvent e).
  3. Ваш основной фрейм приложения должен реализовать этот интерфейс и переопределить метод события изменения размера. Вот как вы прослушиваете событие изменения размера, проверьте эту ссылку . Я надеюсь, это поможет вам.
person Santosh    schedule 19.09.2011
comment
Насколько я понимаю, размер основного фрейма будет изменен, если пользователь изменит размер окна или если окно будет развернуто, а пользователь изменит видеорежим, и в таком случае будет вызываться componentResized(). Но в случае немаксимизированного окна размера X изменение видеорежима не заставит это окно (кадр) изменить свой размер, и вместо этого, как только видеорежим будет изменен, он просто будет свисать с краев окна. экран в исходном размере, никогда не получавший вызов componentResized(). - person Rick Hodgin; 19.09.2011
comment
Вероятно, за это проголосовали, потому что вы решаете не ту проблему: как писал Рик, ComponentListener вызывается, когда пользователь меняет размер окна, а не при изменении разрешения экрана. - person toolforger; 29.03.2018