防止 JInternalFrame 移出 JDesktopPane
当我在 JDesktopPane 中有 JInternalFrame 时,JInternalFrame 是可移动的(这很好)。但是,可以将其移到 JDesktopPane 的可见范围之外(我不太喜欢)
要亲自查看,这里有一些示例代码:
public static void main(String[] args) {
JFrame frame = new JFrame("JDesktopPane");
JDesktopPane tableDisplay = new JDesktopPane();
JInternalFrame internalFrame = new JInternalFrame("JInternalFrame",true,true,true,true);
internalFrame.setContentPane(new JLabel("Content"));
internalFrame.pack();
internalFrame.setVisible(true);
tableDisplay.add(internalFrame, JDesktopPane.POPUP_LAYER);
frame.setContentPane(tableDisplay);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setMinimumSize(new Dimension(400, 300));
frame.setVisible(true);
}
是否可以设置 JInternalFrame 或 JDesktopPane,以便它们不会'不允许这样吗?
When I have a JInternalFrame in a JDesktopPane, the JInternalFrame is movable (which is good). However, it's possible to move it outside of the visible scope of the JDesktopPane (which I'm not so fond of)
To see for yourself, here's some sample code:
public static void main(String[] args) {
JFrame frame = new JFrame("JDesktopPane");
JDesktopPane tableDisplay = new JDesktopPane();
JInternalFrame internalFrame = new JInternalFrame("JInternalFrame",true,true,true,true);
internalFrame.setContentPane(new JLabel("Content"));
internalFrame.pack();
internalFrame.setVisible(true);
tableDisplay.add(internalFrame, JDesktopPane.POPUP_LAYER);
frame.setContentPane(tableDisplay);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setMinimumSize(new Dimension(400, 300));
frame.setVisible(true);
}
Is it possible to set either the JInternalFrame or JDesktopPane so that they won't allow this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
负责移动/调整大小的协作者是 DesktopPaneManager。所以我会尝试将移动限制在窗格内。这是一个快速&肮脏的概念证明:
显然,有一些问题需要解决:-) Fi
编辑
只是为了澄清:“无响应”我的意思是用户必须再次释放并按下/拖动(一旦内部框架已触及桌面边界)进一步移动。这并不奇怪,因为 BorderListener(即 BasicInternalFrame 安装的 mouseListener)保留与初始按下相关的一些状态,然后请求相对于该初始位置重新定位。在框架卡在某处的情况下拖动鼠标会混淆内部状态。
有趣的是,查看代码,似乎有意限制移动而不将其推到外面,
不过这是相对于当前鼠标位置的。
The collaborator which is responsible for doing the move/resize is the DesktopPaneManager. So I would try to limit the movement to within the pane. Here's a quick & dirty proof of concept:
There are some issues to solve, obviously :-) F.i.
Edit
just to clarify: with "unresponsive" I mean that the user has to release and press/drag again (once the internal frame has hit the desktop bounds) to further move the. That's not overly surprising, as the BorderListener (that's the mouseListener installed by BasicInternalFrame) keeps some state related to the initial press and then requests re-locates relative to that initial location. Dragging the mouse with the frame stuck somewhere confuses that internal state.
Interestingly, looking at the code, it seems like there had been intentions to limit the movement to not push it to the outside,
that's relative to the current mouse location, though.
完全归功于克利奥帕特拉为我指明了正确的方向。
我想我已经解决了无响应问题,并在这里分享我的解决方案。根据 kleopatra 的回答,如果鼠标点位于窗格之外,则内部框架位于窗格的边缘。此外,它继续跟随鼠标 - 即,如果您将鼠标从窗格底部移开,然后绕到窗格的右侧,框架将沿着窗格底部,然后向右上方移动窗格中的沙子。
Full credit to kleopatra for pointing me in the right direction.
I think I've solved the unresponsiveness issue, and am sharing my solution here. Following kleopatra's answer, if the mouse point is outside of the pane, the internal frame is at the edge of the pane. Also, this continues to follow the mouse - i.e. if you move the mouse off the bottom of the pane, and then round to the right hand side of the pane, the frame will follow along the bottom of the pane, and then up the right sand of the pane.
尝试设置JFrame的
FlowLayout
并使用add()
方法添加JDesktopPane。Try to set
FlowLayout
of JFrame and useadd()
method to add JDesktopPane.JInternalFrame 的顶部不要被隐藏,这一点很重要,因为那是其抓取栏和控制按钮所在的位置。因此,作为设置边界之前的最后一步,请确保 y 值不为负:例如,使用 y = Math.max(0, y) 之类的语句。
It is important that the top of the JInternalFrame not get hidden, since that is where its grab bar and control buttons are located. So, as a last step before setting bounds, make sure that your y value is not negative: for example, with a statement like y = Math.max(0, y).
这完全满足了我的需求。它使拖动的框架完全可见,并且当鼠标光标移到桌面窗格区域的边缘时,它会“滑动”窗口。
Math.clamp
在 Java 21 中可用。如果需要,自己实现。This fully satisfies my needs. It keeps the dragged frame fully visible and it "slides" the window on the edge of the desktop pane area when the mouse cursor is moved beyond it.
Math.clamp
is available in Java 21. Implement it yourself if needed.