Icons in JTable per ResultSet

superping

Aktives Mitglied
Hallo zusammen!

Wie bekomme ich unterschiedliche Icons, abhängig vom ResultSet, in eine JTable?

Ich habe eine Tabelle in der, je nach Bedingung, 4 unterschiedliche Icons dargestellt werden sollen. Unter Umständen auch gleichzeitig. Sind zb 3 Bedingungen erfüllt, sollen auch 3 Icons angezeigt werden.

Das ganze möchte ich über ein ResultSet steuern.

Hier der Renderer:

Java:
import java.awt.Component;

import javax.swing.ImageIcon;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class TableRenderer extends DefaultTableCellRenderer {

  public Component getTableCellRendererComponent(JTable table, Object value,
                                                 boolean isSelected, boolean hasFocus, 
                                                 int row, int column) 
 {

    setText((String)value);
    return this;
    
  }
}

So hatte ich mir das eigentlich gedacht:

Java:
...

final TableRenderer tableRen;

public Main()
    {
     tableRen = new TableRenderer();

...

              @Override
               public void actionPerformed (ActionEvent evt)
               {

               ImageIcon icon_1 = new ImageIcon (Main.class.getResource ("fix.png"));
               ImageIcon icon_2 = new ImageIcon (Main.class.getResource ("adr.png"));
               
               Touren.tresults.clear();
               
               tourWindow = new JDialog(fensterNeu,"Touren Liste", false);
               tourWindow.setLayout(null);
               
               tourWindow.add(toPanel.getTourPanelConnection());
               toPanel.setTourPanelConnection(true);
               tourWindow.setBounds(10,40,1005,675);
               tourWindow.setVisible(true);
               
               Query dbTouren = new Query();
                ResultSet rsTouren = dbTouren.ReturnQuery("select * from touren");

                try
                            {
                while(rsTouren.next())
                {
                    
                        int f_jn = 0;
                        int a_jn = 0;
                        int s_jn = 0;
                        int z_jn = 0;

                        f_jn = rsTouren.getInt("fixjn");
                        a_jn = rsTouren.getInt("adrJN");
                        s_jn = rsTouren.getInt("schiffJN");
                        z_jn = rsTouren.getInt("zollJN");

                        Touren.tourTable.getColumnModel().getColumn(0).setCellRenderer(tableRen);

                        if (f_jn == 1)
                        {
                            tableRen.setIcon(icon_1);
                            
                        }
                        else
                        {
                            tableRen.setIcon(null);
                        }
                        
                        if (a_jn == 1)
                        {
                            tableRen.setIcon(icon_2);
                            
                        }
                        else
                        {
                            tableRen.setIcon(null);
                        }

....

Bin für jeden Tipp dankbar!
 
Zuletzt bearbeitet:
Wenn du die Icons IN der Tabelle haben willst, musst du den TableCellRenderer überschreiben und dann in der Spalte, wo das Icon hin soll, eben nicht den Wert in die Tabellenzelle schreiben, sondern das Icon dort hinein rendern.
 
Das habe ich soweit hinbekommen. Jetzt werden JLabel & Icon in der Cell angezeigt.

Java:
import java.awt.Component;
 
import javax.swing.ImageIcon;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
 
public class TableRenderer extends DefaultTableCellRenderer {
 
  public Component getTableCellRendererComponent(JTable table, Object value,
                                                 boolean isSelected, boolean hasFocus, 
                                                 int row, int column) 
 {
 
    if(value instanceof JLabel) 
           {
                return (JLabel)value;
            }    
            else if(value instanceof String)
            { 
                setIcon( null );   
                setVerticalTextPosition(SwingConstants.BOTTOM);
                setText(String.valueOf(value)); 
            }
    
  }
}

Aufruf:

Java:
while(rsTouren.next())
                {
...
                 JLabel j = new JLabel(tab_tr_nr,icon_1,SwingConstants.CENTER);
                 j.setVerticalTextPosition(JLabel.CENTER);
                 Touren.tourTable.setValueAt(j, cnt, 0);

Leider habe ich jetzt das Problem, dass der Text des Labels immer neben dem Icon zu sehen ist. Die Höhe des Icons legt offensichtlich die Grösse des JLabels fest. Mit VerticalTextPosition steht der Text immer noch neben dem Icon. Zwar etwas nach unten versetzt, aber daneben.

Wie kann ich den Text unter das Icon setzen?

Habe sowohl beim Aufruf als auch beim Renderer versucht ihm eine Grösse zu geben (setSize, SetBounds, setLayout, etc...). Nichts funktioniert.
 
Hmmm...

Das mit

Java:
          JLabel j = new JLabel(tab_tr_nr,icon_2,JLabel.CENTER);

funkioniert nicht. Der Text steht immer noch neben dem Icon. ;(
 
Es nützt nichts. Es will einfach nicht. Es liegt offensichtlich am Synthetica L&F. Entsprechende workarounds von Synthetica haben auch nicht hingehauen. Ich schliesse das Thema besser.

Trotzdem Danke euch!
 
Zuletzt bearbeitet:

Zurück
Oben