Tabelle farbig gestallten

Status
Nicht offen für weitere Antworten.

Vatar

Bekanntes Mitglied
Ich möchte in meiner Tabelle jede 2te Zeile (zwecks übersicht) leich farbig darstellen.

Dazu habe ich einen CellRenderer welcher von DefaultTableCellRenderer erbt und nutze die Methode setBackground(new Color(248, 215, 24)).

Das Problem ist jetzt das ich keine Möglichkeit habe eine Zeile direkt anzusprechen, er rendert entwerder alle Zellen oder keine farbig. Aber Spalten kann ich direkt ansprechen (will ich aber ned )

Ich hab mir das so gedacht: wenn ich die Zeilennummer(index) hab mach ich einfach % 2 und wenn das erg gerade ist dann soll er den Hintergrund farbig rendern.

Habs auch schon in/mit anderen Klassen versucht, komm aber einfach nicht weiter.

Thx
--Vatar
 
Auf die Gefahr hin, dass ich wiederhole, was du getan hast:

Code:
MyCellRenderer extends DefaultCellRenderer{
    ... blabla, Initialisierung etc ...

    Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
            super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column ); 
            // Der DefaultCellRenderer soll auch ein bisschen arbeiten :-)

            if ( (row % 2) = (column % 2) ){
                setBackground( Color.white );
            }
            else{
                setBackground( Color.black );
            }

            return this;
    }
}

Das wird (eingesetzt in die Tabelle) ein Schachbrett erzeugen.

mfg Beni
 
kann es sein, dass du
Code:
if ( (row % 2) == (column % 2) ){
meinst :wink:

Na dann schlag ich doch mal ne Kurzform vor 🙂

Code:
setBackground( (row % 2) == (column % 2) ? Color.WHITE : Color.BLACK );
 
Danke, genau was ich wollte.

Hab nicht gewusst dass ich diese Methode überschreiben muss.

Da du dich mit Tabellen ja anscheinend recht gut auskennst hät ich da mal noch ne frage:
Und zwar, wenn ich eine Tabelle in eine JScrollPane, welche mittels GridBagLayout positioniert wurde, packe dann und mein Fenster dann kleiner als die ScrollPane mache wird das ganze dann auf icongröße minimiert?? :evil:
Er soll dann aber einfach seine Scrollleisten setzen.
Nutze ich kein GridBagLayout passiert das nicht, aber dafür werden nur vertikale Scrollbalken gesetzt(wenn zu klein), horizontal aber nicht (wenn alle Zellen Text enthallten) ???:L

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class MyTable extends JFrame
{


    MyTable ()
    {
        buildGUI();
    }

    private void buildGUI()
    {
        setSize(700, 500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        getContentPane().setLayout(new GridBagLayout());

        JTable table = new JTable ();

        DefaultTableModel tableModel = new DefaultTableModel ();

        tableModel.addColumn("Name");
        tableModel.addColumn("Vorname");
        tableModel.addColumn("Alter");
        tableModel.addColumn("Gehalt");

        table.setModel(tableModel);

        //table.setPreferredScrollableViewportSize(new Dimension(500, 100));
        table.setMinimumSize(new Dimension (100, 50));
        table.setMaximumSize(new Dimension (600, 300));
        table.setPreferredScrollableViewportSize(new Dimension(400, 200));


        JScrollPane scrollPane = new JScrollPane ();
        scrollPane.setViewportView(table);
        scrollPane.setAutoscrolls(false);


        tableModel.addRow(new Object [] {"Ey", "Birgit", "21", "0"});
        tableModel.addRow(new Object [] {"Fritz", "Andrea", "20", "100"});
        tableModel.addRow(new Object [] {"Podlesny", "Gregor", "23", "1300"});

        getContentPane().add(scrollPane, new GridBagConstraints(0, 0, 0, 0, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets (15, 15, 0, 0), 0, 0));
        this.setVisible(true);


    }// endmethod


    public static void main (String [] args)
    {
        MyTable m_ref = new MyTable ();
    }

}// endclass

Thx (wieder mal) Vatar
 
Zuerst mal zum Icon. Das Problem kommt daher, dass Du dem Table via GridBagConstraints width = 0 und height = 0 zuordnest (Im Gitter des GridBagLayouts). Ausserdem muss man noch sagen, wie sich das Table anpassen darf. Bei Dir stand NONE, d.h. gar nicht.

Code:
getContentPane().add(scrollPane, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets (15, 15, 0, 0), 0, 0));


Die horizontalen Scrollbars kannst Du erzwingen, indem du folgendes einfügst:
Code:
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );

