Solaris 5.10: как скрыть кнопку JWindow на панели задач?

Я использую объект JWindow в своем приложении Java для имитации раскрывающегося меню при наведении курсора мыши. Когда пользователь наводит указатель мыши на JLabel, окно появляется и остается до тех пор, пока мышь не покинет метку или новое видимое окно. Моя проблема заключается в том, что каждый раз, когда пользователь выполняет это действие, появляется новая запись на панели задач в нижней части экрана без заголовка или значка и исчезает, как только в окне вызывается setVisible(false).

Я попытался переключиться на неукрашенный JDialog, и это решило мою проблему с панелью задач, но представило новую. Когда setVisible(true) вызывается в JDialog, фокус переносится с моего кадра. Цвет строки заголовка изменяется, чтобы указать на это, что выглядит непрофессионально.

При использовании недекорированного JFrame возникли обе вышеуказанные проблемы.

Я не хочу использовать JInternalFrame, так как это потребует полной переделки моего интерфейса (переключение на структуру JDesktopPane), и мне не нужны никакие другие функции JInternalFrame.

Есть идеи?


person Community    schedule 27.08.2009    source источник


Ответы (1)


Для этого можно использовать JPopupMenu.

popupMenu = new JPopupMenu();

Action showPopupAction = new AbstractAction("Show Popup") {
  public void actionPerformed(ActionEvent e) {
    AbstractButton btn = (AbstractButton)e.getSource();
    Point buttonXY = btn.getLocationOnScreen();
    popupMenu.setLocation((int) buttonXY.getX(), ((int) buttonXY.getY()) + btn.getHeight() + 2);
    popupMenu.setVisible(true);
  }
};

JButton btn = new JButton(showPopupAction);

EDIT: альтернативой использованию полного JPopupMenu является создание Popup, который ссылается на ваш Component, что потребует меньше рефакторинга; например

Component myMnu = ...
Popup popup = new Popup(null, myMnu, 100, 100);
popup.show();

Помимо этого, я не думаю, что есть «быстрое решение» вашей проблемы: согласно Javadocs, JWindow является первоклассным гражданином рабочего стола, и я полагаю, что именно поэтому Solaris добавляет соответствующий значок на панель задач.

person Adamski    schedule 27.08.2009
comment
Спасибо, похоже на это стоит обратить внимание. Однако я уже проделал всю работу по поведению всплывающего окна и просто хочу решить небольшую проблему в исходном вопросе (если возможно). Мне нужно выпустить релиз для этого приложения в ближайшие день или два, а пока нужно отложить рефакторинг. - person ; 27.08.2009
comment
@Dan: Смотрите мое последнее редактирование. Использование всплывающего окна напрямую избавит вас от некоторого рефакторинга, поскольку вы можете просто внедрить JWindow во всплывающее окно. Вам по-прежнему нужно кодировать, когда и где создавать всплывающее окно, но это довольно просто (как в моем исходном примере). - person Adamski; 27.08.2009