我正在使用计时器在java中进行图像程序的幻灯片演示。 在计时器事件列表器中,我已将代码添加到chnage图像,但图像没有变化。 以下是我写的代码
class ImagePanel extends JPanel {
private Image backgroundImage;
public ImagePanel(Image backgroundImage) {
super();
this.backgroundImage = backgroundImage;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(this.backgroundImage, 0, 0, null);
}
}
public class A extends JFrame{
static int counter;
List<String> imagePaths;
int nimgpaths=0;
static A frame = new A();
public static void main(String[] args) {
frame.setSize(1024, 768);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getPath();
/* Getting required image */
Image backgroundImage = null;
String pathToTheImage = "C:\\Documents and Settings\\Administrator\\My Documents\\My Pictures\\civ1.JPG";
try {
backgroundImage = ImageIO.read(new File(pathToTheImage));
} catch (IOException e) {
e.printStackTrace();
}
/* Initializing panel with the our image */
ImagePanel panel = new ImagePanel(backgroundImage);
frame.getContentPane().add(panel);
frame.setVisible(true);
frame.timerEvent();
//frame.show();
}
public void timerEvent(){
Timer timer = new Timer(5000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Time event occured");
if(counter > nimgpaths)
counter=0;
String imgPath=imagePaths.get(counter);
Image backgroundImage = null;
try {
backgroundImage = ImageIO.read(new File(imgPath));
}catch (Exception e1) {
e1.printStackTrace();
}
/* Initializing panel with the our image */
frame.removeAll();
ImagePanel panel = new ImagePanel(backgroundImage);
panel.repaint();
//panel.setBackground(backgroundImage);
frame.getContentPane().add(panel);
}
});
timer.start();
}
// To get path of images
public void getPath(){
DbOps db=new DbOps();
imagePaths=db.getPath();
nimgpaths=imagePaths.size();
for(Iterator i=imagePaths.iterator();i.hasNext();){
System.out.println((String)i.next());
}
}
}
答案 0 :(得分:2)
为什么使用自定义面板和绘画?
您的代码只是将图像绘制为首选大小。使用JLabel时可以使用此功能。然后,当您使用标签时,您只需使用:
label.setIcon(....);
当您想要更改图像时。有关详细信息,请阅读How to Use Icons上的Swing教程中的部分。
创建自定义组件的唯一原因是您计划缩放图像或执行类似这样的操作。如果是这种情况,那么您可以使用支持缩放图像的Background Panel以及setImage()方法,以便您可以动态更改图像。
答案 1 :(得分:0)
更好的ImagePanel设计可以让您只更换图像,而不是删除组件。但是,如果你必须更换一个可见的组件,你必须在其容器上调用validate(),否则新的不会出现(大多数时候,无论如何)。我认为这是你的问题。
答案 2 :(得分:0)
frame.removeAll()没有按照您的预期进行操作 - 它正在从框架本身中删除组件,而不是从框架的内容窗格中删除组件。将计时器动作监听器末尾的代码更改为类似的东西来修复它:
ImagePanel panel = new ImagePanel(backgroundImage);
frame.getContentPane().removeAll();
frame.getContentPane().add(panel);
frame.getContentPane().invalidate();
frame.getContentPane().validate();
答案 3 :(得分:0)
你的概念本身是错误的。
您可以像这样刷新面板:
public void refreshPanel(JPanel panel){
panel.removeAll();
panel.invalidate();
panel.validate();
}
<强>问题:强>
我在您的代码中看到您正在尝试创建同一个面板的多个对象,您需要刷新它。
最好创建一个面板对象并刷新该对象。
ImagePanel panel = new ImagePanel(backgroundImage);
希望你能理解我想要解释的内容。
如果您仍然感到困惑,请告诉我。