Swing/DnDLayerTabbedPane のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DnDLayerTabbedPane へ行く。
- 1 (2012-01-23 (月) 18:01:31)
- 2 (2012-01-23 (月) 19:26:33)
- 3 (2012-01-25 (水) 19:57:10)
- 4 (2012-12-13 (木) 15:47:56)
- 5 (2013-07-26 (金) 01:10:28)
- 6 (2014-09-15 (月) 15:08:08)
- 7 (2014-10-19 (日) 19:01:01)
- 8 (2014-11-27 (木) 17:53:18)
- 9 (2015-03-31 (火) 21:04:47)
- 10 (2016-05-22 (日) 21:17:19)
- 11 (2017-08-15 (火) 14:46:08)
- 12 (2018-02-24 (土) 19:51:30)
- 13 (2018-08-15 (水) 20:31:16)
- 14 (2018-11-01 (木) 21:41:36)
- 15 (2019-05-22 (水) 19:35:38)
- 16 (2020-10-31 (土) 00:24:08)
- 17 (2022-09-14 (水) 05:25:32)
TITLE:JLayerを使ってJTabbedPaneのタブの挿入位置を描画する
Posted by aterai at 2012-01-23
JLayerを使ってJTabbedPaneのタブの挿入位置を描画する
JLayerを使って、タブのドラッグ&ドロップでの移動先をJTabbedPane上に描画します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
class DropLocationLayerUI extends LayerUI<DnDTabbedPane> {
private static final int LINEWIDTH = 3;
private final Rectangle lineRect = new Rectangle();
@Override public void paint(Graphics g, JComponent c) {
super.paint (g, c);
JLayer layer = (JLayer)c;
DnDTabbedPane tabbedPane = (DnDTabbedPane)layer.getView();
DnDTabbedPane.DropLocation loc = tabbedPane.getDropLocation();
if(loc != null && loc.isDropable() && loc.getIndex()>=0) {
int index = loc.getIndex();
boolean isZero = index==0;
Rectangle r = tabbedPane.getBoundsAt(isZero?0:index-1);
if(tabbedPane.getTabPlacement()==JTabbedPane.TOP ||
tabbedPane.getTabPlacement()==JTabbedPane.BOTTOM) {
lineRect.setRect(
r.x-LINEWIDTH/2+r.width*(isZero?0:1), r.y,LINEWIDTH,r.height);
}else{
lineRect.setRect(
r.x,r.y-LINEWIDTH/2+r.height*(isZero?0:1), r.width,LINEWIDTH);
}
Graphics2D g2 = (Graphics2D)g.create();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
g2.setColor(Color.RED);
g2.fill(lineRect);
g2.dispose();
}
}
}
解説
上記のサンプルでは、JTabbedPaneのタブをドラッグ&ドロップや、JTabbedPane間でタブのドラッグ&ドロップ移動のようにGlassPaneを使用する代わりに、JDK 1.7.0 で導入されたJLayerを使用して、タブの挿入先を描画しています。JLayerを使用することで、別ウィンドウにあるJTabbedPaneへのタブ移動などの描画が簡単にできるようになっています。
- Debug: Lightweight
- ドラッグ中の半透明タブイメージは、JDK1.7.0で導入された、TransferHandler#setDragImage(...)メソッドを使用して描画
- ウインドウの外では半透明タブイメージは非表示
- Debug: Heavyweight
- ドラッグ中の半透明タブイメージは、半透明のJWindowにJLabelを追加して表示
- ウインドウの外でも半透明タブイメージが表示可能
- 表示位置のオフセットが(0, 0)の場合、ドラッグイベントが元のJFrameに伝わらない?
private final JLabel label = new JLabel();
private final JWindow dialog = new JWindow();
public TabTransferHandler() {
dialog.add(label);
//dialog.setAlwaysOnTop(true);
dialog.setOpacity(0.5f);
//com.sun.awt.AWTUtilities.setWindowOpacity(dialog, 0.5f); // JDK 1.6.0
DragSource.getDefaultDragSource().addDragSourceMotionListener(
new DragSourceMotionListener() {
@Override public void dragMouseMoved(DragSourceDragEvent dsde) {
Point pt = dsde.getLocation();
pt.translate(5, 5);
dialog.setLocation(pt);
}
});
//...