Das Ergebnis ist leider nicht gerade überzeugend (weil das Table nun auch nicht mehr reagiert, wenn es mehr Platz bekommt).
Du kannst natürlich die Methode reshape des SrollPanes überschreiben, und dort, abhängig von der Grösse, den autoResizeMode ein- und ausschalten. :wink:

Code:
final JTable table = new JTable();

...

JScrollPane scrollPane = new JScrollPane (){
  /**
  * @deprecated Ein Listener wäre natürlich schöner als dieser Hack.
  */
  public void reshape( int x, int y, int w, int h ){
    table.setAutoResizeMode( w > 300 ? JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS : JTable.AUTO_RESIZE_OFF );
    super.reshape( x, y, w, h );
  }
};

mfg Beni
 
Noch ne Frage 😳 (aber ne neue)

Aber vorher nochmal Danke, die Sache mitm Gridi funzt jetzt 8)

Jetzt habe ich aber ein kleines größenproblem.
Ich habe in meinem Frame 2 ScrollPanes (jeweils eine eigene Tabelle darin). Nun habe ich zuerst die Größe mittels
Code:
vehicleScroll.setPreferredSize(vehicleTable_ref.getPreferredSize());
gesezt, war aber mit dem Ergebnis nicht ganz zufrieden und wollte deshalb eine Begrenzung für die Maximale Größe der ScrollPane setzten
Code:
vehicleScroll.setMaximumSize(new Dimension (300, 200));
diese Zeile scheint ihn aber in keinster Weise zu Interessieren (ich kann die ScrollPane auch auf 700 x 800 Pixel hochziehen ???:L ???:L
 
Ich geh mal davon aus, dass Du jetzt das GridBagLayout benutzt.

ks.gif

Wenn man die Beschreibung zum GBL liest, steht da:
In addition to its constraints object, the GridBagLayout also considers each component's minimum and preferred sizes in order to determine a component's size.

Und wenn man noch den Quellcode des GBL's betrachtet, indem nicht einmal ein Aufruf von getMaximumSize() zu finden ist, liegt die Vermutung nahe, dass deine Interpretation richtig ist: es interessiert ihn in keinster Weise :wink:

mfg Beni
 
So und noch ne Frage.

Für meine zweite Tabelle will ich nicht mit einem TableModel sondern mit einem ColumnModel arbeiten

Code:
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;

/**
 * Created by IntelliJ IDEA.
 * User: schlmay8
 * Date: 10.02.2004
 * Time: 09:30:38
 * To change this template use Options | File Templates.
 */
public class MyTableColumnModel extends DefaultTableColumnModel
{
    protected TableColumn column_1 = new TableColumn(0);
    protected TableColumn column_2 = new TableColumn(1);
    private CellRenderer cellRenderer = new CellRenderer ();

    protected MyTableColumnModel ()
    {
        super();
        setPropertiesColumn_1();
        setPropertiesColumn_2();

        addColumn(column_1);
        addColumn(column_2);

    }// end constructor



    private void setPropertiesColumn_1 ()
    {
        column_1.setCellRenderer(cellRenderer);
        column_1.setHeaderValue("Hallo");
        column_1.setResizable(false);
        column_1.setWidth(200);
    }


    private void setPropertiesColumn_2 ()
    {
        column_2.setCellRenderer(cellRenderer);
        column_2.setHeaderValue("Hallo2");
        column_2.setResizable(false);
        column_2.setWidth(300);
    }


}// end class

Jetzt weis ich aber nicht wie ich Werte in die Spalten bringe?
Ich denke das funktioniert ähnlich dem DefaultTableModel, bei dem erst die Zeilen hinzugefügt werden und zum schluss das tablemodel der tabelle hinzugefügt wird.

Ich finde aber keine methoden setValue(Object o) oder ähnliches und ein wenn ich dass ColumnModel gleichzeitig mit dem TableModel verwende nutzt er das TableModel, aber nicht das ColumnModel (da der CellRenderer nicht genutzt wird)

??????

Sorry für die vielen Fragen aber ich hock nun schon ein paar Tage an diesem Tabellenproblem und find mich einfach nicht so richtig zurecht.

thx
Vatar
 
Das kennst Du?
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

Das ColumnModel speichert die Anordnung der Columns.
Das TableModel speichert den Inhalt der Columns.
Und die Columns selber sind nur eine Ansammlung von Indices und einem Titel, sie kennen ihren Inhalt nicht.

Ich hab das Ganze ausprobiert, folgendermassen:
Zuerst ein TableModel mit 2 Kolonnen dem JTable übergeben.
Danach das MyTableColumnModel dem JTable übergeben.

Und starten, die Daten wurden aus dem TableModel genommen, aber der CellRenderer stammte aus dem ColumnModel.

Übersehe ich da ein Problem?

Gruss Beni
 
genauso hat ich das ja auch schon probiert aber da pinselt er mir einen weißen Bildschirm (also irgendwas macht er.

Außerdem muss ich erst das ColumnModel setzen, da ich sonst eine NullPointerException bekomme.
Hab auch mal sicherheitshalber meinen CellRenderer aus dem ColumnModel genommen , nützt aber auch nix.

Trotzdem vielen Dank für deine Hilfe
 
Das kann's ja wohl nicht sein. Irgendwo ist hier doch ein Wurm versteckt.

Vergleich mal: Hast du etwa dasselbe gemacht? Der Code funktioniert bei mir einwandfrei.

Code:
package testing;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableTest extends JFrame
{

    public TableTest (){
        buildGUI();
    }

    private void buildGUI(){
        setSize(700, 500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        getContentPane().setLayout(new GridBagLayout());

        final JTable table = new JTable ();

        DefaultTableModel tableModel = new DefaultTableModel ();

        tableModel.addColumn("Name");
        tableModel.addColumn("Vorname");
        tableModel.addColumn("Alter");

        table.setModel(tableModel);

        //table.setPreferredScrollableViewportSize(new Dimension(500, 100));
        table.setMinimumSize(new Dimension (100, 50));
        table.setMaximumSize(new Dimension (600, 300));
        table.setPreferredScrollableViewportSize(new Dimension(400, 200));

        table.setColumnModel( new MyTableColumnModel() );

        JScrollPane scrollPane = new JScrollPane (){
          /**
           * @deprecated Ein Listener wäre natürlich noch schöner, als dieser Hack.
           */
          public void reshape( int x, int y, int w, int h ){
            table.setAutoResizeMode( w > 300 ? JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS : JTable.AUTO_RESIZE_OFF );
            super.reshape( x, y, w, h );
          }
        };
        scrollPane.setViewportView(table);
    //    scrollPane.setAutoscrolls(false);


        tableModel.addRow(new Object [] {"Ey", "Birgit", "21"});
        tableModel.addRow(new Object [] {"Fritz", "Andrea", "56"});
        tableModel.addRow(new Object [] {"Podlesny", "Gregor", "54"});

        getContentPane().add(scrollPane, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets (15, 15, 0, 0), 0, 0));
        this.setVisible(true);


    }// endmethod


    public static void main (String [] args)
    {
        TableTest m_ref = new TableTest ();
    }
}// endclass

class TableRenderer extends JLabel implements TableCellRenderer{
  public TableRenderer(){

  }
  public Component getTableCellRendererComponent(JTable table, Object value, boolean a, boolean b, int row, int column){
    setText( " -!- " + value.toString() );
    return this;
  }
}

class MyTableColumnModel extends DefaultTableColumnModel
{
    protected TableColumn column_1 = new TableColumn(0);
    protected TableColumn column_2 = new TableColumn(1);
    private TableRenderer cellRenderer = new TableRenderer ();

    protected MyTableColumnModel ()
    {
        super();
        setPropertiesColumn_1();
        setPropertiesColumn_2();

        addColumn(column_1);
        addColumn(column_2);

    }// end constructor



    private void setPropertiesColumn_1 ()
    {
        column_1.setCellRenderer(cellRenderer);
        column_1.setHeaderValue("Hallo");
        column_1.setResizable(false);
        column_1.setWidth(200);
    }


    private void setPropertiesColumn_2 ()
    {
        column_2.setCellRenderer(cellRenderer);
        column_2.setHeaderValue("Hallo2");
        column_2.setResizable(false);
        column_2.setWidth(300);
    }


}// end class

Das kanns't du in eine Datei werfen.

Gruss Beni.
 
funktioniert!!!
ich hab tableModel.addColumn("bla") vergessen, da ich dachte das übernimmt das ColumnModel


Danke, Danke.


*fleisig weiterlesend*
-- Vatar
 
Ist doch schön wenn die Leute glücklich werden. Für das ist dieses Forum doch da. :wink:

Gruss Beni 8)
 
So jetzt hab ich noch ein Problem.
Ich will noch eine dritte Tabell einfügen bei der die letzte Spalte nur true/false annehmen kann und er mir dafür eine CheckBox erstellen soll...das macht er auch, aber dafür ist meine farbige darstellung (der geneigte leser einnert sich: jede zweite zeile gelb) nicht mehr ok. Er setzt meinen eigenen CellRederer nur noch bei der 1ten und 3ten Spalte ein ???

Code:
package classes.tables.examinationTable;

import classes.GUI;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import java.util.Vector;
import java.util.Enumeration;

public class ExaminationTable extends JTable
{
	private ExaminationCellRenderer cellRenderer = new ExaminationCellRenderer();
    private DefaultTableModel tableModel;
   	private Vector data = new Vector ();
	private Enumeration iterator;


	public ExaminationTable ()
	{

	}// end constructor


	public void changeTable (String fahrgestell)
	{
		try{
			tableModel = new DefaultTableModel();

			tableModel.addColumn("Typ");
			tableModel.addColumn("Datum");
			tableModel.addColumn("Bemerkung");
			tableModel.addColumn("Erledigt");

			data = GUI.db_ref.getHU(fahrgestell);
			iterator = data.elements();
			while (iterator.hasMoreElements())
			{
				tableModel.addRow((Vector)iterator.nextElement());
			}// endwhile
			data = GUI.db_ref.getZP(fahrgestell);
			iterator = data.elements();
			while (iterator.hasMoreElements())
			{
				tableModel.addRow((Vector)iterator.nextElement());
			}// endwhile
			data = GUI.db_ref.getAU(fahrgestell);
			iterator = data.elements();
			while (iterator.hasMoreElements())
			{
				tableModel.addRow((Vector)iterator.nextElement());
			}// endwhile
			data = GUI.db_ref.getUVV(fahrgestell);
			iterator = data.elements();
			while (iterator.hasMoreElements())
			{
				tableModel.addRow((Vector)iterator.nextElement());
			}// endwhile

            setModel(tableModel);
			setDefaultRenderer(getColumnClass(0), cellRenderer);
		}catch(Exception e) {}
	}// endmethod



	/**
	 * creates a JCheckBox if the Cellvalue is true or false
	 * @param c
	 * @return
	 */
	public Class getColumnClass(int c)
	{
            return getValueAt(0, c).getClass();
    }// endmethod

}// end class






package classes.tables.examinationTable;

import java.awt.*;
import java.sql.Date;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;

/**
 *
 */
class ExaminationCellRenderer extends DefaultTableCellRenderer
{
    /**
     * Überschriebene Methode von {@link javax.swing.table.DefaultTableCellRenderer}
     * @param table
     * @param value
     * @param isSelected
     * @param hasFocus
     * @param row
     * @param column
     * @return
     */
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
            super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );

            if ( (row % 2) == 0 ){

                setBackground( new Color(248, 215, 24) );
            }
            else
                setBackground(Color.WHITE);


	       	return this;
    }// end method getTableCellRenderer

}// end class

