Java 如何根据时间进行一次JLabel更改

Java 如何根据时间进行一次JLabel更改,java,timer,jlabel,Java,Timer,Jlabel,我已经研究了两天如何使用swing定时器了,我想知道如何改变我JFrame中心的图像。到目前为止,我的程序运行正常,但图像并没有改变我想要的方式。这个类只是用作测试,所以它可能没有正确的java语法 package hauntedHouseAdventure; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;

我已经研究了两天如何使用swing定时器了,我想知道如何改变我JFrame中心的图像。到目前为止,我的程序运行正常,但图像并没有改变我想要的方式。这个类只是用作测试,所以它可能没有正确的java语法

    package hauntedHouseAdventure;

import java.awt.BorderLayout;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.IOException;

    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.Timer;

public class timertest {
    static JFrame sceneOne = new JFrame();
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub


    ImageIcon image = new ImageIcon(
            "/Users/computerscience2/Desktop/dark-forest-night-image.jpg");
    JLabel imageLabel = new JLabel("", image, JLabel.CENTER);
    JPanel panel = new JPanel(new BorderLayout());
    panel.add(imageLabel, BorderLayout.NORTH);
    sceneOne.add(panel);
    sceneOne.setResizable(false);
    imageLabel.setVisible(true);
    sceneOne.pack();

    JButton leave=new JButton("Leave");
    JButton stay= new JButton ("Stay");
    leave.addActionListener(new ActionListener(){

        public void actionPerformed(ActionEvent e)
        {
            //Execute when button is pressed
            sceneOne.setVisible(false);
        }
    });      
    stay.addActionListener(new ActionListener(){

        public void actionPerformed(ActionEvent f)
        {
            //Execute when button is pressed
           sceneOne.setVisible(false);
        }
    });      

    panel.add(leave, BorderLayout.EAST);
    panel.add(stay, BorderLayout.WEST);


    JLabel label1 = new JLabel("Test");

    label1.setText("<html><font color='red'> It was approximately 11:30 pm. The night sky was black not a single star piercing through the darkness"
            + "except the thick and powerful moonlight."
            + "<br>"
            + "You are alone leaving a costume party at a friend's place."
            + "It was rather boring and you decided to leave early."
            + "A stutter is heard and your"
            + "<br>"
            + "car begins to shake"
            + "Your headlights and car lights crack. The engine is left dead silent."
            + "You are left in a total silence"
            + "and baked in merely the moonlight."
            + "<br>"
            + "There is a mere second of silence till a harsh chill ripes through the"
            + "car like a bullet through paper. You are left dumbfounded. What do you do?</font><html>");
    label1.setHorizontalAlignment(JLabel.CENTER);
    label1.setVerticalAlignment(JLabel.BOTTOM);
    label1.setVisible(true);
    label1.setOpaque(false);

  panel.add(label1); 

