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
| 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;
if (!(comp instanceof JTextComponent)) {
component.setOpaque(false);
for (Component child : component.getComponents()) {
setComponentTransparent(child);
}
}
}
}
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;
}
} |
Partager