• category: swing folder: WindowDecorationStyle title: JRootPaneにリサイズのための装飾を設定する tags: [JFrame, JRootPane, JLayeredPane, JInternalFrame, MetalLookAndFeel] author: aterai pubdate: 2013-06-17T02:37:17+09:00 description: JFrame自体の装飾を削除し、JRootPaneにリサイズのためのウィンドウ装飾(透明)を設定します。 image: https://lh3.googleusercontent.com/-6jloCHHvTmw/Ub30100G84I/AAAAAAAABuM/AHxMNa5jyB0/s800/WindowDecorationStyle.png

概要

概要

JFrame自体の装飾を削除し、JRootPaneにリサイズのためのウィンドウ装飾(透明)を設定します。

サンプルコード

サンプルコード

JFrame frame = new JFrame();
#spandel
try{
#spanend
#spanadd
try {
#spanend
  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
#spandel
}catch(Exception e) {
#spanend
#spanadd
} catch (Exception e) {
#spanend
  e.printStackTrace();
}
#spandel
//XXX: JFrame frame = new JFrame();
#spanend
#spanadd
// XXX: JFrame frame = new JFrame();
#spanend
frame.setUndecorated(true);

JRootPane root = frame.getRootPane();
root.setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
JLayeredPane layeredPane = root.getLayeredPane();
Component c = layeredPane.getComponent(1);
#spandel
if(c instanceof JComponent) {
#spanend
  JComponent orgTitlePane = (JComponent)c;
#spanadd
if (c instanceof JComponent) {
#spanend
  JComponent orgTitlePane = (JComponent) c;
  orgTitlePane.setVisible(false);
  //layeredPane.remove(orgTitlePane);
  // layeredPane.remove(orgTitlePane);
}
#spandel
//JComponent dummyTitlePane = new JLabel();
#spanend
#spandel
//layeredPane.add(dummyTitlePane, JLayeredPane.FRAME_CONTENT_LAYER);
#spanend
#spandel
//dummyTitlePane.setVisible(true);
#spanend

JPanel p = new JPanel(new BorderLayout());
#spandel
p.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
#spanend
#spandel
p.setBackground(new Color(1f,1f,1f,.01f));
#spanend
#spanadd
p.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
#spanend
#spanadd
p.setBackground(new Color(1f, 1f, 1f, .01f));
#spanend

p.add(internalFrame);
frame.getContentPane().add(p);
View in GitHub: Java, Kotlin

解説

解説

  • JFrameの装飾を削除
    • JFrame#setUndecorated(true);
  • JInternalFrameContentPaneに追加
  • JRootPaneに装飾を追加、変更
    • JRootPane#setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);で装飾を追加し、リサイズのためのMouseMotionListenerなどを利用
    • JLayeredPaneからタイトルバーを削除
      • 上辺でリサイズできない
    • マウスでリサイズ可能な領域を作成するために、ContentPaneにほぼ透明なBorderをもつJPanelを追加

  • MetalLookAndFeelのみLookAndFeel#getSupportsWindowDecorations()true
    • LookAndFeelを変更する場合は、ContentPane以下から更新することで、JRootPane#setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);が無効にならないようにする必要がある
  • MetalLookAndFeelのみLookAndFeel#getSupportsWindowDecorations()trueを返す
    • LookAndFeelを変更する場合は、ContentPane以下から更新することでJRootPane#setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);が無効にならないようにする必要がある
      #spandel
      for(Window window: Frame.getWindows()) {
      #spanend
        if(window instanceof RootPaneContainer) {
          RootPaneContainer rpc = (RootPaneContainer)window;
          SwingUtilities.updateComponentTreeUI(rpc.getContentPane());
      #spanadd
      for (Window window: Window.getWindows()) {
      #spanend
        if (window instanceof RootPaneContainer) {
          SwingUtilities.updateComponentTreeUI(((RootPaneContainer) window).getContentPane());
        }
      }
      

参考リンク

参考リンク

コメント

コメント