• category: swing folder: RootPaneBackground title: JRootPaneの背景として画像を表示 tags: [JRootPane, BufferedImage, ContentPane, JDesktopPane, Translucent, Transparent] author: aterai pubdate: 2013-01-07T00:31:26+09:00 description: JRootPaneの背景として画像を表示しています。 image: https://lh6.googleusercontent.com/-2HEcpl-4XqA/UOmSieyPnxI/AAAAAAAABaI/KBA4i6QGH3E/s800/RootPaneBackground.png

概要

JRootPaneの背景として画像を表示しています。

サンプルコード

JFrame frame = new JFrame("@title@") {
  @Override protected JRootPane createRootPane() {
    JRootPane rp = new JRootPane() {
      //private final TexturePaint texture = makeCheckerTexture();
      @Override protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setPaint(texture);
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.dispose();
      }
      @Override public void updateUI() {
        super.updateUI();
        BufferedImage bi = makeBufferedImage("test.jpg");
        setBorder(new CentredBackgroundBorder(bi));
        setOpaque(false);
      }
    };
    return rp;
  }
};
//frame.getRootPane().setBackground(Color.BLUE);
//frame.getLayeredPane().setBackground(Color.GREEN);
//frame.getContentPane().setBackground(Color.RED);
((JComponent) frame.getContentPane()).setOpaque(false);
frame.setJMenuBar(createMenubar());
frame.getContentPane().add(new MainPanel());
View in GitHub: Java, Kotlin

解説

このサンプルでは、JFrame#createRootPane()メソッドをオーバーライドして、以下の方法で背景に画像を描画するJRootPaneを作成しています。

  • 中央の画像: CentredBackgroundBorderを使用
  • チェック柄: JRootPane#paintComponent(...)をオーバーライド

  • JRootPaneの子コンポーネントの透明化、半透明化
    • ContentPane: setOpaque(false);で透明化
    • JDesktopPane: setOpaque(false);で透明化
    • JMenuBar: setOpaque(false);で透明化し、JMenuBar#paintComponent(...)をオーバーライドして半透明化
    • JMenu, JMenuItemなど: setOpaque(false);で透明化、LookAndFeelによって、JMenu#setBackground(new Color(0x0, true));UIManager.put("Menu.selectionBackground", new Color(0, 0, 100, 100));などを使用
    • JPopupMenu: JMenuなどから開くPopupMenuを半透明化などで、半透明化

参考リンク

コメント