[Java] JTable für Bilder und Texte

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von gateway_2_hell, 16. Oktober 2006 .

  1. 16. Oktober 2006
    JTable für Bilder und Texte

    Hallo,

    ich probiere gerade eine Klasse JTable zu erstellen, mit der ich sowohl Text als auch Bilder anzeigen kann.

    Vielleicht kann ja mal wer über meine Version von einer JTable gucken.
    Bis jetzt zeigt sie nämlich garnichts an.

    Außerdem will ich am Schluss noch per
    renderer.setHorizontalAlignment(SwingConstants.CENTER); die Elemtene zentrieren können.


    Was ich also brauche ist ein JTable, in dem ich sowohl Texte als auch Bilder zentriert anzeigen kann.



    Hier mein code:
    Code:
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class MyMixedTable extends JTable 
    {
    
     /* constructor */
     public MyMixedTable() 
     {
     super();
     setDefaultRenderer(Object.class, new MyButtonCellRenderer());
     /*...*/
     }
     
     /* inner class */
     public class MyButtonCellRenderer extends JButton implements TableCellRenderer 
     {
     
     public Component getTableCellRendererComponent(JTable table,
     Object value,
     boolean isSelected,
     boolean hasFocus,
     int row, int column) 
     {
     
     setBorder(BorderFactory.createEmptyBorder());
     setFocusPainted(false);
     if ( value.getClass().getName().equals("String") ) {
     setText( (String)value );
     }
     if ( value.getClass().getName().equals("Image") ) {
     setIcon(new ImageIcon((Image)value));
     }
     return this;
     }
     }
    }
    


    Vielen Dank für jede Hilfe!


    greetz hell




    //edit
    Vielleicht kennt ihr ja auch noch eine bessere Vorgehensweise um Bilder und Texte in die JTable zu bekommen.
     
  2. 16. Oktober 2006
    AW: JTable für Bilder und Texte

    Ich weiss nicht ob du näher gesucht hast im Internet aber ich hab dir nen Link gefunden, der dir weiterhelfen könnte: http://www.jguru.com/faq/view.jsp?EID=703279

    Ausserdem:

    Code:
     ...
    
     setBorder(BorderFactory.createEmptyBorder());
     setFocusPainted(false);
     if ( [B]value instanceof String [/B]) {
     setText( (String)value );
     }
     if ( [B]value instanceof Image[/B] ) {
     setIcon(new ImageIcon((Image)value));
     }
     // Vielleicht ist diese Instanzierungsabfrage besser als über Stringvergleiche entscheiden.
    
     ...
    
     
  3. 16. Oktober 2006
    Zuletzt von einem Moderator bearbeitet: 15. April 2017
    AW: JTable für Bilder und Texte

    Also ich habs jetzt mal probiert.

    Meine ImageCellRenderer sieht jetzt so aus:

    Code:
    import java.awt.Component;
    import java.awt.Image;
    
    import javax.swing.ImageIcon;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
    
    public class ImageCellRenderer extends DefaultTableCellRenderer
    {
    
    
     public Component getTableCellRendererComponent(JTable table, Object value,
     boolean isSelected, boolean hasFocus, int row, int column) 
     {
     super.getTableCellRendererComponent(table, value, isSelected,
     hasFocus, row, column);
     
    
     Image image = (Image) value;
     this.setIcon(new ImageIcon( image ));
    
     
     
     return this;
     }
    }
    

    In meiner Main-Klasse gibt es die folgende Zuweisung:
    this.JTable1.setDefaultRenderer(Image.class, new ImageCellRenderer());


    Eigenltich sollte jetzt, wenn ein Image in der Tabelle steht, das Image gezeichnet werden. Aber es wird immer noch zusätzlich die toString() Methode von dem Image aufgerufen... Außerdem habe ich die Images in der ganzen Tabelle, sobald ich versuche in der Tabelle zu scrollen...
    Irgendwas passt da noch nicht.



    greetz hell




    // edit


    hier mal nen pic, damit ihr besser verstehen könnt, was ich meine! Habe probiert, das Google-Logo einzufügen.

    javattableimagesnd0.jpg
    {img-src: //imageshack.us/a/img214/9414/javattableimagesnd0.jpg}
     
  4. 17. Oktober 2006
    AW: JTable für Bilder und Texte

    Meiner Meinung nach (habs nicht ausprobiert) solltest du bei

    super.getTableCellRendererComponent(table, value, isSelected,
    hasFocus, row, column);

    value nicht übergeben, da dies ja ein Image ist. Es wird dann wahrscheinlich die .toString()-Methode aufgerufen. Übergib doch stattdessen "" oder vielleicht wirft null nicht mal ne exception.

    Aber eben, dies ist nur ne annahme von mir. hab länger nicht mehr damit gearbeitet.

    *EDIT*

    So wie ich das oben beschrieben habe kannst du nachher allerdings keinen Text mehr in der Tabelle haben.

    Versuchs mal so:

    Code:
    import java.awt.Component;
    import java.awt.Image;
    
    import javax.swing.ImageIcon;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
    
    public class ImageCellRenderer extends DefaultTableCellRenderer
    {
    
    
     public Component getTableCellRendererComponent(JTable table, Object value,
     boolean isSelected, boolean hasFocus, int row, int column) 
     {
     if(value instanceof Image) 
     {
     Component dtcrc = super.getTableCellRendererComponent(table, "", isSelected,
     hasFocus, row, column); 
    
     Image image = (Image) value;
     ((JLabel) dtcrc).setIcon(new ImageIcon( image ));
     
     return dtcrc;
     }
     else
     return super.getTableCellRendererComponent(table, value, isSelected,
     hasFocus, row, column); 
     }
     
  5. 17. Oktober 2006
    AW: JTable für Bilder und Texte

    Hey!

    Danke, dass du mir so super hilfst Kriegst erstma ne Bewertung

    Also mit deinem ImageCellRenderer läuft das ganze schon um einiges besser. Jetzt wird auch nur das Bild angezeigt, ohne die toString()-Ausgabe.
    Nur komischerweise sind die Bilder in beiden Spalten.

    Spalte 0 ist bei mir die Textspalte und Spalte 1 soll nur Bilder darstellen.
    Ich schreibe also:

    this.JTable1.setDefaultRenderer(this.JTable1.getColumnClass(1), new ImageCellRenderer());

    Aber komischerweise sind die Bilder dann immernoch in beiden Spalten der JTable, so wie auf meinem ersten Screenshot. Ist mein setDefaultRenderer-Befehl denn richtig? Denn selbst wenn ich statt 1 eine 0 für die 1. Spalte eingebe, werden die Bilder überall gezeichnet.... Da mach ich wohl noch was falsch...

    Vielen Dank für deine Hilfe!
    hell



    //edit ^^

    Jetzt endlich hab ichs rausgefunden

    Code:
    if ( iShouldDisplayIcon) {
     setIcon(myImageIcon);
    }
    else {
     setIcon(null);
    }
    
    
    
    setting the icon to null is very important, otherwise all cells will display the icon. This is because, the same renderer is used for each cell. It draws the label then moves onto the next cell, so if the label contains an image it will draw it.
    This will explain why renderer works for the whole column and not an individual cell.
    
    Quelle: http://forum.java.sun.com/thread.jspa?threadID=166751&messageID=504725


    Ich meld mich wieder, falls ich doch nicht weiterkommen sollte
     
  6. 17. Oktober 2006
    AW: JTable für Bilder und Texte

    was das funktioniert? :tongue:
    Hätte ich nicht gedacht.

    Würde sonst wahrscheinlich auch mit

    this.JTable1.getColumnModel().getColumn(1).setCellRenderer(new ImageCellRenderer gehen);

    gehen

    dann legste den CellRenderer einfach auf die betroffene Spalte und nicht auf alle...

    (wiederum nicht getestet)

    *EDIT*
    Danke für Bewertung!
     
  7. 17. Oktober 2006
    Zuletzt von einem Moderator bearbeitet: 15. April 2017
    AW: JTable für Bilder und Texte

    Ja es geht

    Ich habe die Bilder in dem JTable jetzt auch noch skaliert.

    Für die Höhe der skalierten Bilder nehme ich die Höhe der Tabellenzeile und für die Breite die Originalbreite des Bildes.

    Code:
    try {
     dasbild = Toolkit.getDefaultToolkit().getImage(new URL("urldesbildes.jpeg"));
     } catch (MalformedURLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
     }
     
     Image dasbildscaled = dasbild.getScaledInstance(dasbild .getWidth(null), 60, Image.SCALE_SMOOTH);
     
     if(dascover != null)
     mp3_Verwaltung.tabmodel.setValueAt(dasbildscaled , row, 1);
    

    Aber komischerweise werden alle Bilder bis auf das erste skaliert. Weißte woran das liegt?

    Hier nen screeny:

    javatablaimageys2.jpg
    {img-src: //imageshack.us/a/img209/1020/javatablaimageys2.jpg}



    greetz hell


    //edit
    Ich weiß jetzt worans liegt. dasBild.getWidth(null); gibt -1 zurück und die Skalierung klappt nicht. Wahrscheinlich ist das Bild nicht geladen und darum kommt -1 zurück. Was kann ich da den tun... Hmm irgendwie solange warten, bis das Bild geladen ist oder?


    Ach das geht mit MediaTracker. Ich versuchts mal.
    Ja das klappt
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.