0

背景资料:

我正在实现一个可视化图表编辑器,它包括

  • 不同的复杂元素(可调整大小,带有标题栏、子元素)和
  • 不同的简单元素(不可调整大小,无标题栏,无子元素)。

所有元素都是可拖动的。

我使用 JInternalFrame(用于复杂元素)和 JPanel(用于简单元素)来表示示意图的元素。有一个容器(JDesktopPane 或 JLayeredPane),其中包含所有这些元素。

我对这个概念有几个问题:

案例 1 - 容器是 JDesktopPane:

  • JInternalFrames 总是在其他元素之上。
  • 单击其他元素不会“停用”以前活动的 JInternalFrame

案例 2 - 容器是 JLayeredPane:

  • 单击 JInternalFrame 中的某些元素后,它会永远保持“激活”状态。

案例 3 - JInternalFrame 用于所有内容,但没有对简单元素进行装饰:

  • 在激活/停用 JInternalFrame 之后,我的自定义边框(当我手动删除 JInternalFrame 的标题栏时需要)每次都被当前的 LAF 边框替换。

无论如何,我没有得到激活 JInternalFrames 背后的全部概念。 如果我可以让 JInternalFrame 根本无法激活,我可以选择案例 2 ,任何人都会很高兴。

请告诉我,对于给定问题,什么是简单直接的解决方案。

注意:组件的选择和 JInternalFrame 的激活似乎是不同的事情。

4

2 回答 2

0

我可能误解了你的问题。您是否尝试过查看 JIF 的 setSelected() 方法?似乎支持方法覆盖和可否决的激活事件。

编辑:正如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 并取消选择其中的任何内容的方法,除非它是您想要选择的组件。

于 2009-06-26T13:01:55.640 回答
0

初始化 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)

于 2009-06-26T13:19:03.220 回答