Images in TableHeader (von JTable)



  • Hi,

    ich versuche gerade ein kleines Image in die Tabellenüberschriften zu kriegen, was sich als äußerst "schwierig" erweist. Im Web habe ich zwar ein Beispiel gefunden, das angeblich dieses Problem lösen soll, allerdings konnte ich das nicht verifizieren.

    Hat jemand von Euch eine Idee?

    P.S: Die Webseite die ich gefunden hatte: http://www.esus.com/javaindex/j2se/jdk1.2/javaxswing/editableatomiccontrols/jtable/jtableimagesheader.html



  • Hier die Lösung: (für die die es Interessiert)

    [java]
    import javax.swing.;
    import javax.swing.table.
    ;

    public class MyTable extends JTable {
    /** If model changes, we have to set the header renderers.
    */
    public void setModel(TableModel model) {
    super.setModel(model);

    // One renderer for each column
    TableColumn tc;
    for(int i=0; i<model.getColumnCount(); i++) {
    tc = this.getColumnModel().getColumn(0);
    if(tc!=null)
    {
    tc.setHeaderRenderer(new TableHeadRenderer("/printer.gif"));
    }
    }
    }

    public static void main(String args[]) {
    JFrame frame = new JFrame("Deneme");
    MyTable table = new MyTable();
    table.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] {{new Boolean(false), null, new Integer(0)} }, new String [] {"", "Name", "Alter"}) {
    Class[] types = new Class [] {
    java.lang.Boolean.class, java.lang.String.class, java.lang.Integer.class
    };
    boolean[] canEdit = new boolean [] {
    true, true, true
    };

    public Class getColumnClass(int columnIndex) {
    return types [columnIndex];
    }

    public boolean isCellEditable(int rowIndex, int columnIndex) {
    return canEdit [columnIndex];
    }
    });

    frame.getContentPane().add(new javax.swing.JScrollPane(table));
    frame.setSize(300, 200);
    frame.show();
    }
    }

    ----------------------------------

    import javax.swing.;
    import javax.swing.table.
    ;
    import java.awt.Component;

    class TableHeadRenderer extends JButton implements TableCellRenderer {

    public static ImageIcon icon = null;
    public static ImageIcon nullIcon = null;

    /** Creates a renderer to paint a table column's header and initializes
    * the static image variables the first time an instance is created.
    */
    public TableHeadRenderer(String pathToIcon) {
    super();

    // Table headers ALWAYS display the text centered, therefor we can
    // set this property already in the constructor.
    this.setHorizontalAlignment(JLabel.CENTER);

    // If icon is not loaded, use ImageLoader to load image-icon.
    if(icon==null) {
    icon = new javax.swing.ImageIcon(getClass().getResource(pathToIcon));
    }
    }

    /** Returns a configured component, which will be used to paint the table
    * header.
    */
    public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

    // Try to set default fore- and background colors
    if(table!=null) {
    JTableHeader header = table.getTableHeader();
    if(header!=null) {
    setForeground(header.getForeground());
    setBackground(header.getBackground());
    setFont(header.getFont());
    }
    }

    // Set header text
    String columnTitle = (value==null) ? "" : value.toString();
    this.setText( columnTitle );

    // set normal border
    setBorder(UIManager.getBorder("TableHeader.cellBorder"));

    this.setIcon(icon);

    return this;
    }
    }[/code]



  • Sorry, dass wir dir nicht weiterhelfen konnten. Ich bin ja schon froh, wenn ich die Spaltenbreite richtig setzen kann images/smiles/icon_wink.gif

    Naja, aber das wird noch... hoffe ich mal images/smiles/icon_rolleyes.gif

    Übrigends, die Seite zu der dein Link oben hinführt ist echt sehr gut!

    bis denn
    Stefan



  • Macht nichts images/smiles/icon_smile.gif

    Dies Fördert die Eigeninitiative, oder? images/smiles/icon_wink.gif



  • @Ste.fun

    Du könntest mal den Code posten der die Breite der Spalten fest definiert - wäre dir verbunden images/smiles/icon_wink.gif



  • ...bitte am Besten gleich mit hier rein - da beides keine kleinen und seltenen Probleme sind kommt das dann gleich in die FAQ. Thx schon mal!



  • Hallo zusammen!

    Hier ist der Code... hoffentlich war's das, was ihr gemeint habt images/smiles/icon_smile.gif :

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.table.*;
    
    ////////////////////////////////////////////////////////////////////////////////
    //  CLASS: TableDemo
    ////////////////////////////////////////////////////////////////////////////////
    /**
     * In dieser Klasse wird gezeigt, wie man eine Tabelle (<code>JTable</code> ) in
     * ein Frame einbindet und die Spaltenbreiten setzt. Die Klasse ist von
     * <code>JFrame</code> abgeleitet und implementiert <code>ActionListener</code>.
     */
    public class TableDemo extends JFrame implements ActionListener
    {
    ////////////////////////////////////////////////////////////////////////////////
    //  PRIVATE CLASS ATTRIBUTES
    ////////////////////////////////////////////////////////////////////////////////
    /**
     * schließt das Frame
     */
    private JButton okButton = new JButton("Schließen");
    /**
     * Die Spaltennamen
     */
    private String[] columnNames = {"Vorname","Zuname","Alter","Beruf"};
    /**
     * Der Inhalt der Tabelle
     */
    private String[][] data = {{"Paul","Müller","25","Student"},
                              {"Peter","Meier","45","Energieelektroniker"},
                              {"Frank","Kaiser","56","Frührentner"},
                              {"Heinz","Fröhlich","28","Sozialhilfeempfänger"},
                              {"Kerstin","Straus","16","Schülerin"}};
    /**
     * Die Tabelle
     */
    private JTable myTable = new JTable(data,columnNames);
    
    ////////////////////////////////////////////////////////////////////////////////
    //  CONSTRUCTOR
    ////////////////////////////////////////////////////////////////////////////////
    /**
     * Der Konstruktor setzt die Eigenschaften des Frames und führt sämtliche
     * Methoden der Klasse aus.
     */
    public TableDemo()
    {
      setSize(300,200);
      getContentPane().setLayout(new BorderLayout());
      getContentPane().add(new JLabel("MyTableDemo"), BorderLayout.NORTH);
      getContentPane().add(new JScrollPane(myTable), BorderLayout.CENTER);
      getContentPane().add(okButton, BorderLayout.SOUTH);
      // Damit das JScrollPane überhaupt funktioniert, muss AUTO_RESIZE auf OFF
      // gesetzt werden...
      myTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
      setTableColumnSize();
      setVisible(true);
      okButton.addActionListener(this);
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    //  setTableColumnSize
    ////////////////////////////////////////////////////////////////////////////////
    /**
     * Diese Methode setzt die Spaltengrößen der Tabelle
     */
    private void setTableColumnSize()
    {
      TableColumn column = null;
      // Wir springen durch alle vorhandenen Spalten
      for(int i = 0; i < myTable.getColumnCount(); i++)
      {
        column = myTable.getColumnModel().getColumn(i);
    
        // Hier wird die Standardgröße der Spalte gesetzt. Wird die Tabelle
        // beim Programmstart angezeigt, hat jede Spalte eine Größe von 100
        column.setPreferredWidth(100);
    
        // Mit diesem Aufruf bestimmt man die maximale Größe einer Spalte
        column.setMaxWidth(150);
    
        // Mit diesem Aufruf bestimmt man die minimale Größe einer Spalte
        column.setMinWidth(50);
    
        // Will man dem Benutzer die Möglichkeit der Veränderung der Spaltenbreiten
        // vorenthalten, muss man einfach setResizeable auf false setzen.
        column.setResizable(true);
      }
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    //  actionPerformed
    ////////////////////////////////////////////////////////////////////////////////
    /**
     * Die Methode sorgt dafür, dass beim Betätigen des 'okButtons' das Programm
     * beendet wird.
     * @param e Das <code>ActionEvent</code>
     */
    public void actionPerformed(ActionEvent e)
    {
      if(okButton.getActionCommand().equals(e.getActionCommand()))
      {
        System.exit(0);
      }
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    // MAIN
    ////////////////////////////////////////////////////////////////////////////////
    /**
     * Die Main-Methode.
     * @param args Es müssen beim Programmstart keine Argumente übergeben werden!
     */
    public static void main(String[] args)
    {
      TableDemo tableDemo = new TableDemo();
    }
    
    }//class
    

    bis denn
    Stefan

    [ Dieser Beitrag wurde am 07.02.2002 um 01:06 Uhr von Ste.fun editiert. ]


Anmelden zum Antworten