• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JComponentの移動、リサイズ
TITLE:JComponentをマウスで移動、リサイズ
#navi(../)
*JComponentの移動、リサイズ [#v450b08b]
Posted by [[terai]] at 2008-05-19
RIGHT:Posted by [[aterai]] at 2008-05-19
*JComponentをマウスで移動、リサイズ [#f4a8d50c]
JLayeredPaneに、マウスで移動、リサイズ可能なコンポーネントを追加します。

#contents

**概要 [#af02f69f]
JLayeredPaneに、移動、リサイズ可なコンポーネントを追加します。

-&jnlp;
-&jar;
-&zip;

#screenshot
//#screenshot
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTRw-M85QI/AAAAAAAAAhs/BFyVP2IYoak/s800/ResizableComponents.png)

**サンプルコード [#n84bb09d]
#code{{
public void mouseDragged(MouseEvent e) {
  if(startPos==null || startingBounds==null) return;
  Point p = SwingUtilities.convertPoint((Component)e.getSource(), e.getX(), e.getY(), null);
  int deltaX = startPos.x - p.x;
  int deltaY = startPos.y - p.y;
  int newX = getX();
  int newY = getY();
  int newW = getWidth();
  int newH = getHeight();

  JComponent parent = (JComponent)getParent();
  Rectangle parentBounds = parent.getBounds();
  Dimension min = new Dimension(50,50);
  Dimension max = new Dimension(500,500);

  switch(cursor) {
    case Cursor.N_RESIZE_CURSOR: {
      if(startingBounds.height + deltaY < min.height) {
        deltaY = -(startingBounds.height - min.height);
      }else if(startingBounds.height + deltaY > max.height) {
        deltaY = max.height - startingBounds.height;
      }
      if(startingBounds.y - deltaY < 0) { deltaY = startingBounds.y; }
      newX = startingBounds.x;
      newY = startingBounds.y - deltaY;
      newW = startingBounds.width;
      newH = startingBounds.height + deltaY;
      break;
    }
    case Cursor.NE_RESIZE_CURSOR: {
      if(startingBounds.height + deltaY < min.height) {
        deltaY = -(startingBounds.height - min.height);
//......
}}

**解説 [#sc16de97]
上記のサンプルでは、ツールバーやポップアップメニューから、移動、リサイズ可能なJTableやJTreeを追加することができます。
上記のサンプルでは、ツールバーやポップアップメニューから、移動、リサイズ可能なJTableやJTreeをJLayeredPane(JLayeredPaneのデフォルトレイアウトはnull)に追加することができます。

リサイズボーダーの描画などは、[[Resizable Components - Santhosh Kumar's Weblog>http://www.jroller.com/santhosh/entry/resizable_components]]から、マウスのドラッグによる移動、リサイズの最大値、最小値の制限などは、%JAVA_HOME%/src/javax/swing/plaf/basic/BasicInternalFrameUI.java からの引用です。
リサイズボーダーの描画などは、[http://www.jroller.com/santhosh/entry/resizable_components Resizable Components - Santhosh Kumar's Weblog]から、マウスのドラッグによる移動、リサイズの最大値、最小値の制限などは、%JAVA_HOME%/src/javax/swing/plaf/basic/BasicInternalFrameUI.java からの引用です。

----
JDK1.5では、JLayeredPane#setComponentPopupMenuを使う場合、以下のようにダミーのマウスリスナーなどを追加しておく必要があります。
#code{{
layer.setComponentPopupMenu(new MyPopupMenu());
layer.addMouseListener(new MouseAdapter() {});
}}

----
JDK1.6では、背面にあるJTableのヘッダが前面にロールオーバーしてしまいます。

//#screenshot(,screenshot1.png)
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTRzAZnaVI/AAAAAAAAAhw/t9TWz3YYv6U/s800/ResizableComponents1.png)

**参考リンク [#qf2f4f0c]
-[[Resizable Components - Santhosh Kumar's Weblog>http://www.jroller.com/santhosh/entry/resizable_components]]
-[http://www.jroller.com/santhosh/entry/resizable_components Resizable Components - Santhosh Kumar's Weblog]

**コメント [#r6bdc669]
#comment