Swing: Как я мог бы относиться к JInternalFrame одинаково к другим компонентам внутри контейнера? - PullRequest
0 голосов
/ 26 июня 2009

Справочная информация:

Я реализую визуальный редактор диаграмм, который состоит из

  • различные сложные элементы (изменяемого размера, с заголовком, подэлементами) и
  • различные простые элементы (без изменения размера, без заголовка, без подэлементов).

Все элементы можно перетаскивать.

Я использую JInternalFrame (для сложных элементов) вместе с JPanel (для простых элементов) для представления элементов принципиальной схемы. Существует контейнер (JDesktopPane или JLayeredPane), который содержит все эти элементы.

У меня есть несколько проблем с этой концепцией:

Дело 1 - Контейнер представляет собой JDesktopPane:

  • JInternalFrames всегда выше других элементов.
  • Нажатие на другие элементы не «деактивирует» ранее активную JInternalFrame

Дело 2 - Контейнер представляет собой JLayeredPane:

  • После нажатия на некоторые элементы внутри JInternalFrame, он остается "активирован" навсегда.

Кейс 3 - JInternalFrame используется для всего, но без оформления для простых элементов:

  • Моя пользовательская граница (которая необходима, когда я удаляю вручную Строка заголовка JInternalFrame) каждый раз заменяется текущей границей LAF, после активация / деактивация JInternalFrame.

В любом случае, я не понимаю всей концепции, стоящей за активацией JInternalFrames. Если бы я мог сделать JInternalFrame вообще не активируемым , я мог бы выберите Дело 2 любой будет счастлив.

Пожалуйста, посоветуйте мне, каким было бы простое и понятное решение данных проблем.

ПРИМЕЧАНИЕ: выбор компонентов и активация JInternalFrame кажется, разные вещи.

Ответы [ 2 ]

0 голосов
/ 26 июня 2009

попробуйте при инициализации JInternalFrame =

 new JInternalFrame(<your args>) {
          protected void fireInternalFrameEvent(int id){  
               if (id != InternalFrameEvent.INTERNAL_FRAME_ACTIVATED) {
                   super.fireInternalFrameEvent(id);
               }
          }
 };

обратите внимание, что, глядя на код в JInternalFrame.setSelected(boolean), setSelected и 'actvation' связаны друг с другом в процессе, в этом setSelected запускает не только изменения свойств для Selection, но также вызывает fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_ACTIVATED).

0 голосов
/ 26 июня 2009

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

Редактировать: Может быть, у нас есть какое-то терминологическое недоразумение, поскольку Javadoc утверждает:

/**
 * Selects or deselects the internal frame
 * if it's showing.
 * A <code>JInternalFrame</code> normally draws its title bar
 * differently if it is
 * the selected frame, which indicates to the user that this
 * internal frame has the focus.
 * When this method changes the state of the internal frame
 * from deselected to selected, it fires an
 * <code>InternalFrameEvent.INTERNAL_FRAME_ACTIVATED</code> event.
 * If the change is from selected to deselected,
 * an <code>InternalFrameEvent.INTERNAL_FRAME_DEACTIVATED</code> event
 * is fired.
 *
 * @param selected  a boolean, where <code>true</code> means this internal frame
 *                  should become selected (currently active)
 *                  and <code>false</code> means it should become deselected
 * @exception PropertyVetoException when the attempt to set the
 *            property is vetoed by the <code>JInternalFrame</code>
 *
 * @see #isShowing
 * @see InternalFrameEvent#INTERNAL_FRAME_ACTIVATED
 * @see InternalFrameEvent#INTERNAL_FRAME_DEACTIVATED
 *
 * @beaninfo
 *     constrained: true
 *           bound: true
 *     description: Indicates whether this internal frame is currently
 *                  the active frame.
 */

Редактировать 2: Теперь я перечитал ваш второй случай. Я бы сказал, что каждый JIF имеет свою отдельную среду фокусировки / выбора. Вы можете создать метод, который будет проходить через все ваши JIF-файлы и отменять выбор в нем чего-либо, если только это не тот компонент, который вы хотите выбрать.

...