Swing/WindowOpacity のバックアップの現在との差分(No.5)
TITLE:JFrameを半透明化
Posted by aterai at 2010-06-14
JFrameを半透明化
JFrameを半透明にします。-
category: swing
folder: WindowOpacity
title: JFrameを半透明化
tags: [JFrame, Translucent, Transparent, JRootPane, ContentPane, TexturePaint]
author: aterai
pubdate: 2010-06-14T14:13:21+09:00
description: JFrameのタイトルや子コンポーネントを除く背景が半透明になるよう設定します。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2010/06/translucent-jframe.html lang: en
概要
JFrame
タイトルや子コンポーネントを除く背景が半透明になるよう設定します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame();
#spandel
//com.sun.awt.AWTUtilities.setWindowOpacity(frame, .5f);
#spanend
#spandel
com.sun.awt.AWTUtilities.setWindowOpaque(frame, false);
#spanend
#spanadd
// com.sun.awt.AWTUtilities.setWindowOpacity(frame, .5f);
#spanend
#spanadd
// com.sun.awt.AWTUtilities.setWindowOpaque(frame, false); // Java 6
#spanend
#spanadd
frame.setBackground(new Color(0x0, true));
#spanend
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
#spanadd
#spanend
JPanel p = new JPanel();
p.add(new JButton("JButton"));
#spandel
p.setBackground(new Color(.5f,.8f,.5f,.5f));
#spanend
#spanadd
p.setBackground(new Color(.5f, .8f, .5f, .5f));
#spanend
#spanadd
#spanend
frame.getContentPane().add(p);
frame.setSize(320, 240);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
解説
com.sun.awt.AWTUtilities.setWindowOpacity(frame, .5f);
を使ってWindow
を半透明化するとJFrame
などのタイトルバーや子コンポーネントまで半透明化されるので、代わりに上記のサンプルでは以下のようにして半透明化を行っています。
解説
com.sun.awt.AWTUtilities.setWindowOpacity(frame, .5f);を使って半透明化すると、フレームのタイトルバーや、子コンポーネントまで半透明化されるので、代わりに上記のサンプルでは以下のようにして半透明化を行っています。- JFrame.setDefaultLookAndFeelDecorated(true);で、タイトルバーなどをJRootPaneに描画
- com.sun.awt.AWTUtilities.setWindowOpaque(frame, false);でJFrameを完全に透明化
- 1.7.0の場合は、代わりに、frame.setBackground(new Color(0,0,0,0));
- ContentPaneにsetBackground(new Color(.5f,.8f,.5f,.5f));で半透明の背景色を設定したパネルを追加
-
JFrame.setDefaultLookAndFeelDecorated(true);
でタイトルバーなどをJRootPane
に描画 -
com.sun.awt.AWTUtilities.setWindowOpaque(frame, false);
でJFrame
を完全に透明化-
JDK 1.7.0
の場合は、代わりにframe.setBackground(new Color(0x0, true));
-
-
ContentPane
にsetBackground(new Color(.5f, .8f, .5f, .5f));
で半透明の背景色を設定したパネルを追加
参考リンク
参考リンク
- 江戸の文様(和風素材・デスクトップ壁紙)
- How to Create Translucent and Shaped Windows (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)
- Robotを使用してスクリーンショットを取得する
コメント
- そんな簡単にできるんですね!昔画面キャプチャしたり色々苦労した結果断念しました; -- riki?
- AWTUtilities.setWindowOpaqueなどが使えるようになったのは、6u10からですが、上記のサンプルみたいなことができるようになったのは、6u14から(多分Bug ID: 6683775 Painting artifacts is seen when panel is made setOpaque(false) for a translucent window)みたいですから、最近(ちょうど一年ぐらい)のようです。 -- aterai
コメント
- そんな簡単にできるんですね!昔画面キャプチャーしたり色々苦労した結果断念しました; -- riki
-
AWTUtilities.setWindowOpaque
などが使えるようになったのは、6u10
からですが、上記のサンプルみたいなことができるようになったのは、6u14
から(多分Bug ID: 6683775 Painting artifacts is seen when panel is made setOpaque(false) for a translucent window)みたいですから、最近(ちょうど一年ぐらい)のようです。 -- aterai
-
- 「
Windows 7
+JDK 1.7.0
」で、このサンプルにあるJComboBox
のドロップダウンリストが正常に描画されない? 「Windows XP
+JDK 1.7.0
」や、「Windows 7
+JDK 1.6.0_27
」は問題なし。 -- aterai -
JDK 1.7.0
では、背景を切り替えたときに前の背景の残像が残る場合がある? -- aterai- こちらは
((JFrame) w).getContentPane().repaint();
でうまくいくが理由が不明…ようなので修正。 -- aterai
- こちらは
-
JDK 1.7.0_04
で?、透明にしたJFrame
にJComboBox
を追加すると、ドロップダウンリストがおかしい? -- aterai- 以下のような
PopupMenuListener
を追加すれば回避できるが…。 -- aterai#spanend #spanadd combo.addPopupMenuListener(new PopupMenuListener() { #spanend @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) { EventQueue.invokeLater(() -> { JComboBox<?> c = (JComboBox<?>) e.getSource(); Object o = c.getAccessibleContext().getAccessibleChild(0); if (o instanceof JComponent) { // BasicComboPopup ((JComponent) o).repaint(); } }); } @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { /* not needed */ } #spanadd #spanend @Override public void popupMenuCanceled(PopupMenuEvent e) { /* not needed */ } #spanadd }); #spanend #spanadd
- 以下のような
-
7u6
では修正されている。JDK 1.7.0_06
のBug Fixes
に載っている Bug ID: 7156657 Version 7 doesn't support translucent popup menus against a translucent window が関係している気がするけど、Release Fixed
に、7u6
が無い? -- aterai- バックポートされたBug ID: JDK-2224554 Version 7 doesn't support translucent popup menus against a translucent windowに、
7u6
がある。 -- aterai
- バックポートされたBug ID: JDK-2224554 Version 7 doesn't support translucent popup menus against a translucent windowに、