You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何监听使用Label展示图片的Container及功能改造技术问询

改造方案与代码实现

步骤1:定义数据模型类

先创建一个简单类封装图片名称和对应跳转URL,方便统一管理列表数据:

public class ImageItem {
    private String imageName;
    private String targetUrl;

    public ImageItem(String imageName, String targetUrl) {
        this.imageName = imageName;
        this.targetUrl = targetUrl;
    }

    // Getter方法
    public String getImageName() { return imageName; }
    public String getTargetUrl() { return targetUrl; }
}

步骤2:改造Imagenes类

替换Label为Button,实现自定义列表遍历、图片自动切换与点击跳转功能:

import com.codename1.ui.*;
import com.codename1.ui.events.ActionEvent;
import com.codename1.ui.transitions.CommonTransitions;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

public class Imagenes extends Container {
    private Resources datosMundial;
    private List<ImageItem> imageItems;
    private int currentIndex = 0;
    private Timer transitionTimer;

    public Imagenes(Resources datosMundial) {
        this.datosMundial = datosMundial;
        initImageItems();
        initUI();
        startAutoTransition();
    }

    // 初始化图片与URL列表,可根据实际需求修改
    private void initImageItems() {
        imageItems = new ArrayList<>();
        imageItems.add(new ImageItem("p.png", "https://example.com/page1"));
        imageItems.add(new ImageItem("p0.png", "https://example.com/page2"));
        imageItems.add(new ImageItem("p1.png", "https://example.com/page3"));
        // 继续添加其他图片和对应URL...
    }

    private void initUI() {
        this.setUIID("ImagenesContainer");
        Button initialBtn = createImageButton(imageItems.get(currentIndex));
        this.addComponent(initialBtn);
    }

    // 创建带图片和点击事件的Button
    private Button createImageButton(ImageItem item) {
        Button btn = new Button();
        btn.setIcon(datosMundial.getImage(item.getImageName()));
        btn.getStyle().setAlignment(Component.CENTER);
        btn.getAllStyles().setBorder(Border.createEmpty()); // 去掉按钮边框,模拟图片样式
        btn.getAllStyles().setBgTransparency(0); // 设置透明背景
        // 绑定点击跳转事件
        btn.addActionListener(e -> Display.getInstance().execute(item.getTargetUrl()));
        return btn;
    }

    // 启动自动切换定时器,避免阻塞UI线程
    private void startAutoTransition() {
        transitionTimer = new Timer();
        transitionTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                // 在事件调度线程中执行UI操作,保证线程安全
                Display.getInstance().callSerially(() -> switchImage());
            }
        }, 0, 5000); // 每5秒切换一次,可调整间隔时长
    }

    // 图片切换逻辑
    private void switchImage() {
        currentIndex = (currentIndex + 1) % imageItems.size();
        Button newBtn = createImageButton(imageItems.get(currentIndex));
        Component currentComponent = getComponentAt(0);
        // 随机选择过渡效果
        int transitionType = aleatorio(5);
        Transition transition = switch (transitionType) {
            case 1 -> CommonTransitions.createSlide(CommonTransitions.SLIDE_VERTICAL, true, 500);
            case 2 -> CommonTransitions.createCover(CommonTransitions.SLIDE_HORIZONTAL, true, 500);
            case 3 -> CommonTransitions.createFade(500);
            case 4 -> CommonTransitions.createCover(CommonTransitions.SLIDE_VERTICAL, true, 500);
            case 5 -> CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL, true, 500);
            default -> CommonTransitions.createFade(500);
        };
        replaceAndWait(currentComponent, newBtn, transition);
    }

    private int aleatorio(int x) {
        return new Random().nextInt(x) + 1;
    }

    // 容器销毁时停止定时器,避免内存泄漏
    @Override
    public void onRemoved() {
        super.onRemoved();
        if (transitionTimer != null) {
            transitionTimer.cancel();
        }
    }
}

关键改动说明

  • 数据管理:用ImageItem类统一封装图片名和URL,后续新增或修改数据只需调整列表,无需改动核心逻辑。
  • Button替换Label:Button自带交互能力,通过setIcon设置图片,去掉边框和背景后视觉效果与Label一致,同时支持点击事件。
  • UI线程安全:移除原代码中阻塞UI的while(true)死循环,改用Timer定时触发切换,通过callSerially确保UI操作在事件调度线程中执行。
  • URL跳转:使用Display.getInstance().execute(targetUrl)实现外部URL跳转,这是Codename One打开浏览器的标准方式。
  • 过渡优化:保留原随机过渡逻辑,缩短过渡时长至500ms(可按需调整),用switch表达式简化代码结构。
  • 内存优化:重写onRemoved方法停止定时器,防止容器销毁后定时器持续运行导致内存泄漏。

内容的提问来源于stack exchange,提问作者Rubén Villarreal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:01:00