Swing/TranslucentFrame のバックアップの現在との差分(No.2)
TITLE:SynthでJInternalFrameを半透明にする
SynthでJInternalFrameを半透明にする
Posted by terai at 2008-12-01-
category: swing
folder: TranslucentFrame
title: SynthでJInternalFrameを半透明にする
tags: [JInternalFrame, Translucent, LookAndFeel, UIDefaults, Painter]
author: aterai
pubdate: 2008-12-01T15:04:38+09:00
description: Synthを使ったLookAndFeelで、JInternalFrameを半透明にします。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2011/02/translucent-jinternalframe-nimbus.html lang: en
概要
Synth
を使ったLookAndFeel
で、JInternalFrame
を半透明にします。
Screenshot
Advertisement
概要
Synthを使ったLookAndFeelで、JInternalFrame を半透明にします。- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
#spanend
#spandel
try{
#spanend
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
SynthLookAndFeel.setStyleFactory(
new MySynthStyleFactory(SynthLookAndFeel.getStyleFactory()));
#spandel
}catch(Exception e) {
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
try {
#spanend
for (UIManager.LookAndFeelInfo laf: UIManager.getInstalledLookAndFeels())
if ("Nimbus".equals(laf.getName())) {
UIManager.setLookAndFeel(laf.getClassName());
SynthLookAndFeel.setStyleFactory(
new MySynthStyleFactory(SynthLookAndFeel.getStyleFactory()));
break;
}
}
#spanadd
} catch (Exception e) {
#spanend
e.printStackTrace();
}
#spandel
#spanend
#spanadd
#spanend
class MySynthStyleFactory extends SynthStyleFactory {
private SynthStyleFactory wrappedFactory;
#spanadd
#spanend
public MySynthStyleFactory(SynthStyleFactory factory) {
this.wrappedFactory = factory;
}
public SynthStyle getStyle(JComponent c, Region id) {
#spanadd
#spanend
@Override 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);
// if (id == Region.INTERNAL_FRAME_TITLE_PANE||id == Region.INTERNAL_FRAME) {
if (id == Region.INTERNAL_FRAME) {
s = new TranslucentSynthStyle(s);
}
return s;
}
}
#spandel
class TranslucentSynthSytle extends SynthStyle {
#spanend
#spanadd
#spanend
#spanadd
class TranslucentSynthStyle extends SynthStyle {
#spanend
private final SynthStyle style;
public TranslucentSynthSytle(SynthStyle s) {
#spanadd
#spanend
public TranslucentSynthStyle(SynthStyle s) {
style = s;
}
public SynthPainter getPainter(final SynthContext context) {
#spanadd
#spanend
@Override 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);
@Override 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) {
#spanadd
#spanend
@Override public boolean isOpaque(SynthContext context) {
if (context.getRegion() == Region.INTERNAL_FRAME) {
return false;
}else{
} else {
return style.isOpaque(context);
}
}
public Color getColorForState(SynthContext context, ColorType type) {
#spanadd
#spanend
@Override public Color getColorForState(SynthContext context, ColorType type) {
return null; //Color.RED;
}
public Font getFontForState(SynthContext context) {
return null; //new Font("MONOSPACE", Font.ITALIC, 24);
#spanadd
#spanend
@Override public Font getFontForState(SynthContext context) {
return null; //new Font(Font.MONOSPACED, Font.ITALIC, 24);
}
//...
// ...
解説
上記のサンプルでは、SynthStyle#paintInternalFrameBackground、SynthStyle#isOpaqueなどのメソッドをオーバーライドしてJInternalFrame を半透明にします。解説
上記のサンプルでは、SynthStyle#paintInternalFrameBackground
、SynthStyle#isOpaque
などのメソッドをオーバーライドしてJInternalFrame
を半透明にします。
- Synthを使ったLook&Feel
- JDK 1.6.0_10 で追加された NimbusLookAndFeel や、GTKLookAndFeel など
#screenshot(,screenshot1.png)
- -
- JDK 1.6.0_10 で追加された NimbusLookAndFeel や、GTKLookAndFeel など
-
Synth
を使ったLookAndFeel
-
JDK 1.6.0_10
で追加されたNimbusLookAndFeel
や、GTKLookAndFeel
など
-
参考リンク
コメント
- -
-
JDK 1.7.0
以上でNimbusLookAndFeel
を使用する場合、以下のようにUIDefaults#put(...)
でjavax.swing.Painter
を設定する方法もある- Caffeine Induced Ramblings - Jasper Potts’s Blog » Blog Archive » Nimbus: The New Face of Swing - JavaOne 2008
-
com.sun.java.swing.plaf.nimbus.NimbusDefaults.java
#spanend
#spanadd
import java.awt.*;
#spanend
#spanadd
import javax.swing.*;
#spanend
#spanadd
import javax.swing.plaf.synth.*;
#spanend
#spanadd
// import com.sun.java.swing.Painter; // 1.6
#spanend
#spanadd
import javax.swing.Painter;
#spanend
#spanadd
#spanend
#spanadd
public class BackgroundPainterTest {
#spanend
private final JDesktopPane desktop = new JDesktopPane();
public JComponent makeUI() {
JPanel p1 = new JPanel();
p1.setOpaque(false);
JPanel p2 = new JPanel() {
@Override protected void paintComponent(Graphics g) {
g.setColor(new Color(100, 50, 50, 100));
g.fillRect(0, 0, getWidth(), getHeight());
}
};
p2.setOpaque(false);
UIDefaults d = new UIDefaults();
d.put("InternalFrame[Enabled].backgroundPainter", new Painter<JComponent>() {
@Override public void paint(Graphics2D g, JComponent c, 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<JComponent>() {
@Override public void paint(Graphics2D g, JComponent c, 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;
}
#spanadd
#spanend
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;
}
#spanadd
#spanend
static class MyInternalFrame extends JInternalFrame {
public MyInternalFrame() {
super("title", true, true, true, true);
setSize(160, 100);
}
}
#spanadd
#spanend
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
#spanadd
#spanend
public static void createAndShowGUI() {
try {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
} 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);
}
#spanadd
}
#spanend
#spanadd
参考リンク
- JInternalFrameを半透明にする
- Bug ID: 6919629 Nimbus L&F Nimus.Overrides option leaks significant amounts of memory