タイトルが示すように、JTabbedPane からタブをドッキング/ドッキング解除する最良の方法は何ですか? Chromeでタブをドラッグすると新しいウィンドウが開き、ドラッグして元に戻す方法と同様ですか?
質問する
599 次
2 に答える
2
それは簡単な質問ではありません。
まず、トリガーが必要です。これは、タブがドッキング解除されることを識別できるものです。タブは並べ替えることができるため、ドラッグイベントを監視するだけでは不十分です。
次に、ウィンドウが閉じている場合(または必要な場合でも)にタブを「再ドッキング」する方法を決定するための何らかの方法が必要です。
その後、タブからコンポーネントを取り外してフレームに配置するのと同じくらい簡単になります。その逆も同様です。
于 2012-11-28T00:54:08.457 に答える
0
これは、MouseMotionListener と MouseListener を使用して行いました。これは、タブヘッダーをかなりの距離までドラッグするとドッキングを解除し、ドッキング解除されたフレームを閉じると再ドッキングします。
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Window;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTree;
public class DockableTabbedPane extends JTabbedPane {
private DockableTabbedPane DraggableTabbedPane;
public DockableTabbedPane() {
super();
DraggableTabbedPane = this;
TabDragListener tabDragger = new TabDragListener();
this.addMouseListener(tabDragger);
this.addMouseMotionListener(tabDragger);
}
private class TabDragListener implements MouseListener, MouseMotionListener {
Point p0,p0screen;
Component current;
String title;
public void mousePressed(MouseEvent e) {
p0 = e.getPoint();
for (int i = 0; i < getTabCount(); i++) {
Rectangle bounds = getBoundsAt(i);
if (bounds.contains(p0)) {
current = DockableTabbedPane.this.getComponentAt(i);
title =DockableTabbedPane.this.getTitleAt(i);
p0screen = getLocationOnScreen();
}
}
};
public void mouseDragged(MouseEvent e) {
Point p = e.getPoint();
JFrame frame;
if (current != null) {
// check for a significant drag
if( p.distance(p0)>20){
frame = undock(current,title);
current = null;
}
}
}
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;
}
}
private UndockedFrame undock(Component current,String title) {
Point p = current.getLocationOnScreen();
remove(current);
UndockedFrame frame = new UndockedFrame(current,title);
p.translate(20, 20);
frame.setLocation(p);
frame.setVisible(true);
fireStateChanged();
return frame;
}
private class UndockedFrame extends JFrame {
Component current;
String title;
public UndockedFrame(Component current,String title) {
this.current = current;
this.setTitle(title);
Container content = this.getContentPane();
content.setLayout(new BorderLayout());
content.add(current, BorderLayout.CENTER);
this.setBounds(current.getBounds());
this.addWindowListener(new UndockedFrameListener());
}
public void redock() {
this.dispose();
add(title, current);
}
}
// Redock on close
private class UndockedFrameListener extends WindowAdapter {
public void windowClosing(WindowEvent e) {
Window w = e.getWindow();
if (w instanceof UndockedFrame) {
UndockedFrame frame = (UndockedFrame)w;
frame.redock();
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
DockableTabbedPane pane = new DockableTabbedPane();
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);
}
}
于 2015-03-26T22:18:39.453 に答える