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é : image Lorsque setBackground n'est pas commenté : image2

Author: orkun, 2017-01-19

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...

Écran

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);
        }

    }

}
 0
Author: MadProgrammer, 2017-01-19 08:51:41