【问题标题】:Java SWT Button Image Not RefreshingJava SWT 按钮图像不刷新
【发布时间】:2012-12-07 09:51:17
【问题描述】:

我在一个按钮中显示一个图像,当单击该按钮时,它会打开一个合成,允许我选择另一张图片用于该按钮。在保存操作后,下面的代码会调整图片大小并将其保存到目录中。然后它加载重新加载复合材料。当复合加载时,按钮会根据用户正在查看的记录的 ID 从默认位置拉取其图像。我遇到的问题是按钮上的图像保持不变,除非我关闭并重新加载应用程序。需要注意的一件有趣的事情是,当加载默认按钮图像时(即没有为其 id 保存图片),按钮图像会按应有的方式更改,但只是第一次。 希望我已经足够清楚地描述了我的问题,如果您需要我澄清,请发表评论。

--- 保存按钮代码 --

Button btnSave = new Button(this, SWT.NONE);
    btnSave.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            String path = txtPhotoPath.getText();
            if (CC_Files.fileExists(path)) {
                ArrayList<String> picTypes = new ArrayList<String>();
                picTypes.add(".jpg");
                picTypes.add(".png");
                picTypes.add(".gif");
                int t = 0;

                for(int i = 0; i < picTypes.size(); i++){
                    String s = picTypes.get(i);
                    if(path.contains(s.toUpperCase())){
                        t++;
                    }
                    if(path.contains(s.toLowerCase())){
                        t++;
                    }
                }
                if (t > 0) {
                    Image image = (Image) SWTResourceManager.getImage(path);
                    ImageData imgData = image.getImageData();
                    int intH = image.getBounds().height;
                    int intW = image.getBounds().width;
                    int h = (150 * intH) / intW;
                    int w = 150;
                    if (h > 150){
                        h = 150;
                        w = (150 * intW) / intH;
                    }
                    imgData = imgData.scaledTo(w, h);
                    ImageLoader imageLoader = new ImageLoader();
                    imageLoader.data = new ImageData[] { imgData };
                    imageLoader.save(Variables.getStrResources()
                            + "Pics\\" + a.getHerd_id() + ".jpg",
                            SWT.IMAGE_JPEG);
                    try {
                        Frm_Animal.setAnimalEditSC(Frm_Animal
                                .createAnimalComp(a));
                    } catch (Exception e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
            }
        }
    });
    GridData gd_btnSave = new GridData(SWT.LEFT, SWT.CENTER, false, false,
            1, 1);
    gd_btnSave.widthHint = 60;
    btnSave.setLayoutData(gd_btnSave);
    btnSave.setText("Save");

---在复合中创建按钮的代码---

Button btnPic = new Button(composite, SWT.CENTER);

    btnPic.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            try {
                Comp_Add_Photo photo = new Comp_Add_Photo(
                        scrolledComposite, SWT.FILL, a);
                setAnimalEditSC(photo);

            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    });

    Image image = null;
    String strPic = Variables.getStrResources() + "Pics\\" + a.getHerd_id() +".jpg";
    if(CC_Files.fileExists(strPic)){
        image = (Image) SWTResourceManager
                .getImage(strPic);
    }else {
    image = (Image) SWTResourceManager
            .getImage(Variables.getStrResources() + "black_cow.png");
    }

    btnPic.setImage(image);

    btnPic.setToolTipText("Click Here To Add Photo");
    GridData gd_btnPic = new GridData(SWT.CENTER, SWT.CENTER, false, false,
            1, 7);
    gd_btnPic.heightHint = 160;
    gd_btnPic.widthHint = 160;
    btnPic.setLayoutData(gd_btnPic);

【问题讨论】:

    标签: java image button swt


    【解决方案1】:

    我认为这可能是因为您使用的是SWTResourceManager,并且它必须具有某种缓存。由于图像的路径保持不变,因此它返回旧图像。 SWTResourceManager 属于哪个 API?它可以在重新加载新图像之前处理单个图像吗?也许打电话给SWTResourceManager#dipose()。我希望有一些方法可以清除特定图像的缓存。

    【讨论】:

    • 好电话! HereSWTResourceManager 的来源。它是 WindowBuilder 的一部分。然而,没有办法清除单个图像的缓存条目。但是,由于这个类是在项目中创建的,所以手动实现这样的方法真的很容易......
    • 2 个问题 A:我可以做一个 SWTResourceManager 的实例,然后处理它以清除它的缓存吗? B:如果不是,我将如何手动制作缓存清除方法?谢谢
    • 我知道我添加了 SWTResourceManager.dispose();之前图像 = (图像) SWTResourceManager.getImage(strPic);这将清除 SWTResourceManager 缓存。感谢您为我指明正确的方向。
    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    相关资源
    最近更新 更多