3

ボタンに画像を表示しています。ボタンをクリックするとコンポジットが開き、ボタンに使用する別の画像を選択できます。保存アクションの際、以下のコードは画像のサイズを変更し、ディレクトリに保存します。次に、コンポジットをリロードします。コンポジットがロードされると、ボタンは、ユーザーが表示しているレコードの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);
4

1 に答える 1

4

おそらくあなたが使っているからだと思います、SWTResourceManagerそしてそれはある種のキャッシュを持っているに違いありません。画像のパスは同じままなので、古い画像を返します。どのAPIがSWTResourceManager属しますか?新しいイメージをリロードする前に、単一のイメージを破棄できますか?おそらく、のようなものを呼び出しますSWTResourceManager#dipose()。特定の画像のキャッシュをクリアする方法があることを願っています。

于 2012-12-20T11:28:30.740 に答える