Соавтором, который отвечает за перемещение / изменение размера, является DesktopPaneManager.Поэтому я бы попытался ограничить движение внутри панели.Вот быстрое и грязное доказательство концепции:
JDesktopPane background = new JDesktopPane();
JInternalFrame internalFrame = new JInternalFrame("Internal Frame",
true, true, true, true);
DesktopManager manager = new DefaultDesktopManager() {
/** This moves the <code>JComponent</code> and repaints the damaged areas. */
@Override
public void setBoundsForFrame(JComponent f, int newX, int newY, int newWidth, int newHeight) {
boolean didResize = (f.getWidth() != newWidth || f.getHeight() != newHeight);
if (!inBounds((JInternalFrame) f, newX, newY, newWidth, newHeight)) return;
f.setBounds(newX, newY, newWidth, newHeight);
if(didResize) {
f.validate();
}
}
protected boolean inBounds(JInternalFrame f, int newX, int newY, int newWidth, int newHeight) {
if (newX < 0 || newY < 0) return false;
if (newX + newWidth > f.getDesktopPane().getWidth()) return false;
if (newY + newHeight > f.getDesktopPane().getHeight()) return false;
return true;
}
};
background.setDesktopManager(manager);
Очевидно, что есть некоторые проблемы, которые необходимо решить :-) Fi
- использовать менеджера в соответствии с требованиями LAF, что можетсделать это путем реализации обертки DesktopManager, которая делегирует все остальное установленной LAF
- проверка на побочные эффекты (перетаскивание кажется не отвечающим после удара о стену, могут быть другие вещи, необходимые)
Редактировать
просто чтобы уточнить: под "безразличным" я имею в виду, что пользователь должен отпустить и снова нажать / перетащить (как только внутренняя рамка достигнет границ рабочего стола), чтобыдальше двигайся.Это не слишком удивительно, так как BorderListener (это mouseListener, установленный BasicInternalFrame) сохраняет некоторое состояние, относящееся к начальному нажатию, а затем запрашивает повторное расположение относительно этого исходного местоположения.Перетаскивание мыши с застрявшей рамкой вводит в заблуждение это внутреннее состояние.
Интересно, что, глядя на код, кажется, что были намерения ограничить движение, чтобы не толкать его наружу,
// Make sure we stay in-bounds
if(newX + i.left <= -__x)
newX = -__x - i.left + 1;
if(newY + i.top <= -__y)
newY = -__y - i.top + 1;
if(newX + __x + i.right >= pWidth)
newX = pWidth - __x - i.right - 1;
if(newY + __y + i.bottom >= pHeight)
newY = pHeight - __y - i.bottom - 1;
относительно текущего местоположения мыши, хотя,