Domanda

Secondo il Javadoc, JComponent.repaint (lunga) dovrebbe pianificare un repaint () in futuro. Quando provo ad usarlo si innesca sempre un ridisegno immediato. Che cosa sto facendo di sbagliato?

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Repaint
{
  public static final boolean works = false;

      private static class CustomComponent extends JPanel
  {
    private float alpha = 0;

    @Override
    protected void paintComponent(Graphics g)
    {
      super.paintComponent(g);
      Graphics2D g2d = (Graphics2D) g;
      g2d.setComposite(
        AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
      g2d.setPaint(Color.BLACK);
      g2d.fillRect(0, 0, getWidth(), getHeight());
      alpha += 0.1;
      if (alpha > 1)
        alpha = 1;
      System.out.println("alpha=" + alpha);
      if (!works)
        repaint(1000);
    }
  }

  public static void main(String[] args)
  {
    final JFrame frame = new JFrame();
    frame.getContentPane().add(new CustomComponent());
    frame.setSize(800, 600);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setVisible(true);

    if (works)
    {
      new Timer(1000, new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
        {
          frame.repaint();
        }
      }).start();
    }
  }
}
È stato utile?

Soluzione

Si noti che il Javadoc dice che il metodo causerà un ridisegno accada nel (non dopo) il tempo specificato.

Altri suggerimenti

Se si desidera pianificare qualcosa di essere ridipinto, allora si dovrebbe essere utilizzando un timer Swing. Non si dovrebbe essere pianificando la pittura dal withing metodo paintComponnt (..). Non è possibile controllare quando il metodo paintComponent () viene chiamato.

Il parametro dice tm - tempo massimo in millisecondi prima aggiornare non dice che non lo farà immediatamente anche i javadocs dicono

  

Ridipinge il componente. Se questo   componente è un componente leggero,   questo si traduce in una chiamata per dipingere   in pochi millisecondi tm.

Se si cerca un po 'si scopre che questo parametro viene ignorato nelle classi derivate. ;)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top