背景资料:
我正在实现一个可视图编辑器,它由
组成所有元素都可以拖动。
我正在使用JInternalFrame(用于复杂元素)和JPanel (对于简单元素)表示原理图的元素。有一个容器(JDesktopPane或JLayeredPane),它包含 所有这些元素。
我对此概念有几个问题:
案例1 - 容器是JDesktopPane:
案例2 - 容器是JLayeredPane:
案例3 - JInternalFrame用于所有内容,但没有装饰简单元素:
无论如何,我都没有完全激活JInternalFrames的概念。 如果我可以让JInternalFrame完全无法激活,我可以 选择 案例2 任何人都会很高兴。
请告诉我,对于给定的问题,这将是一个简单而直接的解决方案。
注意:选择组件并激活JInternalFrame 似乎是不同的事情。
答案 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)
。