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(); }}