N ° 1 Translucide JInternalFrame
Création d'un composant translucide est plus impliqué alors que la mise en la couleur de fond à une valeur en fonction alpha. Swing ne sait peindre que des composants opaques ou totalement transparents, l'API est également optimisée de telle sorte que si elle met à jour un composant opaque, elle ne mettra pas à jour la zone du parent derrière le composant. L'utilisation d'une couleur alpha générera toutes sortes d'artefacts de peinture désagréables
Au lieu de cela, vous devez "simuler". Cela implique la mise en composant à PRÉPONDÉRANTS complètement les composants méthode paint
et en utilisant un AlphaComposite
pour générer l'effet translucide (normalement j'utiliser la méthode paintComponent
, mais vous devez vous rappeler que cela laisserait les composants enfants non atteints)
import java.awt.AlphaComposite;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JDesktopPane dp = new BackgroundDesktopPane();
BufferedImage img = ImageIO.read(new File("C:\\Users\\shane\\Dropbox\\Ponies\\SmallPony.png"));
TransparentInternalFrame iframe = new TransparentInternalFrame("Banana", true, true, true, true);
iframe.setLocation(10, 10);
iframe.add(new JLabel(new ImageIcon(img)));
iframe.pack();
iframe.setVisible(true);
dp.add(iframe);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(dp);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
public class TransparentInternalFrame extends JInternalFrame {
public TransparentInternalFrame() {
super();
}
public TransparentInternalFrame(String title) {
super(title);
}
public TransparentInternalFrame(String title, boolean resizable) {
super(title, resizable);
}
public TransparentInternalFrame(String title, boolean resizable, boolean closable) {
super(title, resizable, closable);
}
public TransparentInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable) {
super(title, resizable, closable, maximizable);
}
public TransparentInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable) {
super(title, resizable, closable, maximizable, iconifiable);
}
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(0.25f));
super.paint(g2d);
g2d.dispose();
}
}
public class BackgroundDesktopPane extends JDesktopPane {
private BufferedImage background;
public BackgroundDesktopPane() throws IOException {
background = ImageIO.read(new File("C:\\Users\\shane\\Dropbox\\Ponies\\800px-Rainbow_Dash_flying_past_1_S2E16.png"));
}
@Override
public Dimension getPreferredSize() {
return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (background != null) {
Graphics2D g2d = (Graphics2D) g.create();
int x = (getWidth() - background.getWidth())/2;
int y = (getHeight() - background.getHeight())/2;
g2d.drawImage(background, x, y, this);
g2d.dispose();
}
}
}
}
N ° 2 cliquez par ...
offrant la possibilité de cliquer sur les composants est beaucoup plus difficile et devient beaucoup plus difficile si vous ajoutez des composants qui prennent en charge les événements de souris. Les éléments suivants permettront aux événements de la souris de "tomber" sur le composant (attendez les cartes de trame), mais tout composant dans le cadre interne qui répond aux événements de la souris empêchera le fonctionnement.
public class TransparentInternalFrame extends JInternalFrame {
public TransparentInternalFrame() {
super();
setOpaque(false);
init();
}
public TransparentInternalFrame(String title) {
super(title);
setOpaque(false);
init();
}
public TransparentInternalFrame(String title, boolean resizable) {
super(title, resizable);
setOpaque(false);
init();
}
public TransparentInternalFrame(String title, boolean resizable, boolean closable) {
super(title, resizable, closable);
setOpaque(false);
init();
}
public TransparentInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable) {
super(title, resizable, closable, maximizable);
setOpaque(false);
init();
}
public TransparentInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable) {
super(title, resizable, closable, maximizable, iconifiable);
setOpaque(false);
init();
}
protected void init() {
MouseAdapter proxy = new MouseAdapter() {
protected void dispatchEventToParent(MouseEvent e) {
Container parent = getParent();
if (parent != null) {
e = SwingUtilities.convertMouseEvent(e.getComponent(), e, parent);
parent.dispatchEvent(e);
}
}
@Override
public void mouseMoved(MouseEvent e) {
dispatchEventToParent(e);
}
@Override
public void mouseDragged(MouseEvent e) {
dispatchEventToParent(e);
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
dispatchEventToParent(e);
}
@Override
public void mouseExited(MouseEvent e) {
dispatchEventToParent(e);
}
@Override
public void mouseEntered(MouseEvent e) {
dispatchEventToParent(e);
}
@Override
public void mouseReleased(MouseEvent e) {
dispatchEventToParent(e);
}
@Override
public void mousePressed(MouseEvent e) {
dispatchEventToParent(e);
}
@Override
public void mouseClicked(MouseEvent e) {
dispatchEventToParent(e);
}
};
addMouseListener(proxy);
addMouseMotionListener(proxy);
addMouseWheelListener(proxy);
}
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(0.25f));
super.paint(g2d);
g2d.dispose();
}
}
public class BackgroundDesktopPane extends JDesktopPane {
private BufferedImage background;
private List<Point> points;
public BackgroundDesktopPane() throws IOException {
points = new ArrayList<>(25);
background = ImageIO.read(new File("C:\\Users\\shane\\Dropbox\\Ponies\\800px-Rainbow_Dash_flying_past_1_S2E16.png"));
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
points.add(e.getPoint());
repaint();
}
});
}
@Override
public Dimension getPreferredSize() {
return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
if (background != null) {
int x = (getWidth() - background.getWidth())/2;
int y = (getHeight() - background.getHeight())/2;
g2d.drawImage(background, x, y, this);
}
g2d.setColor(Color.RED);
for (Point p : points) {
g2d.fillOval(p.x - 5, p.y - 5, 10, 10);
}
g2d.dispose();
}
}
Je compris cela. J'ai changé Color.RED à la nouvelle couleur (0,0,0,0) et ai dû ajouter également frame.setBackground (nouvelle couleur (0,0,0,0)); à la fin. J'espère que ça aide quelqu'un. – volican
En fait cette seule partie a fonctionné, elle est maintenant transparente mais je ne peux pas cliquer. – volican
C'est en fait une très mauvaise idée, Swing ne sait pas comment peindre des composants opaques qui ont une couleur transparente, à la place, vous devez "simuler", en rendant le composant transparent, puis en surchargeant sa méthode 'paintComponent' et en utilisant un 'AlphaComposite'. Ceci est encore compliqué par le fait que 'JInternalFrame' a un' JRootPane' et 'contentPane' qui sont aussi opaques – MadProgrammer