Swing/TranslucentFrame のバックアップソース(No.7)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/TranslucentFrame へ行く。
- 1 (2008-12-01 (月) 15:04:38)
- 2 (2008-12-01 (月) 19:50:49)
- 3 (2008-12-15 (月) 04:24:54)
- 4 (2009-01-16 (金) 16:29:06)
- 5 (2009-05-07 (木) 10:42:38)
- 6 (2009-10-09 (金) 15:11:55)
- 7 (2010-05-24 (月) 15:27:28)
- 8 (2010-11-10 (水) 20:59:48)
- 9 (2011-02-08 (火) 04:02:46)
- 10 (2013-01-13 (日) 19:18:30)
- 11 (2013-05-24 (金) 03:25:25)
- 12 (2013-08-17 (土) 15:40:30)
- 13 (2013-10-10 (木) 19:41:21)
- 14 (2013-10-16 (水) 14:24:13)
- 15 (2014-10-20 (月) 19:41:17)
- 16 (2014-11-01 (土) 00:46:09)
- 17 (2014-12-02 (火) 01:55:04)
- 18 (2015-12-10 (木) 04:08:26)
- 19 (2016-02-03 (水) 18:23:28)
- 20 (2016-09-29 (木) 17:13:15)
- 21 (2017-11-02 (木) 15:34:40)
- 22 (2017-11-10 (金) 14:05:58)
- 23 (2018-02-24 (土) 19:51:30)
- 24 (2019-05-22 (水) 19:35:38)
- 25 (2019-07-09 (火) 19:24:27)
- 26 (2021-03-18 (木) 01:07:37)
- 27 (2022-08-20 (土) 22:15:25)
- 28 (2022-10-01 (土) 05:00:49)
TITLE:SynthでJInternalFrameを半透明にする #navi(../) RIGHT:Posted by [[terai]] at 2008-12-01 *SynthでJInternalFrameを半透明にする [#n658aabb] Synthを使ったLookAndFeelで、JInternalFrame を半透明にします。 -&jnlp; -&jar; -&zip; #screenshot **サンプルコード [#m302be7e] #code{{ try{ for(UIManager.LookAndFeelInfo laf: UIManager.getInstalledLookAndFeels()) if("Nimbus".equals(laf.getName())) { UIManager.setLookAndFeel(laf.getClassName()); SynthLookAndFeel.setStyleFactory( new MySynthStyleFactory(SynthLookAndFeel.getStyleFactory())); break; } } }catch(Exception e) { e.printStackTrace(); } }} #code{{ class MySynthStyleFactory extends SynthStyleFactory { private SynthStyleFactory wrappedFactory; public MySynthStyleFactory(SynthStyleFactory factory) { this.wrappedFactory = factory; } public SynthStyle getStyle(JComponent c, Region id) { SynthStyle s = wrappedFactory.getStyle(c, id); //if(id==Region.INTERNAL_FRAME_TITLE_PANE||id==Region.INTERNAL_FRAME) { if(id==Region.INTERNAL_FRAME) { s = new TranslucentSynthSytle(s); } return s; } } class TranslucentSynthSytle extends SynthStyle { private final SynthStyle style; public TranslucentSynthSytle(SynthStyle s) { style = s; } public SynthPainter getPainter(final SynthContext context) { return new SynthPainter() { public void paintInternalFrameBackground(SynthContext context, Graphics g, int x, int y, int w, int h) { g.setColor(new Color(100,200,100,100)); g.fillRoundRect(x,y,w-1,h-1,15,15); } }; } public boolean isOpaque(SynthContext context) { if(context.getRegion()==Region.INTERNAL_FRAME) { return false; }else{ return style.isOpaque(context); } } public Color getColorForState(SynthContext context, ColorType type) { return null; //Color.RED; } public Font getFontForState(SynthContext context) { return null; //new Font("MONOSPACE", Font.ITALIC, 24); } //... }} **解説 [#p3984476] 上記のサンプルでは、SynthStyle#paintInternalFrameBackground、SynthStyle#isOpaqueなどのメソッドをオーバーライドしてJInternalFrame を半透明にします。 ---- -Synthを使ったLook&Feel #screenshot(,screenshot1.png) --JDK 1.6.0_10 で追加された NimbusLookAndFeel や、GTKLookAndFeel など ---- 「警告:com.sun.java.swing.Painter は Sun が所有する API であり、今後のリリースで削除される可能性があります。」といった警告が出ても良いなら、以下のようにUIDefaults#putでPainterを設定する方法もあります。 -参考: -- [[Caffeine Induced Ramblings - Jasper Potts’s Blog » Blog Archive » Nimbus: The New Face of Swing - JavaOne 2008>http://www.jasperpotts.com/blog/2009/01/nimbus-the-new-face-of-swing-javaone-2008/]] -- com.sun.java.swing.plaf.nimbus.NimbusDefaults.java #code{{ import java.awt.*; import javax.swing.*; import javax.swing.plaf.synth.*; import com.sun.java.swing.Painter; // JDK6 //import javax.swing.Painter; // 1.7.0 b57 public class BackgroundPainterTest { private final JDesktopPane desktop = new JDesktopPane(); public JComponent makeUI() { JPanel p1 = new JPanel(); p1.setOpaque(false); JPanel p2 = new JPanel() { public void paintComponent(Graphics g) { g.setColor(new Color(100,50,50,100)); g.fillRect(0,0,getWidth(), getHeight()); } }; UIDefaults d = new UIDefaults(); d.put("InternalFrame[Enabled].backgroundPainter", new Painter() { public void paint(Graphics2D g, Object o, int w, int h) { g.setColor(new Color(100,200,100,100)); g.fillRoundRect(0,0,w-1,h-1,15,15); } }); d.put("InternalFrame[Enabled+WindowFocused].backgroundPainter", new Painter() { public void paint(Graphics2D g, Object o, int w, int h) { g.setColor(new Color(100,250,120,100)); g.fillRoundRect(0,0,w-1,h-1,15,15); } }); createFrame(p1, d, 0); createFrame(p2, d, 1); JPanel p = new JPanel(new BorderLayout()); p.add(desktop); p.setPreferredSize(new Dimension(320, 240)); return p; } protected JInternalFrame createFrame(JPanel panel, UIDefaults d, int idx) { MyInternalFrame frame = new MyInternalFrame(); frame.putClientProperty("Nimbus.Overrides", d); frame.putClientProperty("Nimbus.Overrides.InheritDefaults", false); frame.setOpaque(false); if(panel!=null) { frame.setContentPane(panel); panel.add(new JLabel("label")); panel.add(new JButton("button")); frame.getRootPane().setOpaque(false); } desktop.add(frame); frame.setVisible(true); frame.setLocation(10+60*idx, 10+40*idx); desktop.getDesktopManager().activateFrame(frame); return frame; } static class MyInternalFrame extends JInternalFrame{ public MyInternalFrame() { super("title", true, true, true, true); setSize(160, 100); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } public static void createAndShowGUI() { try{ for(UIManager.LookAndFeelInfo laf: UIManager.getInstalledLookAndFeels()) if("Nimbus".equals(laf.getName())) UIManager.setLookAndFeel(laf.getClassName()); }catch(Exception e) { e.printStackTrace(); } JFrame frame = new JFrame(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.getContentPane().add(new BackgroundPainterTest().makeUI()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } } }} **参考リンク [#cef3d81f] -[[JInternalFrameを半透明にする>Swing/TransparentFrame]] **コメント [#c0c35d4a] #comment