  final ActionListener updater = new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent event) {

          ImageIcon image = new ImageIcon(
                  "/Users/computerscience2/Desktop/image-slider-5.jpg");
          JLabel imageLabel = new JLabel("", image, JLabel.CENTER);
          JPanel panel = new JPanel(new BorderLayout());
          panel.add(imageLabel, BorderLayout.NORTH);
          sceneOne.add(panel);

          }
  };



  Timer timer = new Timer(1000, updater);

  timer.start();





  sceneOne.setSize(2000,1000);
    sceneOne.setTitle("The Car");
    sceneOne.setVisible(true);
    sceneOne.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    sceneOne.setLocation(250, 200);
}
包鬼屋探险;
导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.io.IOException;
导入javax.swing.ImageIcon;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类时间测试{
静态JFrame sceneOne=新JFrame();
公共静态void main(字符串[]args)引发IOException{
//TODO自动生成的方法存根
ImageIcon image=新的ImageIcon(
“/Users/computerscience2/Desktop/dark forest night image.jpg”);
JLabel imageLabel=新的JLabel(“”,图像,JLabel.CENTER);
JPanel panel=newjpanel(newborderlayout());
面板。添加(图像标签,边框布局。北);
sceneOne.add(面板);
sceneOne.SetResizeable(假);
imageLabel.setVisible(true);
sceneOne.pack();
JButton leave=新JButton(“leave”);
JButton stay=新JButton(“stay”);
leave.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e)
{
//按下按钮时执行
sceneOne.setVisible(假);
}
});      
stay.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件f)
{
//按下按钮时执行
sceneOne.setVisible(假);
}
});      
面板。添加(左,边界布局。东);
面板。添加(停留,边界布局。西部);
JLabel label1=新的JLabel(“测试”);
label1.setText(“当时大约是晚上11:30,夜空是黑色的,没有一颗星星穿过黑暗。”
+“除了浓浓的月光。”
+“
” +“你独自一人在朋友家参加化装舞会。” +“太无聊了,你决定早点走。” +“听到口吃声,你的声音” +“
” +“汽车开始摇晃” +“你的车头灯和车灯都裂了。发动机完全没有声音。” +“你完全沉默不语” +“只在月光下烤。” +“
” +“只有一秒钟的沉默,直到刺骨的寒意划破整个房间” +“汽车就像一颗子弹穿过纸张。你目瞪口呆。你怎么办?”; 标签1.设置水平对齐(JLabel.中心); 标签1.设置垂直对齐(标签底部); label1.setVisible(真); 标签1.设置不透明(假); 面板。添加(标签1); 最终ActionListener更新程序=新ActionListener(){ @凌驾 已执行的公共无效操作(操作事件){ ImageIcon image=新的ImageIcon( “/Users/computerscience2/Desktop/image-slider-5.jpg”); JLabel imageLabel=新的JLabel(“”,图像,JLabel.CENTER); JPanel panel=newjpanel(newborderlayout()); 面板。添加(图像标签,边框布局。北); sceneOne.add(面板); } }; 定时器=新定时器(1000,更新程序); timer.start(); 场景设置大小(20001000); sceneOne.setTitle(“汽车”); sceneOne.setVisible(真); sceneOne.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 场景设置位置(250200); }

}

我没有详细查看,但要更改标签上的图像,则无需创建新控件,只需更改现有控件上的图像即可

  public void actionPerformed(ActionEvent event) {

      ImageIcon image = new ImageIcon(
              "/Users/computerscience2/Desktop/image-slider-5.jpg");
      imageLabel.setIcon(image);

  }

您还需要将imageLabel设置为成员变量或final,以便
actionPerformed
方法可以看到它。

我在代码中看到两个问题

  • 您正在将新图像添加到面板中,但没有删除旧图像
  • 您并没有告诉您的框架您的组件已更改,他需要重新绘制
  • 我认为最好的方法就是改变图像标签的图标。像这样:

    final JLabel imageLabel = new JLabel("", image, JLabel.CENTER);
    ......
    final ActionListener updater = new ActionListener() {
    
       public void actionPerformed(ActionEvent e) {
          ImageIcon image = new ImageIcon("/Users/computerscience2/Desktop/image-slider-5.jpg");
          imageLabel.setIcon(image);
          imageLabel.updateUI(); //Tell to your frame he needs to redraw the image
       }
    };
    

    您仍然没有遵循Java命名约定<代码>变量名称不应以大写字符开头。自上次提醒此主题以来,您有两周的时间来修复代码:
    该类只是用作测试,因此它可能没有正确的java语法
    ——即使对于测试类,也绝对没有理由不遵循标准。Namining约定应该是自然的,您使用它们的次数越多,它们就越自然<代码>如果您想让我们阅读您的代码,然后按照约定进行操作,就这么简单。camickr,我理解您的沮丧,但我陷入了困境。我实际上已经采纳了上一个程序中的命名建议。然而,我无法使用它,因为我的主计算机上的eclipse出现故障。我确实有旧版本并复制粘贴了它。使用定时计算机,我不希望通过整个程序来修复它。事实上,我已经重新安装了eclipse和我的JRE,并将立即修复这个问题的语法。我的道歉和建议是正确的。