TITLE:JInternalFrameをJFrameとして表示する

Posted by terai at 2009-08-31

JInternalFrameをJFrameとして表示する

JFrameのタイトルバーなどを非表示にして、変わりにJInternalFrameのタイトルバーを表示します。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

final JInternalFrame internal = new JInternalFrame("@title@");
BasicInternalFrameUI ui = (BasicInternalFrameUI)internal.getUI();
Component title = ui.getNorthPane();
for(MouseMotionListener l:title.getListeners(MouseMotionListener.class)) {
  title.removeMouseMotionListener(l);
}
DragWindowListener dwl = new DragWindowListener();
title.addMouseListener(dwl);
title.addMouseMotionListener(dwl);
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(new JTree()));
p.add(new JButton(new AbstractAction("close") {
  public void actionPerformed(ActionEvent e) {
    SwingUtilities.windowForComponent((Component)e.getSource()).dispose();
  }
}), BorderLayout.SOUTH);
internal.getContentPane().add(p);
internal.setVisible(true);
EventQueue.invokeLater(new Runnable() {
  public void run() {
    try{
      internal.setSelected(true);
    }catch(java.beans.PropertyVetoException ex) {
      ex.printStackTrace();
    }
  }
});

解説

上記のサンプルでは、JInternalFrameのタイトルバーを使用することで、閉じるボタンのないフレームを作成しています。

  • JFrame#setUndecorated(true) で、JFrameのタイトルバーなどを非表示
  • BasicInternalFrameUI#getNorthPane()でJInternalFrameのタイトルバーを取得
    • 元のMouseMotionListenerを削除
    • JInternalFrameをドラッグすると親のJFrameが移動するMouseMotionListenerを追加
  • 制限
    • 最大化、最小化、リサイズなどには未対応
      • Alt+Spaceで最大化、最小化できるが、下のサイズに戻せなくなる場合がある
    • 角の透明化には未対応

コメント