JInternalFrameのタイトルバーを消してウィンドウドラッグで移動するように

http://d.hatena.ne.jp/alpha_neet/20101011/1286772477


前回の続きです。
枠もタイトルバーも消してウィンドウ全体でドラッグ移動するようにしてみました。


オライリーJAVA SWING HACKSを参考にしました。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;

class InternalTest2 extends JFrame {
void p(Object o) { System.out.println(o); }

class MyListener implements MouseListener, MouseMotionListener
{
  JComponent frame;
  Point startDrag, startPos;
  MyListener(JComponent frame) {
    this.frame = frame; 

    // リスナー登録
    frame.addMouseListener(this);
    frame.addMouseMotionListener(this);
  }

  Point getScreenLocation(MouseEvent e) {
    Point p1 = e.getPoint();
    Point p2 = frame.getLocationOnScreen();
    return new Point(p1.x+p2.x, p1.y+p2.y);
  }
  public void mouseClicked(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}
  public void mousePressed(MouseEvent e) {
    startDrag = getScreenLocation(e);
    startPos = frame.getLocation();
  }
  public void mouseReleased(MouseEvent e) {}
  public void mouseMoved(MouseEvent e) {}
  public void mouseDragged(MouseEvent e) { 
    Point cursor = getScreenLocation(e);
    int xdiff = cursor.x - startDrag.x;
    int ydiff = cursor.y - startDrag.y;
    frame.setLocation(startPos.x+xdiff, startPos.y+ydiff);
  }
}

InternalTest2() {
  JLabel label = new JLabel(new ImageIcon("test.png"));
  JDesktopPane desktop = new JDesktopPane();
  JInternalFrame iframe = new JInternalFrame();
  new MyListener(iframe);

  // ボーダーをなくす
  iframe.setBorder(BorderFactory.createEmptyBorder());

  // タイトルバーを消す
  BasicInternalFrameUI ui = (BasicInternalFrameUI)iframe.getUI();
  ui.setNorthPane(null);

  iframe.add(label);
  iframe.pack();

  desktop.add(iframe);
  add(desktop);

  setSize(640, 480);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setVisible(true);
  iframe.setVisible(true);
}
public static void main(String[] args) {
  new InternalTest2();
}}