Перетаскивание ручки в Java Swing - PullRequest
2 голосов
/ 24 апреля 2009

Я не могу понять, как создать дескриптор изменения размера в Java Swing. Если вы не уверены, что я имею в виду, откройте страницу «Задать вопрос» на этом веб-сайте и посмотрите внизу текстовой области. Он имеет панель, которую вы можете перетащить, чтобы изменить размер области. Я ищу способ сделать это в Java Swing. Я даже не знаю, где искать этот момент.

Любая помощь будет оценена.

Ответы [ 4 ]

9 голосов
/ 24 апреля 2009

По моему мнению, ручка перетаскивания, используемая в форме публикации Stack Overflow, наиболее похожа на ручку вертикального JSplitPane , как по внешнему виду, так и по функциональности.

0 голосов
/ 24 апреля 2009

Как уже ответил другой человек, то, что вы пытаетесь сделать, просто требует, чтобы JSplitPane установил горизонтальное выравнивание. Вы можете отрегулировать ширину разделительной полосы в соответствии с желаемым размером пикселя.

0 голосов
/ 24 апреля 2009

Это просто идея, с которой вы можете начать искать.

В свинге компоненты графического интерфейса используют менеджер макетов ( 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 , посмотрите, поможет ли это.

0 голосов
/ 24 апреля 2009

Я тоже этого не делал, но так как вы просто ищете начало, я попробую.

Я бы поместил некоторый JComponent (возможно, пользовательский подкласс) в то место, где вы хотите, чтобы появился дескриптор (я предполагаю, что вы можете достаточно хорошо манипулировать менеджерами компоновки для выполнения этой части). Затем я добавил бы к компоненту MouseListener и MouseMotionListener - вероятно, один и тот же класс, подкласс MouseAdapter. При обнаружении щелчка и перетаскивания я бы изменил размер компонента, к которому прикреплен дескриптор.

Это помогает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...