Вот код, который я написал для этого. Включает драйвер и слушатель, который реализует механизм перемещения по перетаскиванию.
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);
}
}
Это решение работает, но это плохое решение. Он показывает ограниченное понимание Java (без использования MouseAdapter, ненужного поля саморегуляции 'movableTabbledPane'). Переменные имена неясны (p0, y и y0). Его юзабилити плохо; нет визуального разрешения или обратной связи, и нет поддержки доступности (в частности, нет возможности переместить вкладку с помощью клавиатуры). Он игнорирует все настраиваемые свойства вкладки, отличной от заголовка. Таким образом, это нормально для школьного проекта, но я бы никогда не использовал его для программного обеспечения конечного пользователя. – VGR
Спасибо. Я изменил его, чтобы использовать MouseAdapter и удалил ссылки self. Предоставляются более четкие имена переменных. Я просто хотел дать представление о том, как это может быть достигнуто, как вы можете видеть у водителя. Другие настраиваемые свойства могут быть разрешены пользователем в соответствии с их требованиями, которые я предполагал. Должен ли я удалить этот вопрос, так как это дубликат? –