这与此处提出的问题相关: JTabbedPane: Components before and after the tabs themselves
我想附加一个鼠标监听器,允许拖动构建的谷歌类Chrome框架。首先,初始拖动代码相当简单,this Kirill-post处的鼠标拖动代码可以直接使用。如果用户点击并拖动框架的“标题栏”,即标签(粘贴鞋)所在的区域,我只想要这种行为。这也很简单 - 只需将拖动代码更改为仅接受JTabbedPane上部区域中的点击,即包含选项卡的部分。
但是,我希望进一步减少可抓取区域,并且只允许在没有被标签占据的区域中点击并拖动框架(棒状鞋面 - 任何人都有这个GUI元素的更好名称?) - 再次非常像谷歌Chrome(Chrome在窗口模式下也会在标签上方添加一个条形,如果有许多标签处于活动状态,则可以更轻松地抓住框架。但Chrome可以做到这一点:可以抓住选项卡部分中的窗口没有标签,甚至在标签之间的小v中!)
我真正想做的是,能够将鼠标监听器附加到选项卡的GUI背景 - 但是如何完成这样的事情呢?
答案 0 :(得分:1)
在查看this question(Swing中的可拖动选项卡)的解决方案之后,我发现实际的TabbedPaneUI有一些方法可以解决这两个问题:只在选项卡区域中拖动窗口,结果证明是最困难的部分,而不是在标签本身上方拖动。相关代码如下,标有“// ::”的两个部分。该代码改编自问题提到的Kirill代码。代码不处理其他情况,而不是选项卡位于顶部 - 这在考虑我想要做的事情时是有意义的。
// mouse listener for dragging the host window
MouseAdapter adapter = new MouseAdapter() {
int lastX;
int lastY;
boolean _dragInitiated;
@Override
public void mousePressed(MouseEvent e) {
TabbedPaneUI ui = _windowTabs.getUI();
// :: Won't drag if we're positioned above a tab in tab area
if (ui.tabForCoordinate(_windowTabs, e.getX(), e.getY()) != -1) {
_dragInitiated = false;
return;
}
// :: Won't drag if we're below the tab area
int maxY = 0;
for (int i = 0; i < _windowTabs.getTabCount(); i++) {
Rectangle bounds = ui.getTabBounds(_windowTabs, i);
int y = bounds.y + bounds.height;
if (y > maxY) {
maxY = y;
}
}
_dragInitiated = true;
if (maxY > 0) {
if (e.getY() > maxY) {
_dragInitiated = false;
}
}
Point eventLocationOnScreen = e.getLocationOnScreen();
if (eventLocationOnScreen == null) {
Component source = (Component) e.getSource();
eventLocationOnScreen = new Point(e.getX() + source.getLocationOnScreen().x, e.getY()
+ source.getLocationOnScreen().y);
}
lastX = eventLocationOnScreen.x;
lastY = eventLocationOnScreen.y;
}
@Override
public void mouseDragged(MouseEvent e) {
if (!_dragInitiated) {
return;
}
Point eventLocationOnScreen = e.getLocationOnScreen();
if (eventLocationOnScreen == null) {
Component source = (Component) e.getSource();
eventLocationOnScreen = new Point(e.getX() + source.getLocationOnScreen().x, e.getY()
+ source.getLocationOnScreen().y);
}
int dx = eventLocationOnScreen.x - lastX;
int dy = eventLocationOnScreen.y - lastY;
Window win = POTabbedFrame.this;
Point loc = win.getLocation();
win.setLocation(loc.x + dx, loc.y + dy);
lastX = eventLocationOnScreen.x;
lastY = eventLocationOnScreen.y;
}
};
_windowTabs.addMouseListener(adapter);
_windowTabs.addMouseMotionListener(adapter);