2023-07-01 (土) 01:07:39
  • category: swing folder: DockingFrames title: JFrameの移動を同期 tags: [JFrame, ComponentListener] author: aterai pubdate: 2005-07-04T07:42:08+09:00 description: JFrameを2つ並べて作成し、その位置関係を保ったまま移動できるようにします。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTLtEL3M0I/AAAAAAAAAYA/9HmyXI1Uw0M/s800/DockingFrames.png

概要

JFrame2つ並べて作成し、その位置関係を保ったまま移動できるようにします。
http://terai.xrea.jp/swing/dockingframes/screenshot.png

サンプルコード

#spanend
#spanadd
private void positionFrames(ComponentEvent e) {
#spanend
  if (e.getComponent().equals(frame1)) {
    int x = frame1.getBounds().x;
    int y = frame1.getBounds().y + frame1.getBounds().height;
    frame2.removeComponentListener(this);
    frame2.setLocation(x, y);
    frame2.addComponentListener(this);
  } else {
    int x = frame2.getBounds().x;
    int y = frame2.getBounds().y - frame1.getBounds().height;
    frame1.removeComponentListener(this);
    frame1.setLocation(x, y);
    frame1.addComponentListener(this);
  }
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin
private void positionFrames(ComponentEvent e) {
  if(e.getSource().equals(frame1)) {
    int x = frame1.getBounds().x;
    int y = frame1.getBounds().y + frame1.getBounds().height;
    frame2.removeComponentListener(this);
    frame2.setLocation(x, y);
    frame2.addComponentListener(this);
  }else{
    int x = frame2.getBounds().x;
    int y = frame2.getBounds().y - frame1.getBounds().height;
    frame1.removeComponentListener(this);
    frame1.setLocation(x, y);
    frame1.addComponentListener(this);
  }
}

解説

  • JFrameを上下に並べてそれぞれにComponentListenerを実装したリスナーを追加
  • 片方のフレームが移動された時、残りのフレームの位置を指定する前に一旦このリスナーを削除することで処理ループの発生を防止

参考リンク

コメント