2015-08-20 4 views
0

Я пытаюсь удвоить буфер прозрачным JWindow, однако кажется, что используемая техника не действует (разные значения цикла нарисованы друг над другом).Двойная буферизация с помощью 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); 
    } 

} 

ответ

1

Почему!?!? Компоненты Swing уже дважды буферизованы? Просто создайте пользовательский компонент, простирающийся от чего-то вроде JPanel, переопределите его paintComponent и выполните свою обычную картину. Убедитесь, что вы установите компонент, чтобы быть прозрачным (setOpaque(false)) и добавить к экземпляру JWindow

См Painting in AWT and Swing и Performing Custom Painting для более подробной информации.

Одна из неотложных проблем, с которой вы сталкиваетесь, заключается в том, что окна Swing имеют ряд составных компонентов, уже прикрепленных к ним (JRootPane, contentPane и т. Д.), Все из которых могут быть нарисованы независимо от вашего окна, что означает, что они может покрывать все, что вы пытались нарисовать непосредственно в окне. Вместо этого избегайте рисования непосредственно в окне и вместо этого используйте пользовательский компонент.

+0

Это не казалось двойным буфером. Измененный текст цикла пронизывает себя следующим образом: http://i.imgur.com/HSPLJ1v.png – Jire

+0

Вероятно, вы нарушили цепочку рисования и не смогли вызвать один или несколько методов суперкраски (как в вашем примере) – MadProgrammer

+0

Спасибо, я создал «JPanel» и переопределил «paintComponent» в этом, а затем установил его непрозрачным, а также установил фон на «ПРОЗРАЧНЫЙ». Прекрасно работает! – Jire

Смежные вопросы