Swing/TranslucentFrameRepaint のバックアップソース(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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(../) RIGHT:Posted by &author(aterai); at 2011-10-24 *JFrameの透明化と再描画 [#vb5228db] 半透明にしたJFrameの再描画を行います。 -&jnlp; -&jar; -&zip; //#screenshot #ref(https://lh4.googleusercontent.com/-ujoDf8eD4vE/TqLcC0f2CHI/AAAAAAAABD4/LHaXXW6HW1k/s800/TranslucentFrameRepaint.png) **サンプルコード [#vc402d77] #code{{ 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())); if(label.getParent().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(); } } }} **解説 [#k3a01a3f] 上記のサンプルでは、実際はJFrameが半透明ではなく、以下のように%%半透明にした%%透明にしたJFrameに、半透明のJPanelを追加、さらにその子として一秒ごとに文字列が変化するJLabel(時計)を配置しています。 JFrame -透明 #code{{ com.sun.awt.AWTUtilities.setWindowOpaque(frame, false); //frame.setBackground(new Color(0,0,0,0)); //1.7.0 }} -AWTUtilities.setWindowOpacity(...)、Window#setOpacity(...)は子コンポーネント全体が半透明になるので、このサンプルでは使用していない 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}; #comment