重新绘制而不再绘制每个组件

时间:2015-05-08 11:20:27

标签: java swing

我有一个包含jframe的应用程序,然后这个jframe添加一个jpanel来构建一个图像。 jpanel显示给定时间,然后从jframe中删除,并添加另一个jpanel。

我想在图像之间淡入淡出,并且我已经使用计时器

完成了这项工作
private void fadeOut() {
    ActionListener fadeOutAc = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            opacity += 10;
            if (opacity >= 255) {
                opacity = 255;
                fadeOutT.stop();

            }
            repaint();
        }
    };

    fadeOutT = new Timer(20, fadeOutAc);
    fadeOutT.start();
}

private void fadeIn() {
    ActionListener fadeInAc = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            opacity -= 10;
            if (opacity <= 0) {
                opacity = 0;
                fadeInT.stop();
            }
            repaint();

        }
    };
    fadeInT = new Timer(10, fadeInAc);
    fadeInT.setInitialDelay(200);
    fadeInT.start();

}

public void paint(Graphics g) {
    super.paintComponent(g);
    g.setColor(new Color(picColor.getRed(), picColor.getGreen(), picColor.getBlue(), opacity));
    g.fillRect(0, 0, presWin.getWidth(), presWin.getHeight());
}

我最近将jpanel的淡入/淡出移到了jframe。问题是,在jpanel中,重绘只需要绘制一个图像,现在它必须每次重绘整个jpanel。有没有办法在没有绘制组件的情况下调用重绘,只有rectangel?

1 个答案:

答案 0 :(得分:0)

这完全正常,将您的功能移至JFrame并调用repaint函数将实际调用您的JFrame repaint

我认为最好的解决方案是将面板作为参数传递给fadeInfadeOut函数并调用其repaint方法,例如fadeIn:

private void fadeIn(JPanel panelParam) {
    ActionListener fadeInAc = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            opacity -= 10;
            if (opacity <= 0) {
                opacity = 0;
                fadeInT.stop();
            }
            panelParam.repaint(); // here call repaint of the panel.

        }
    };
    fadeInT = new Timer(10, fadeInAc);
    fadeInT.setInitialDelay(200);
    fadeInT.start();

}

通过它,您可以将效果应用于任何其他面板。 希望它有所帮助。