2015-08-20 1 views
0

J'essaye de doubler un tampon transparent JWindow mais il semble que la technique utilisée ne prenne aucun effet (différentes valeurs de cycle sont dessinées les unes sur les autres).Double buffering avec un JWindow

public final class Overlay extends JWindow { 

    public static final Color TRANSPARENT = new Color(0, true); 
    public static Font standardFont = null; 

    public static Overlay open() { 
     return new Overlay(); 
    } 

    private Overlay() { 
     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     setAlwaysOnTop(true); 
     setBounds(0, 0, screenSize.width, screenSize.height); 
     setBackground(TRANSPARENT); 
    } 

    @Override 
    public void paint(Graphics g) { 
     BufferedImage bufferedImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_4BYTE_ABGR); 
     Graphics2D g2d = bufferedImage.createGraphics(); 
     paintUs(g2d); 

     Graphics2D g2dComponent = (Graphics2D) g; 
     g2dComponent.drawImage(bufferedImage, null, 0, 0); 
    } 

    private void paintUs(Graphics2D g) { 
     int height = 420; 
     int x = 20; 
     g.setColor(TRANSPARENT); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     g.setFont(standardFont == null ? standardFont = g.getFont().deriveFont(17f) : standardFont); 
     for (Plugin plugin : Abendigo.plugins()) { 
      g.setColor(Abendigo.plugins().isEnabled(plugin) ? Color.GREEN : Color.RED); 
      g.drawString(plugin.toString(), x + 5, getHeight() - height); 
      height += 20; 
     } 
     height += 20; 
     g.setColor(Color.YELLOW); 
     g.drawString("Cycle: " + Abendigo.elapsed + "ms", x, getHeight() - height); 
    } 

    @Override 
    public void update(Graphics g) { 
     paint(g); 
    } 

} 

Répondre

1

Pourquoi!?!? Les composants Swing sont déjà à double tampon? Simple créer un composant personnalisé, s'étendant à partir de quelque chose comme JPanel, remplacer paintComponent et y effectuer votre peinture personnalisée. Assurez-vous de définir le composant à être transparent (setOpaque(false)) et ajouter à une instance de JWindow

Voir Painting in AWT and Swing et Performing Custom Painting pour plus de détails. L'un des problèmes immédiats auxquels vous êtes confrontés est le fait que les fenêtres Swing ont déjà une série de composants composés (JRootPane, contentPane, etc.), qui peuvent tous être peints indépendamment de votre fenêtre, ce qui signifie qu'ils peut couvrir ce que vous avez essayé de peindre directement à la fenêtre. Au lieu de cela, évitez de peindre directement dans la fenêtre et utilisez plutôt un composant personnalisé.

+0

Il ne semblait pas double tamponné. Le texte du cycle de changement se passe comme suit: http://i.imgur.com/HSPLJ1v.png – Jire

+0

Probablement, vous avez brisé la chaîne de peinture et avez échoué à appeler une ou plusieurs des méthodes de peinture super (comme dans votre exemple – MadProgrammer

+0

Merci, j'ai créé un 'JPanel' et remplacé le' paintComponent' dans cela, puis le mettre à opaque ainsi que de définir son arrière-plan à 'TRANSPARENT'. Fonctionne très bien! – Jire