Announcement

Collapse
No announcement yet.

Bilder von der Festplatte werden in JLIST nicht angezeigt (von URL schon)

Collapse
This topic is closed.
X
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Bilder von der Festplatte werden in JLIST nicht angezeigt (von URL schon)

    Hallo,

    ich habe ein relativ spezielles / interessantes problem. Ich habe eine JLIST. In der lasse ich aber anstatt Text JPanels anzeigen. Diese Panels beinhalten ein Bild (JLabel mit ImageIcon) und einen Text (JLabel). Die Bilder können entweder von der Festplatte, aus der JAR oder von einer URL stammen. Hierfür habe ich eine Methode geschrieben, die da Bild von der Entsprechenden Quelle läd und ein ImageIcon zurück liefert

    Code:
    	public ImageIcon loadPicture( String adress, int width, int height, String id, int option ) throws IOException {
    
    		ImageIcon icon = null;
    
    		switch ( option ) {
    			case 0:
    				icon = new ImageIcon( ImageIO.read( new File(adress) ));
    				break;	
    			case 3 :
    				icon = new ImageIcon( new URL( adress ) );
    				break;
    
    			case 4 :
    				icon = new ImageIcon( ImageIO.class.getResource( adress ) );
    				break;
    		}
    
    		icon.setImage( icon.getImage().getScaledInstance( width, height, Image.SCALE_DEFAULT ) );
    
    		return icon;
    	}
    Hier kann ich direkt anmerken, das diese Methode funktioniert und nicht der Grund für den Fehler sein kann. Die Bilder werden (egal von welcher Quelle) korrekt geladen.

    Da JPanel normalerweise ja nicht in der JList angezeigt werden, habe ich hierfür meinen eigenen CellRenderer geschrieben:

    Code:
    public class CastListRenderer extends CastPanel implements ListCellRenderer<CastPanel>{
    
    	@Override
    	public Component getListCellRendererComponent( JList<? extends CastPanel> list, CastPanel value, int index, boolean isSelected,
    													boolean cellHasFocus ) {
    
    		this.setCover( value.getCover() );
    		this.setActor( value.getActor() );
    		this.setName( value.getName() );
    		
            if (isSelected) {
            	 setBackground(UIManager.getColor("List.selectionBackground"));
            } else {
            	setBackground(UIManager.getColor( "Panel.background" ));
            }
    		
    		return this;
    	}
    
    
    	
    }
    Dieser soll mit hilfe von gettern und settern die Werte an die JList übergeben! Die Getter und Cetter stammen aus der CastPanel:

    Code:
    	/**
    	 * Setzt ein neues Cover
    	 * 
    	 * @param image
    	 *            Icon Cover
    	 */
    	public void setCover( Icon image ) {
    
    		coverLabel.setIcon( image );
    	}
    
    
    	/**
    	 * Liefert das Cover zurück
    	 * 
    	 * @return Icon Cover
    	 */
    	public Icon getCover() {
    
    		return coverLabel.getIcon();
    	}
    
    
    	/**
    	 * Setzt den Actor
    	 * 
    	 * @param actor
    	 *            String Actor
    	 * 
    	 */
    	public void setActor( String actor ) {
    
    		actorLabel.setText( actor );
    	}
    
    
    	/**
    	 * Liefert den Actor zurück
    	 * 
    	 * @return String Actor
    	 */
    	public String getActor() {
    
    		return actorLabel.getText();
    	}
    
    
    	/**
    	 * Setzt den Name
    	 * 
    	 * @param name
    	 *            String Name
    	 */
    	public void setName( String name ) {
    
    		nameLabel.setText( name );
    	}
    
    
    	/**
    	 * Liefert den Name zurück
    	 * 
    	 * @return String Name
    	 */
    	public String getName() {
    
    		return nameLabel.getText();
    	}
    Ihn diesem Codeteil wird ein neues Panel in die Liste eingefügt (Hinzufügen zum DefaultListModel):

    Code:
    			if(coverData.size() == 0){
    				icon = pictureHandler.loadPictureStatic( PictureHandler.NO_PROFILE, 120, 171 );
    			}else{
    				icon = pictureHandler.loadPicture(coverData.get( 0 ).get( "pictureId" ), 120, 171, row.get( "castId" ), PictureHandler.CAST_PROFILE );
    			}
    			
    			showFilmDialog.addCastListElement( new CastPanel(icon, row.get( "name" ), row.get( "role" ), row.get( "castId" )) );
    pictureHandler.loadPictureStatic() ruft Methode loadPicture(); und läd ein festgelegtes "Fehlerbild" aus der jar.

    Nun zu meinem Problem:
    Mein Programm gibt keinen Fehler und keine Exception aus. JPanel werden in der JList angezeigt. Auch der Text wird korrekt dargestellt. Die Bilder (ImageIcons im JLabel) werden nur angezeigt, wenn die Bildquelle eine URL oder mittels getRessource aus der Jar geladen werden. Stammt das Bild von der Festplatte wird nichts (bzw. wahrscheinlich das leere ImageIcon) angezeigt. Lade ich irgendein Bild (aus einer Datei) testweise Direkt im JPanel wird es in der JList korrekt angezeigt.
    Somit schließe ich das der Fehler iwo in der Übergabe des CellRenderes liegen muss. Aber ich verstehe nicht warum Bilder die von einer URL oder aus der JAR mittels getRessource() geladen werden korrekt angezeigt werden. Bilder die mit ImageIO und File geladen werden aber nicht. Im Grunde sind es ja alles nachher ImageIcons. Bisher konnte niemand einene Grund für diesen Fehler finden. Ich hoffe das hier nun jemand eine zündene Idee hat denn ich bin mit meinem latain am ende.

    Nochmal zusammengefasst:

    Panels werden in JList korrekt angezeigt. Stammt das Bild von einer URL oder wurde mittels getRessource aus der JAR geladen ist die Anzeige der bilder korrekt. Stammt es aus einer Bilddatei von der Festplatte wird zwar das Panel und der Text angezeigt, das Bild ist aber leer.

    Der Ladevorgang (loadPicture) funktioniert. Wird z.B. ein Bild normal in ein JLabel geladen (ohne cellrendere oder JList) wird es auch hier angezeigt. Problem ist somit JList+CellRenderer+Laden mittels ImageIO.read(File). Daher tippe ich auf Fehler hafte übergabe iwie (iwo) durch den CellRenderer.


    Irgendjemand eine Idee oder Tipp?

    Danke

    Gruß
    CrommCruach

  • #2
    ich habe ein relativ spezielles / interessantes problem.
    Ja, wie letzte Mal -> Crossposting
    http://www.java-forum.org/awt-swing-...s-fuellen.html
    geschlossen
    Christian

    Comment

    Working...
    X