Swing:我怎样才能将JInternalFrame与容器内的其他组件同等对待?

时间:2009-06-26 12:47:43

标签: java user-interface swing jinternalframe jdesktoppane

背景资料:

我正在实现一个可视图编辑器,它由

组成
  • 不同的复杂元素(可重新调整大小,带标题栏,子元素)和
  • 不同的简单元素(不可重复大小,没有标题栏,没有子元素)。

所有元素都可以拖动。

我正在使用JInternalFrame(用于复杂元素)和JPanel (对于简单元素)表示原理图的元素。有一个容器(JDesktopPane或JLayeredPane),它包含 所有这些元素。

我对此概念有几个问题:

案例1 - 容器是JDesktopPane:

  • JInternalFrames总是高于其他元素。
  • 单击其他元素不会“停用”以前处于活动状态的JInternalFrame

案例2 - 容器是JLayeredPane:

  • 点击JInternalFrame中的一些元素后,它会停留 永远“激活”。

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

  • 我的自定义边框(手动删除时需要) JInternalFrame的标题栏)每次都被当前的LAF边界取代 激活/停用JInternalFrame。

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

请告诉我,对于给定的问题,这将是一个简单而直接的解决方案。

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

2 个答案:

答案 0 :(得分: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并取消选择其中任何内容的方法,除非它是您想要选择的组件。

答案 1 :(得分: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)