2015-03-26 5 views
0

Как создать вкладки с вкладками, в которых вы можете перетаскивать и перемещать вкладки по горизонтали в строке заголовка TabbedPane? например. Аналогично перемещению вкладок браузера в Google Chrome.Как создать подвижные/перетаскиваемые вкладки с вкладками i.e

ответ

0

Вот код, который я написал для этого. Включает драйвер и слушатель, который реализует механизм перемещения по перетаскиванию.

 import java.awt.Component; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JSlider; 
import javax.swing.JSpinner; 
import javax.swing.JTabbedPane; 
import javax.swing.JTextArea; 
import javax.swing.JTree; 

public class MovableTabbedPane extends JTabbedPane { 


    public MovableTabbedPane() { 
     super(); 
     TabDragListener tabDragger = new TabDragListener(); 
     this.addMouseListener(tabDragger); 
     this.addMouseMotionListener(tabDragger); 

    } 

    private class TabDragListener extends MouseAdapter { 

     Point initialPoint; 
     double initialY, targetY; 
     Component current; 
     String title; 

     public void mousePressed(MouseEvent e) { 
      initialPoint = e.getPoint(); 
      initialY=initialPoint.getY(); 

      for (int i = 0; i < getTabCount(); i++) { 
       Rectangle bounds = getBoundsAt(i); 
       if (bounds.contains(initialPoint)) { 
        current = MovableTabbedPane.this.getComponentAt(i); 
        title =MovableTabbedPane.this.getTitleAt(i); 
       } 
      } 
     }; 

     public void mouseDragged(MouseEvent e) { 
      Point targetPoint = e.getPoint(); 
      targetY=targetPoint.getY(); 

      if (current != null) { 
       // check for a significant horizontal drag 
       if(Math.abs(targetY-initialY)< 40 && targetPoint.distance(initialPoint)>5){ 
        int targetIndex = MovableTabbedPane.this.getUI().tabForCoordinate(MovableTabbedPane.this, 
          e.getX(), e.getY()); 
        // target index should be valid and also not be same as original tab's index 
        if(targetIndex!=-1 && targetIndex!=getSelectedIndex()){   
         remove(current); 
         insertTab(title, null, current, null, targetIndex); 
         setSelectedIndex(targetIndex); 
        } 
       } 
      } 
     } 

     public void mouseMoved(MouseEvent arg0) {} 

     public void mouseClicked(MouseEvent arg0) {} 

     public void mouseEntered(MouseEvent arg0) {} 

     public void mouseExited(MouseEvent arg0) {} 

     public void mouseReleased(MouseEvent arg0) { 
      current=null; 
      title =null; 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     MovableTabbedPane pane = new MovableTabbedPane(); 
     pane.add(new JTree(), "Tree 0"); 
     pane.add(new JTextArea(" Hello"), "Tree 1"); 
     pane.add(new JFileChooser(), "Tree 2"); 
     pane.add(new JSpinner(), "Tree 3"); 
     pane.add(new JSlider(),"Tree 4"); 
     frame.getContentPane().add(pane); 
     frame.setBounds(100, 100, 400, 400); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 
     frame.setVisible(true); 
    } 
} 
+0

Это решение работает, но это плохое решение. Он показывает ограниченное понимание Java (без использования MouseAdapter, ненужного поля саморегуляции 'movableTabbledPane'). Переменные имена неясны (p0, y и y0). Его юзабилити плохо; нет визуального разрешения или обратной связи, и нет поддержки доступности (в частности, нет возможности переместить вкладку с помощью клавиатуры). Он игнорирует все настраиваемые свойства вкладки, отличной от заголовка. Таким образом, это нормально для школьного проекта, но я бы никогда не использовал его для программного обеспечения конечного пользователя. – VGR

+0

Спасибо. Я изменил его, чтобы использовать MouseAdapter и удалил ссылки self. Предоставляются более четкие имена переменных. Я просто хотел дать представление о том, как это может быть достигнуто, как вы можете видеть у водителя. Другие настраиваемые свойства могут быть разрешены пользователем в соответствии с их требованиями, которые я предполагал. Должен ли я удалить этот вопрос, так как это дубликат? –

 Смежные вопросы

  • Нет связанных вопросов^_^