1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
| import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.TexturePaint;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
public class ImageBackground extends JPanel {
private Image image;
private Paint paint;
private final boolean componentOpaque;
public ImageBackground(Image image, boolean mosaic, boolean componentOpaque) {
if( image==null ) throw new IllegalArgumentException();
this.componentOpaque=componentOpaque;
if ( mosaic ) {
BufferedImage bufferedImage = toBufferedImage(image);
paint = new TexturePaint(bufferedImage, new Rectangle(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight()));
}
else {
this.image=image;
}
}
private static BufferedImage toBufferedImage(Image image) {
if (image instanceof BufferedImage) {
return (BufferedImage) image;
}
BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics2D bGr = bufferedImage.createGraphics();
bGr.drawImage(image, 0, 0, null);
bGr.dispose();
return bufferedImage;
}
@Override
protected void paintComponent(Graphics g) {
if ( paint!=null ) {
Graphics2D g2d = (Graphics2D) g;
g2d.setPaint(paint);
g.fillRect(0, 0, getWidth(), getHeight());
}
else if ( image!=null ) {
g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
}
super.paintComponent(g);
}
protected void addImpl(Component comp, Object constraints, int index) {
if ( !componentOpaque ) {
setComponentTransparent(comp);
}
super.addImpl(comp, constraints, index);
}
private void setComponentTransparent(Component comp) {
if ( comp instanceof JComboBox<?> ) {
// pour certain composant, pour gérer la transparence totale il faut faire du code spécifique
JComboBox<?> combo = (JComboBox<?>) comp;
if (combo.isEditable() ) {
Component editor = combo.getEditor().getEditorComponent();
setComponentTransparent(editor);
editor.setBackground(null);
}
else {
final ListCellRenderer renderer = combo.getRenderer();
ListCellRenderer newrenderer = new ListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected,
boolean cellHasFocus) {
Component comp = renderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
setComponentTransparent(comp);
return comp;
}
};
combo.setRenderer(newrenderer);
}
}
if ( comp instanceof JComponent ) {
JComponent component = (JComponent) comp;
component.setOpaque(false);
for(Component child : component.getComponents()) {
setComponentTransparent(child);
}
}
}
public static void main(String[] args) {
try {
Image image = ImageIO.read(new File("C:/Users/Joël/Pictures/suricate.png")); // exemple d'image
createFrame(image, 0,0,200,200,false, true);
createFrame(image, 201,0,200,200,true, true);
createFrame(image, 0,201,200,200,false, false);
createFrame(image, 201,201,200,200,true, false);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void createFrame(Image image, int x, int y, int width, int height,
boolean mosaic, boolean opaque) {
StringBuilder title = new StringBuilder();
if ( mosaic ) {
title.append("Mosaique");
}
else {
title.append("Plein écran");
}
title.append(", composants ");
if ( opaque ) {
title.append("opaques");
}
else {
title.append("transparents");
}
JFrame frame = new JFrame(title.toString());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent background = new ImageBackground(image, mosaic, opaque);
frame.getContentPane().add(background);
createContent(background);
frame.setBounds(x, y, width, height);
frame.setVisible(true);
}
private static void createContent(JComponent parent) {
parent.setLayout(new GridLayout(0, 2));
createField(parent, "Field 1");
createField(parent, "Field 2");
createCombo(parent, "Field 3", true, "Truc", "Bidule", "Machin");
createCombo(parent, "Field 4", false, "Ceci", "Cela");
}
private static JComponent createField(JComponent parent, String label) {
parent.add(new JLabel(label));
JComponent component = new JTextField();
parent.add(component);
return component;
}
private static JComponent createCombo(JComponent parent, String label,boolean editable,
String...values) {
parent.add(new JLabel(label));
JComboBox<String> component = new JComboBox<>(values);
component.setEditable(editable);
parent.add(component);
return component;
}
} |