Как бы вы сделали рамку видимой, если мышь находится внутри нее, и невидимой, когда ее нет в Java? - PullRequest
1 голос
/ 20 декабря 2009

Итак, если бы я писал псевдокод:

if(mouseInsideFrame==true)
    frame.setVisible(true);
else
    frame.setVisible(false);

Какой метод я бы использовал для mouseInsideFrame в операторе if?

Спасибо

Ответы [ 5 ]

1 голос
/ 21 декабря 2009

Я натолкнулся на сообщение на java.net , в котором рассматриваются параметры видимости, в том числе с использованием частного API AWT.

public class TransparentFrame {
  private static final float OPAQUE = 1.0f;
  private static final float TRANSLUCENT = 0.1f;

  public static void main(String[] args) {
    final JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600, 400);
    frame.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseEntered(MouseEvent e) {
        com.sun.awt.AWTUtilities.setWindowOpacity(frame, OPAQUE);
      }

      @Override
      public void mouseExited(MouseEvent e) {
        com.sun.awt.AWTUtilities.setWindowOpacity(frame, TRANSLUCENT);
      }
    });
    frame.setVisible(true);
  }
}

Это нормально для игрушечного кода, но, очевидно, я бы не использовал закрытый класс com.sun для переносимого производственного кода.

1 голос
/ 21 декабря 2009

Обновление: Тот же метод, что и раньше, но с более подробным пошаговым объяснением.

Другие респонденты задаются вопросом, чего вы хотите достичь с этим, и задаются вопросом о дизайне приложения, которое неожиданно появляется у пользователя. Я предполагаю, что вопрос заключается в том, насколько вы настроены реализовать эту функциональность именно так, как вы описали. Сама техника может быть полезна и для других целей, что является моей главной мотивацией для моего нового, улучшенного пересмотра этого ответа.


Насколько я знаю, кадр, который не виден, не может захватывать события мыши. Поэтому он не будет знать, находится ли мышь внутри него или нет.

В этой проблеме есть лазейка: если вы сделаете рамку видимой, но без рамки и полностью прозрачной, она будет видимой в техническом смысле, но невидимой для пользователя для практических целей.

Часть без полей проста: setUndecorated(true).

Было бы замечательно, если бы у JFrame был такой метод, как setOpaque() или setTranslucent(), где вы могли бы сделать его полностью прозрачным, но, увы, его нет.

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

Существует альтернативная, несколько хакерская альтернатива: рамка остается полностью видимой, но за ней отображается изображение скриншота экрана. Поскольку это означает, что мы эффективно просматриваем кадр, он фактически невидим. Это решение описано здесь: http://onjava.com/pub/a/onjava/excerpt/swinghks_hack41/index.html?CMP=OTC-FP2116136014. Автор и я оба признаем, что это немного неуклюже; это также включает в себя гораздо больше кода, чем необходимо. Но он основан на стандартном кодировании Java и должен поддерживаться неизменным во многих средах Java выше версии 1.4 или около того.

Совет описывает, как создать Component, который отображает фон экрана. Это хорошо, когда вы хотите, чтобы рамка была невидимой, но что происходит, когда вы хотите, чтобы она была нормально видимой?

Нужно дать JFrame ContentPane a CardLayout и добавить к нему компонент TransparentBackground и предполагаемый основной видимый компонент (вероятно, JPanel). С этой настройкой переключение между «невидимым» и видимым включает просто:

  • setUndecorated(false) // (true)
  • cardLayout.last() // (первый)

Это переключение, конечно же, будет управляться MouseListener, которое вы можете добавить в JFrame.

0 голосов
/ 21 декабря 2009

Учитывая то, что вы пытаетесь сделать, я бы сказал, что вам нужны два кадра (или, может быть, просто JPanels и кадр, который много изменяет. Один из них - захватить движущуюся над ним мышь (сделать ее прозрачной, неокрашенной или приемлемой иным образом) ) и, когда мышь перемещается над ним, покажите новый фрейм (или панель), а затем скройте его, когда мышь выйдет из него.

Другие ответы здесь дают вам основы о том, как захватывать события мыши и устанавливать рамку без цвета и прозрачности.

0 голосов
/ 21 декабря 2009

Вдобавок ко мне, есть довольно простой способ определить положение мыши на экране (я думаю, это как-то связано с Toolkit). Теперь, если вы можете объединить это со способом определения положения вашего фрейма на экране (если вы еще не знаете), у вас есть решение.

Мне любопытно, что ты пытаешься сделать.

0 голосов
/ 21 декабря 2009

Обычно вы можете использовать слушателей. В частности:

frame.addMouseListener(new MouseListener() {
    public void mouseEntered(MouseEvent evt) {
        frame.setVisible(true);
    }

    public void mouseExited(MouseEvent evt) {
        frame.setVisible(false);
    }
});

Но проблема в том, что, поскольку ваш JFrame не виден, нет возможности прослушивать события мыши !!!! По крайней мере, из того, что я знаю ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...