2014-05-20 4 views
0

특정보기를 포함하는 RCP plugin project을 개발 중입니다. 우선보기 name, address 등의 직원 정보를 가져옵니다. 찾아보기 단추를 사용하여 직원 이미지를 업로드하는 옵션이 있습니다. 두 번째보기에는 첫 번째보기에 입력 한 세부 정보가 표시됩니다. 모두 사진 이외의 세부 사항은 잘 표시됩니다.RCP에서 볼 이미지를로드하는 방법?

사진 레이블 대신 빨간색 사각형이 표시됩니다. 사진을 설정하기위한 내 코드는 다음과 같습니다 : photoUploadPath 업로드 사진의 경로가 포함 된 문자열 변수가

Label photoLabel = new Label(parent, SWT.NONE); 
photoLabel.setBounds(420, 233, 100, 106);   

photoLabel.setImage(SWTResourceManager.getImage(FormDataViewClass.class,photoUploadPath)); 

입니다. 어떻게이 문제를 해결할 수 있습니까?

+0

경로가 절대 경로입니까? 'SWTResourceManager.getImage (...)'가 이미지 또는 null를 돌려 주는지? – Baz

+0

예. SWTResourceManager.getImage (...)는 Image {140719108178432} – Sana

+0

과 같은 이미지를 반환합니다. CLabel 클래스가 도움이 될 수 있습니다. 그것은 텍스트와 이미지를 설정할 수 있습니다. 몇 년 전에 저는 그것을 프로젝트에서 완벽하게 사용했습니다. – CHmoonKa

답변

1

다음 코드 세그먼트는 위의 문제를 해결하는 데 도움이되었습니다.

byte[] uploadedImg = null; 
try { 
    File f1 = new File(photoUploadPath); 
    double fileLen = f1.length(); 
    uploadedImg = new byte[(int) fileLen]; 
    FileInputStream inputStream = new FileInputStream(photoUploadPath); 
    int nRead = 0; 
    while ((nRead = inputStream.read(uploadedImg)) != -1) { 
    System.out.println("!!!!!!!!!!!!!!!!!" + new String(uploadedImg)); 
    } 
    inputStream.close(); 

} catch (Exception e2) { 
    // TODO: handle exception 
} 

BufferedInputStream inputStreamReader = new BufferedInputStream(new ByteArrayInputStream(uploadedImg)); 
ImageData imageData = new ImageData(inputStreamReader); 
Image image = new Image(Display.getCurrent(), imageData); 
photoLabel.setImage(image); 
+0

더 이상 필요하지 않을 때'Image'를'dispose()'하는 것을 잊지 마십시오. 그렇지 않으면 시스템 핸들이 누출됩니다. – Baz

0

RCP 앱의 경우 확장 가능한 솔루션을 사용합니다.

ImageCache 개체를 생성합니다.이 개체는 앱 수명주기의 시작 부분에서 (바람직하게는 앱의 Activator 클래스에서) 인스턴스화합니다.

ImageCache는 예를 들어, 플러그인 폴더가 있습니다 (이미지를 얻을 수 (물론, 그들을 캐시) 플러그인의 상대 경로에서 할 수 icons, 당신은 아이콘을 필요로 할 때 다음, 당신은 전화 Activator.getDefault().getImage("icons/random.png");-getDefault()Activator입니다 싱글 톤 인스턴스).

ImageCache 이들 두 유무 :

public ImageDescriptor getImageDescriptor(final String path) 
{ 
    ImageDescriptor imgD = AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, path); 

    if (imgD == null) 
    { 
     return null; // OR a "missing icon", e.g. a red flag 
    } 
} 

public Image getImage(final String path) 
{ 
    Image image = imageCacheMap.get(path); 

    if (image == null) 
    { 
     image = getImageDescripto(path).createImage(); 
     imageCacheMap.put(path, image); 
    } 

    return image; 
} 

이러한 이미지에 배치 될 필요가 있기 때문에을의 stop() 방법 불리는 ImageCache에있어서 dispose()Activator.

여기에는 여러 가지 방법이 있습니다. 내 의견으로는, 이것은 RCP 애플 리케이션을위한 최고의 하나입니다.

0

자바 SWT로드 및 이미지 크기 조정은보기 또는 편집기 동적으로

![enter image description here


버튼의 FileDialog 상자를 열려면 클릭하고에 표시 할 모든 이미지를 선택합니다 특정 라벨.

하여 ImageLoader 클래스에서 이미지를로드하고, 파일 또는 스트림

imageData의 클래스를 이미지를 저장하는 데 사용하는 이미지

SWT의 이미지 클래스의 장치 독립적 안내 GUI로 이미지를 표시하는 데 사용할 수 있습니다.

package rcp_demo.Editor; 

import org.eclipse.swt.widgets.FileDialog; 
import org.eclipse.swt.custom.CLabel; 
import org.eclipse.swt.graphics.Image; 
import org.eclipse.swt.graphics.ImageData; 
import org.eclipse.swt.graphics.ImageLoader; 


public class ProductEditor extends EditorPart { 

     public static final String ID="rcp_demo.Editor.product"; 
     private Text text; 
     private CLabel lbl_image_text; 

     private static final String[] FILTER_NAMES = { 
     "Images(*.jpg)","Images(*.jpeg)","Images(*.png)","All Files (*.*)"}; 

     // These filter extensions are used to filter which files are displayed. 
     private static final String[] FILTER_EXTS = { "*.jpg", "*.jpeg", "*.png", "*.*"}; 

    public void createPartControl(final Composite parent) { 

     parent.setLayout(null); 
     //Layout with absolute positioning components. 

     text = new Text(parent, SWT.BORDER); 
     text.setBounds(25, 57, 169, 19); 

     Button btnOpen = new Button(parent, SWT.NONE); 
     btnOpen.setText("open"); 
     btnOpen.addSelectionListener(new SelectionAdapter() { 
      @Override 
     public void widgetSelected(SelectionEvent e) { 

      FileDialog dialog = new FileDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.OPEN); 
      dialog.setFilterNames(FILTER_NAMES); 
      dialog.setFilterExtensions(FILTER_EXTS); 
      String result = dialog.open(); 
      if(result!=null) 
       { 
        text.setText(result); 
        Image image=SWTResourceManager.getImage(result); 
        ImageData imgData = image.getImageData(); 
        imgData=imgData.scaledTo(200, 200); 

        ImageLoader imageLoader = new ImageLoader(); 
        imageLoader.data = new ImageData[] {imgData}; 
        imageLoader.save(result, SWT.IMAGE_COPY); 

        System.out.println(imgData.width+"....."+imgData.height); 
        lbl_image_text.setBounds(25,88,imgData.width+10,imgData.height+10); 
        //Image size set to Label 
        //lbl_image_text.setBounds(25,88,image.getBounds().width+10,image.getBounds().height+10); 
        lbl_image_text.setImage(SWTResourceManager.getImage(result)); 
       } 
     } 
    }); 
    btnOpen.setText("open"); 
    lbl_image_text = new CLabel(parent, SWT.Resize); 
    } 
} 

CLabel 클래스는 Label 클래스에 대한 몇 가지 고급 기능을 제공합니다. 이 클래스는 텍스트 레이블과 이미지 레이블을 동시에 표시 할 수 있습니다.

lbl_image_text.setText("Welcome"); 
    lbl_image_text.setImage(SWTResourceManager.getImage("Image Path")); 
관련 문제