Swing/TranslucentFrameRepaint のバックアップソース(No.11)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/TranslucentFrameRepaint へ行く。
- 1 (2011-10-24 (月) 15:53:52)
- 2 (2011-10-24 (月) 18:11:47)
- 3 (2011-10-24 (月) 19:37:18)
- 4 (2012-02-10 (金) 17:34:36)
- 5 (2012-04-17 (火) 17:26:14)
- 6 (2012-10-30 (火) 21:02:17)
- 7 (2012-12-16 (日) 01:38:42)
- 8 (2013-06-28 (金) 18:34:17)
- 9 (2013-11-26 (火) 16:26:21)
- 10 (2014-01-17 (金) 17:24:20)
- 11 (2014-02-26 (水) 15:41:24)
- 12 (2014-11-19 (水) 20:22:56)
- 13 (2014-11-21 (金) 18:11:05)
- 14 (2015-04-07 (火) 19:54:46)
- 15 (2017-02-22 (水) 13:59:47)
- 16 (2018-01-03 (水) 19:53:11)
- 17 (2018-02-24 (土) 19:51:30)
- 18 (2019-03-06 (水) 14:00:48)
- 19 (2020-12-16 (水) 11:01:16)
- 20 (2023-03-18 (土) 16:05:58)
TITLE:JFrameの透明化と再描画 #navi(../) #tags(JFrame, Translucent, JPanel, JLabel, TexturePaint) RIGHT:Posted by &author(aterai); at 2011-10-24 * JFrameの透明化と再描画 [#vb5228db] 半透明にした`JFrame`の再描画を行います。 #download #ref(https://lh4.googleusercontent.com/-ujoDf8eD4vE/TqLcC0f2CHI/AAAAAAAABD4/LHaXXW6HW1k/s800/TranslucentFrameRepaint.png) ** サンプルコード [#vc402d77] #code(link){{ private final SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); private final JLabel label = new JLabel(df.format(new Date())); private final Timer timer = new Timer(1000, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { label.setText(df.format(new Date())); Container parent = SwingUtilities.getUnwrappedParent(label); if(parent!=null && parent.isOpaque()) { repaintWindowAncestor(label); } } }); private void repaintWindowAncestor(Component c) { Window w = SwingUtilities.getWindowAncestor(c); if(w instanceof JFrame) { JFrame f = (JFrame)w; JComponent cp = (JComponent)f.getContentPane(); //cp.repaint(); Rectangle r = c.getBounds(); r = SwingUtilities.convertRectangle(c, r, cp); cp.repaint(r.x, r.y, r.width, r.height); //r = SwingUtilities.convertRectangle(c, r, f); //f.repaint(r.x, r.y, r.width, r.height); }else{ c.repaint(); } } //or //private void repaintWindowAncestor(JComponent c) { // JRootPane root = c.getRootPane(); // if(root==null) { // return; // } // Rectangle r = c.getBounds(); // r = SwingUtilities.convertRectangle(c, r, root); // root.repaint(r.x, r.y, r.width, r.height); //} }} ** 解説 [#k3a01a3f] 上記のサンプルでは、実際は`JFrame`が半透明ではなく、以下のように%%半透明にした%%透明にした`JFrame`に、半透明の`JPanel`を追加、さらにその子として一秒ごとに文字列が変化する`JLabel`(時計)を配置しています。 - `JFrame` -- 透明 #code{{ com.sun.awt.AWTUtilities.setWindowOpaque(frame, false); //JDK 1.6.0 frame.setBackground(new Color(0,0,0,0)); //1.7.0 }} -- `Window#setOpacity(...)`(または`JDK 1.6.0`で`AWTUtilities.setWindowOpacity(...)`)は、子コンポーネントを含めてすべて半透明になるので、このサンプルでは使用していない - `JPanel` -- `frame.getContentPane().add(panel)`で追加 -- 半透明(二種類) --- `setOpaque(true)`+半透明のアルファ成分をもつ色を`setBackground()`で設定 --- `JPanel`が`setOpaque(true)`なので、`ContentPane`から再描画しないと、`JPanel`に設定した半透明の背景色が重複して上書きされる(色が濃くなる) --- `setOpaque(false)`+`paintComponent()`をオーバーライドして背景画像などを描画 - `JLabel` -- `panel.add(label)`で追加 -- 一秒ごとに文字列を変更する時計 -- `setOpaque(false)`で背景は透明 ** 参考リンク [#s8b81bf4] - [http://www.viva-edo.com/komon/edokomon.html 江戸の文様(和風素材・デスクトップ壁紙)] - [http://www.yourname.jp/soft/digitalfonts-20090306.shtml ユアネーム・7セグ・12セグフォント大全集] ** コメント [#q7c95e31] - フォントをデジタル時計ぽいものに変更。 -- [[aterai]] &new{2012-02-10 (金) 17:35:12}; -- スクリーンショットは入れ替えるのが面倒なので、古いフォントのまま。 -- [[aterai]] &new{2012-04-17 (火) 17:26:14}; #comment