hoffe ihr könnt mir helfen

Thx


EDIT:
Wenn ich im examinationTabel den DefaultCellRenderer für jede Spalte setzte ignoriert er die 3te und 4te Spalte.
Code:
setDefaultRenderer(getColumnClass(0), cellRenderer);
setDefaultRenderer(getColumnClass(1), cellRenderer);
setDefaultRenderer(getColumnClass(2), cellRenderer);
setDefaultRenderer(getColumnClass(3), cellRenderer);

Die letzten beiden Zeilen kann ich auch löschen, da sie irgenwie nicht beachtet werden.
- Hab ich nur die erste Zeile, so werden 1te und 3te Spalte korrekt dargestellt.
- Füge ich auch die zweite hinzu, so sind 1te, 2te und 3te Spalte korrekt
- Füge ich die dritte hinzu passiert nix (also noch alles im Lot)
- Füge ich auch der letzten Spalte explizit meinen Renderer zu, so hat die Spalte immer noch den Standard Renderer ( CheckBoxen gezeichnet)

zeichne ich keine Checkboxen so genügt eine zuweisung des CellRenderers zur ersten Spalte und es werden alle Spalten korrekt dargestellt
 
Ich habe immer noch keine Lösung gefunden.
Wenn ich eine finde poste ich sie, aber bis dahin bin ich über jeden Tipp dankbar

Thx
Vatar
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben