Java 重新绘制JPanel并更新屏幕

Java 重新绘制JPanel并更新屏幕,java,swing,Java,Swing,我正试图用一根线让一个JPanel褪色。实际上那不是褪色,而是他通过改变rgb值逐渐将颜色由白色变为黑色​​. public class MostraPainel { public static void main(String[] args) { JFrame jf = new JFrame(); jf.setSize(500, 500); // Centraliza jf.setLocationRelativeTo(n

我正试图用一根线让一个JPanel褪色。实际上那不是褪色,而是他通过改变rgb值逐渐将颜色由白色变为黑色​​.

public class MostraPainel {

    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setSize(500, 500);
        // Centraliza
        jf.setLocationRelativeTo(null);
        Painel painel = new Painel();
        jf.setContentPane(painel);
        jf.setVisible(true);
        new Thread(painel).start();

    }
}
所以我想按照我设置的间隔重新绘制面板,看看panel类

public class Painel extends JPanel implements Runnable {
    // alt+s
    /**
     * Create the panel.
     */
    int cont = 0;

    public Painel() {
        setBackground(Color.BLACK);

    }

    @Override
    protected void paintComponent(Graphics g) {
        if (cont == 1)
            super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;

        // System.out.println(cont);
        g2.setColor(new Color(cont, cont, cont));
        int w = getWidth() - 1;
        int h = getHeight() - 1;
        int widthQ = w / 8;
        int heightQ = h / 8;
        int size = 0;
        int cont = 0;
        for (int j = heightQ; j < getHeight(); j += (2 * heightQ)) {

            for (int i = size; i < getWidth(); i += (2 * widthQ)) {
                if (cont == 0)
                    g2.fillRect(i + widthQ, 0, widthQ, heightQ);
                g2.fillRect(i + widthQ, j + heightQ, widthQ, heightQ);
                g2.fillRect(i, j, widthQ, heightQ);
            }
            cont++;
        }

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        this.cont++;
        for (cont = 0; cont < 255; cont++) {

            if (this.cont < 255) {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                this.repaint();
            }
        }

    }

}

因此,paintComponent方法在面板上绘制一个图像,该方法运行repaint并将1和cont变量相加。这实际上是可行的,但屏幕不会在每次执行重绘时更新,因此淡入淡出的FPS较低。如果我继续调整屏幕大小,淡入效果会很好,有什么问题吗?

我通过添加这一行来解决问题

Toolkit.getDefaultToolkit().sync();

感谢您的帮助

要更快地获得更好的帮助,请发布或。如果cont不==1,您可能会阻止调用super的paintComponent方法,您不应该这样做,因为这样做会阻止JPanel自己进行内部绘制和擦除。除了极少数例外,super的方法应该始终在重写中调用。