【问题标题】:How to change Image being displayed by JLabel?如何更改 JLabel 显示的图像?
【发布时间】:2014-07-02 18:48:59
【问题描述】:

我目前正在编写视频游戏。我正在使用 Util.Timer 来跟踪游戏的多个功能,但我的问题之一是尝试在背景图像之间进行更改。我试图让 JPanel 每秒更新一个新图像,但到目前为止还没有运气。我使用 JLabel 在 JPanel 中显示图像。一秒钟后,我还会调用 displayFrame() 。所以现在我的问题是我如何能够每秒用新图像更新我的 JPanel?这是我的代码:

public static void displayFrame(){
    panel_1.setBounds(10, 11, 519, 614);
    ImageIcon image = changeFrame();
    JLabel label = new JLabel("", image, JLabel.CENTER);
    panel_1.add(label, BorderLayout.CENTER);
    frame.getContentPane().add(panel_1);
}

public static ImageIcon changeFrame(){
    if(frameCounter == 9){
        frameCounter = 1;
    }
    if(frameCounter == 1){
        frameCounter = 2;
        return new ImageIcon("Capture.PNG");
    }
    if(frameCounter == 2){
        frameCounter = 3;
        return new ImageIcon("Capture2.PNG");
    }
    if(frameCounter == 3){
        frameCounter = 4;
        return new ImageIcon("Capture3.PNG");
    }
    if(frameCounter == 4){
        frameCounter = 5;
        return new ImageIcon("Capture4.PNG");
    }
    if(frameCounter == 5){
        frameCounter = 6;
        return new ImageIcon("Capture5.PNG");
    }
    if(frameCounter == 6){
        frameCounter = 7;
        return new ImageIcon("Capture6.PNG");
    }
    if(frameCounter == 7){
        frameCounter = 8;
        return new ImageIcon("Capture7.PNG");
    }
    if(frameCounter == 8){
        frameCounter = 9;
        return new ImageIcon("Capture8.PNG");
    }
    if(frameCounter == 9){
        frameCounter = 1;
        return new ImageIcon("Capture9.PNG");
    }
    return new ImageIcon("Capture.PNG");
    }

【问题讨论】:

    标签: java swing timer jpanel jlabel


    【解决方案1】:

    我正在使用 Util.Timer

    不要使用 Util.Timer。您应该使用Swing Timer 来确保对 GUI 的所有更新都在事件调度线程上完成。

    然后,当 Timer 触发时,您调用标签上的 setIcon(...) 方法来更改实际的图标。

    不要使用多个“if 语句”来控制显示哪个图像。如果您想拥有 100 张图像,这将是很多代码要输入。相反,我会将您的所有图像存储在一个 ArrayList 中。然后,您只需使用 ArrayList 的 get(...) 方法即可使用“frameCounter”变量获取要显示的图像。然后在下次触发 Timer 时更新计数器。

    另外,不要在你的类中使用静态方法。我建议你阅读 Swing 教程。那里发布的示例向您展示了如何更好地构建类中的代码。

    【讨论】:

    • 好的,感谢您提供有关 Swing Timer 的信息。我现在使用的是数组而不是 if 语句。尽管我尝试按照您的建议使用 setIcon 。我认为标签正在更新,但更改并未影响到 JFrame。这是我的更改代码:
    • int 延迟 = 1000; //毫秒 ActionListener taskPerformer = new ActionListener() { public void actionPerformed(ActionEvent evt) { displayFrame(); } }; new Timer(delay, taskPerformer).start();
    • public void displayFrame(){ panel_1.setBounds(10, 11, 519, 614); ImageIcon image = changeFrame();标签.setIcon(图像); panel_1.add(label, BorderLayout.CENTER); frame.getContentPane().add(panel_1); }
    • 我不确定如何在 cmets 中格式化我的代码以使其看起来更好。但感谢您到目前为止所提供的所有帮助!
    • @user2748943,用正确的SSCCE 更新您的问题,以证明您的问题。
    猜你喜欢
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2023-03-18
    相关资源
    最近更新 更多