Это просто идея, с которой вы можете начать искать.
В свинге компоненты графического интерфейса используют менеджер макетов ( LayoutManager ), который отвечает за размещение каждого графического элемента на своем месте.
Они немного хитры, потому что логика расположения элементов варьируется от LayoutManager к другому, в большинстве случаев вам приходится их комбинировать.
LayoutManager обычно запрашивает компонент, который они размечают, чтобы узнать, какой минимальный размер, максимальный размер и предпочтительный размер. Некоторые лимы полностью игнорируют эту информацию, некоторые используют ее частично.
Хорошо, было бы предложено использовать менеджер макетов, который учитывает предпочтительный размер (или максимальный), а затем добавить прослушиватель мыши над другим элементом. Когда элемент перетаскивается, вы можете программно увеличивать / уменьшать максимальный / минимальный / размер преффа вашего компонента (скорее всего, JTextArea) и позволить LYM изменить размер визуального вида компонента.
Так что это будет выглядеть так:
public App {
private JComponent container;
private JComponent myTarget;
private JComponent dragComponent;
public void someWhere() {
container.setLayoutManager( someLayoutManager() );
container.add( myTarget );
container.add( dragComponent );
// warn: not actual method names, I don't remember them
dragComponent.addMouseListener( new MouseAdapter() {
public void mouseDragged( MouseEvent me ) {
Point point me.getPoint();
int h = myTarget.getHeight();
int w = myTarget.getWidth();
// Do some math to know if you have to add or subtract.
int movement = // -20, +20, whatever.
myTarget.setMaximumSize( h + ( movement ) , w );
}
} );
}
}
Это просто псевдокод, так что не стреляйте в меня.
Опять же, идея состоит в том, чтобы найти правильного менеджера компоновки и добавить прослушиватель мыши, чтобы знать, куда перетаскивается компонент. Каждый раз, когда компонент перетаскивается, вы меняете размер целевого компонента и позволяете LayoutManager изменять его форму.
Надеюсь, это поможет.
p.s. Swing также имеет поддержку drag / drop , посмотрите, поможет ли это.