Swing/TreeDragScroll のバックアップソース(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/TreeDragScroll へ行く。
TITLE:JTreeの余白をドラッグしてスクロール #navi(../) RIGHT:Posted by [[aterai]] at 2011-12-26 *JTreeの余白をドラッグしてスクロール [#b1773617] JTreeの余白などをマウスでドラッグしてスクロールします。 -&jnlp; -&jar; -&zip; //#screenshot #ref(https://lh3.googleusercontent.com/-8b-0M5bS9Tw/Tvf_XhVVreI/AAAAAAAABHU/BdECxkBAdzU/s800/TreeDragScroll.png) **サンプルコード [#g24696ef] #code{{ class DragScrollListener extends MouseAdapter { Cursor defCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); Cursor hndCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); Point pp = new Point(); @Override public void mouseDragged(MouseEvent e) { JComponent jc = (JComponent)e.getSource(); Container c = jc.getParent(); if(c instanceof JViewport) { JViewport vport = (JViewport)c; Point cp = SwingUtilities.convertPoint(jc,e.getPoint(),vport); Point vp = vport.getViewPosition(); vp.translate(pp.x-cp.x, pp.y-cp.y); jc.scrollRectToVisible(new Rectangle(vp, vport.getSize())); pp.setLocation(cp); } } @Override public void mousePressed(MouseEvent e) { JComponent jc = (JComponent)e.getSource(); Container c = jc.getParent(); if(c instanceof JViewport) { jc.setCursor(hndCursor); JViewport vport = (JViewport)c; Point cp = SwingUtilities.convertPoint(jc,e.getPoint(),vport); pp.setLocation(cp); } } @Override public void mouseReleased(MouseEvent e) { ((JComponent)e.getSource()).setCursor(defCursor); } } }} **解説 [#qf2b1d96] 上記のサンプルでは、JTreeにMouseListener, MouseMotionListenerを設定してマウスドラッグでスクロールが可能になっています。 [[JScrollPaneのViewPortをマウスで掴んでスクロール>Swing/HandScroll]]と、ぼぼ同じことをしていますが、JLabelとは異なり、JTreeにはデフォルトでMouseListener, MouseMotionListenerが設定されているため、JViewportに、リスナーを設定してもマウスイベントが伝わりません。 #code{{ MouseAdapter ma = new HandScrollListener(); JScrollPane scroll = new JScrollPane(tree1); JViewport vport = scroll.getViewport(); vport.addMouseMotionListener(ma); vport.addMouseListener(ma); MouseAdapter dummy = new MouseAdapter() { private void dispatchEvent(MouseEvent e) { JComponent c = (JComponent)e.getComponent(); JComponent p = (JComponent)e.getComponent().getParent(); p.dispatchEvent(SwingUtilities.convertMouseEvent(c,e,p)); } @Override public void mouseDragged(MouseEvent e) { dispatchEvent(e); } @Override public void mouseClicked(MouseEvent e) { dispatchEvent(e); } @Override public void mouseEntered(MouseEvent e) { dispatchEvent(e); } @Override public void mouseExited(MouseEvent e) { dispatchEvent(e); } @Override public void mousePressed(MouseEvent e) { dispatchEvent(e); } @Override public void mouseReleased(MouseEvent e) { dispatchEvent(e); } }; }} **参考リンク [#p851da48] - [[JScrollPaneのViewPortをマウスで掴んでスクロール>Swing/HandScroll]] **コメント [#y1967494] #comment