• category: swing folder: DockAndUndockTabs title: JTabbedPaneのタブのドラッグアウトで新規JFrameの作成と空JFrameの破棄を実行する tags: [JTabbedPane, TransferHandler, DragAndDrop, JFrame] author: aterai pubdate: 2024-06-03T01:53:27+09:00 description: JTabbedPaneのタブをJFrame外にドラッグアウトした場合はそのタブを含む新規JFrameを作成し、ドラッグ元のJTabbedPaneが空になる場合はその親JFrameごと破棄を実行します。 image: https://drive.google.com/uc?id=16s-3Bs9AtEpgEPhbzapN4qIiwyGjH3K4

概要

JTabbedPaneのタブをJFrame外にドラッグアウトした場合はそのタブを含む新規JFrameを作成し、ドラッグ元のJTabbedPaneが空になる場合はその親JFrameごと破棄を実行します。

サンプルコード

protected TabTransferHandler() {
  super();
  dialog.add(label);
  dialog.setOpacity(.5f);
  DragSource.getDefaultDragSource().addDragSourceMotionListener(e -> {
    Point pt = e.getLocation();
    pt.translate(5, 5); // offset
    dialog.setLocation(pt);
    source.pointOnScreen.setLocation(pt);
  });
}

@Override protected void exportDone(
    JComponent c, Transferable data, int action) {
  DnDTabbedPane src = (DnDTabbedPane) c;
  if (src.pointOnScreen.x > 0) {
    createNewFrame(src);
  }
  if (src.getTabCount() == 0) {
    Optional.ofNullable(SwingUtilities.getWindowAncestor(src))
        .ifPresent(Window::dispose);
  } else {
    src.updateTabDropLocation(null, false);
    src.repaint();
    if (mode == DragImageMode.HEAVYWEIGHT) {
      dialog.setVisible(false);
    }
  }
}

private static void createNewFrame(DnDTabbedPane src) {
  int index = src.dragTabIndex;
  final Component cmp = src.getComponentAt(index);
  // final Component tab = src.getTabComponentAt(index);
  final String title = src.getTitleAt(index);
  final Icon icon = src.getIconAt(index);
  final String tip = src.getToolTipTextAt(index);
  src.remove(index);
  DnDTabbedPane tabs = new DnDTabbedPane();
  tabs.setTransferHandler(src.getTransferHandler());
  tabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
  tabs.addTab(title, icon, cmp, tip);
  // tabs.setTabComponentAt(0, tab);
  tabs.setTabComponentAt(0, new ButtonTabComponent(tabs));
  DropTargetListener listener = new TabDropTargetAdapter();
  try {
    tabs.getDropTarget().addDropTargetListener(listener);
  } catch (TooManyListenersException ex) {
    ex.printStackTrace();
    UIManager.getLookAndFeel().provideErrorFeedback(tabs);
  }
  JFrame frame = new JFrame();
  frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  frame.getContentPane().add(
      new JLayer<>(tabs, new DropLocationLayerUI()));
  frame.setSize(320, 240);
  frame.setLocation(src.pointOnScreen);
  frame.setVisible(true);
  EventQueue.invokeLater(frame::toFront);
}
View in GitHub: Java, Kotlin

解説

参考リンク

コメント