我有一个包含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?
答案 0 :(得分:0)
这完全正常,将您的功能移至JFrame
并调用repaint
函数将实际调用您的JFrame repaint
。
我认为最好的解决方案是将面板作为参数传递给fadeIn
和fadeOut
函数并调用其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();
}
通过它,您可以将效果应用于任何其他面板。 希望它有所帮助。