Java, JFrame transparent sous toile
J'essaie d'implémenter un JFrame
entièrement transpérant qui porte un objet Canvas
. J'ai essayé de rendre l'arrière-plan de JFrame
transparent en appelant frame.setBackground(new Color(0, 0, 0, 0));
mais d'une manière ou d'une autre Canvas
n'apparaît plus à l'écran et ne dessine pas mon rectangle. Cependant, si je commente la fonction setBackground
, elle dessine parfaitement, mais bien sûr le JFrame
n'est pas transparent.
canvas.setPreferredSize(new Dimension(800, 800));
frame = new JFrame(title);
frame.setSize(1000, 1000);
frame.setResizable(true);
frame.setUndecorated(true);
frame.add(canvas);
//frame.setBackground(new Color(0, 0, 0, 0));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.toFront();
La stratégie de tampon pour dessiner un rectangle bleu sur le Canevas.
public void render() {
BufferStrategy bs = this.getBufferStrategy();
if(bs == null){
createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
//////////////////////////////////////////////////
g.setColor(Color.BLUE);
g.fillRect(0,0,800,800);
//////////////////////////////////////////////////
g.dispose();
bs.show();
}
Lorsque setBackground
est commenté :
Lorsque setBackground
n'est pas commenté :
1 answers
Mais d'une manière ou d'une autre Canvas n'apparaît plus à l'écran et ne dessine pas mon rectangle
Je soupçonne qu'il se passe plus de choses dans votre code auquel nous avons accès, car il semble que je puisse le faire fonctionner...bizarrement...
Donc, cela met essentiellement en place une fenêtre translucide (pour les tests, je l'ai testé un alpha de 0
et cela fonctionne toujours), ajoute un Canvas
plus petit (pour que je puisse voir la fenêtre) et dessine et même un rectangle plus petit sur le dessus de cela.
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TestPane pane = new TestPane();
JFrame frame = new JFrame("Test");
frame.setLayout(new GridBagLayout());
frame.setSize(100, 100);
frame.setResizable(true);
frame.setUndecorated(true);
frame.add(pane);
frame.setBackground(new Color(255, 0, 0, 128));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.toFront();
Timer timer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
pane.render();
}
});
timer.start();
}
});
}
public class TestPane extends Canvas {
public void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
//////////////////////////////////////////////////
g.setColor(Color.BLUE);
g.fillRect(0, 0, 25, 25);
//////////////////////////////////////////////////
g.dispose();
bs.show();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
}
}