[Java] JTable row kleur probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mattie112
  • Registratie: Januari 2007
  • Laatst online: 16:15
Beste:

Ik heb het volgende probleem met een JTable:

Afbeeldingslocatie: http://upload.mattie-systems.nl/uploads/6613-capture.png

Ik wil graag dat als ik 1 cel selecteer dat dan de HELE row een kleur krijgt.
Zoals jullie zien pakt hij de 1e kolom niet :x

Ik zal even wat stukken source laten zien hoe ik de rij een kleur geef.

Het maken van de JTable:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        table = new JTable();
        JScrollPane scrollPane = new JScrollPane(table);
        table.setFillsViewportHeight(true);
        table.setRowSelectionAllowed(true);
        table.setColumnSelectionAllowed(false);
        table.setCellSelectionEnabled(false);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        tableModel = new TableModel(keyVector);
        table.setModel(tableModel);
        table.setDefaultRenderer(String.class, new CellRender());
        table.setAutoCreateRowSorter(true);
        RowSorter<?> sorter = table.getRowSorter();
        sorter.toggleSortOrder(0);

        scrollPane.setPreferredSize(new Dimension(520, 520));
        add(scrollPane);


Stukje uit mijn TableModel (de add/remove/get functies zijn niet van belang dus die heb ik weggelaten)

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TableModel extends AbstractTableModel
{

    // Names of the columns
    public String[] m_colNames =
    { "ID", "Naam", "Key", "Tag(s)", "Available", "Notes" };
    // Types of the columns.
    public Class[] m_colTypes =
    { Integer.class, String.class, String.class, String.class, String.class, String.class };

    // store the data
    Vector m_DataVector;

//meer methode hier
}


En dan mijn CellRender class:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class CellRender extends DefaultTableCellRenderer
{

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        System.out.println("row: " + row + "   colom: " + column);

        if (table.isRowSelected(row))
        {
            // System.out.println("row: " + row + "   colom: " + column);
            c.setBackground(Color.PINK);
        }

        return c;
    }
}


Volgensmij is dit alle relevante informatie mbt de tabel.

Het enige wat ik zelf kan bedenken is dat kolom 0 (de 1e) een Integer is in plaats van een string... maar waarom dat dan niet zou werken is mij een raadsel.

Wat mij opvalt is deze output van de regel: " System.out.println("row: " + row + " colom: " + column);"

code:
1
2
3
4
5
row: 4   colom: 1
row: 4   colom: 2
row: 4   colom: 3
row: 4   colom: 4
row: 4   colom: 5


Slechts 5 kolommen terwijl er 6 staan.

Met google kom ik niet veel verder behalve dat mijn manier zou moeten werken 8)7

Heeft iemand een idee waar en wat er fout gaat?

3780wP (18x 210wP EC Solar) | 2x Marstek Venus E (5.12kWh)


Acties:
  • 0 Henk 'm!

  • TJHeuvel
  • Registratie: Mei 2008
  • Niet online
Begint column niet bij 0 ipv 1? Misschien zit je er daarom 1 naast.

Freelance Unity3D developer


Acties:
  • 0 Henk 'm!

  • Mattie112
  • Registratie: Januari 2007
  • Laatst online: 16:15
Ja klopt, hij start op 0 maar ik zeg nergens dat hij op 1 moet beginnen?
Met andere woorden ik zou niet weten waar ik dat in kan stellen :p

3780wP (18x 210wP EC Solar) | 2x Marstek Venus E (5.12kWh)


Acties:
  • 0 Henk 'm!

  • TJHeuvel
  • Registratie: Mei 2008
  • Niet online
Je debug log laat zien dat column bij 1 begint, probeer eens bij het ophalen dat te compenseren:

Java:
1
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column - 1);


Edit: Misschien wordt Id niet gerenderd door de `DefaultTableCellRenderer`? Omdat deze bv gesorteerd is, probeer eens de Notes kolom te sorteren, is deze dan rood?

[ Voor 27% gewijzigd door TJHeuvel op 08-05-2012 10:05 ]

Freelance Unity3D developer


Acties:
  • 0 Henk 'm!

  • Mattie112
  • Registratie: Januari 2007
  • Laatst online: 16:15
Helaas geen effect.

code:
1
2
3
4
5
row: 4   colom: 0
row: 4   colom: 1
row: 4   colom: 2
row: 4   colom: 3
row: 4   colom: 4


Java:
1
2
3
        column = column - 1;
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        System.out.println("row: " + row + "   colom: " + column);


De 1e kolom blijft nog steeds wit. Misschien is er trouwens wel een betere/andere manier om dit te regelen. Ik houd me aanbevolen voor elke oplossing.


edit: het maakt niet uit welke kolom ik sorteer, de 1e (ID) blijft wit

[ Voor 7% gewijzigd door Mattie112 op 08-05-2012 10:12 ]

3780wP (18x 210wP EC Solar) | 2x Marstek Venus E (5.12kWh)


Acties:
  • 0 Henk 'm!

  • Mattie112
  • Registratie: Januari 2007
  • Laatst online: 16:15
Een extra kolom toevoegen werkt ook niet |:(

Afbeeldingslocatie: http://upload.mattie-systems.nl/uploads/82201-capture.png

Het enige wat ik nu nog kan bedenken is dat hij een "int" kolom niet kan kleuren maar om daar nou overal weer een string van te maken......

Ik compile het tegen java 6 trouwens.

3780wP (18x 210wP EC Solar) | 2x Marstek Venus E (5.12kWh)


Acties:
  • 0 Henk 'm!

  • azerty
  • Registratie: Maart 2009
  • Laatst online: 14-10 09:30
je hebt dit staan:

table.setDefaultRenderer(String.class, new CellRender());

voeg misschien ook eens

table.setDefaultRenderer(Integer.class, new CellRender());

toe ;)

Acties:
  • 0 Henk 'm!

  • Mattie112
  • Registratie: Januari 2007
  • Laatst online: 16:15
_/-\o_ _/-\o_ _/-\o_

SUPER! Dat is het inderdaad :D
Pft daar zit ik dus al een paar dagen gewoon overheen te kijken, ja dan is het wel logisch dat hij alleen de integer kolom niet pakt.

Nou echt super bedankt hoor! Mijn dag is weer goed!

3780wP (18x 210wP EC Solar) | 2x Marstek Venus E (5.12kWh)


Acties:
  • 0 Henk 'm!

  • azerty
  • Registratie: Maart 2009
  • Laatst online: 14-10 09:30
offtopic: miss toch es je waarschuwingen afzetten op http://mc.projectmc.nl/rechten/bouwrechten.php en die query niet standaard tonen? ;)

Acties:
  • 0 Henk 'm!

  • Mattie112
  • Registratie: Januari 2007
  • Laatst online: 16:15
offtopic:
thx, was eig een tijdelijk formuliertje met idd debug zooi aan :p
(niet dat het nou echt een belangrijke tabel is)
ik ga het fixen

3780wP (18x 210wP EC Solar) | 2x Marstek Venus E (5.12kWh)


Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 26-08 22:21
Wat je eventueel ook kunt doen is de cellrenderer instellen zonder rekening te houden met het type class dat zich in een cell bevindt.

Java:
1
2
3
4
for(int i = 0; i < table.getColumnModel().getColumnCount(); i++) {
    col = table.getColumnModel().getColumn(i);
    col.setCellRenderer(new CellRender());
}

Bovenstaande code is niet getest en het is al even geleden dat ik Java heb geschreven :+

Uit nieuwsgierigheid: waarom definieer je onderstaande ?
Java:
1
public Class[] m_colTypes =  { Integer.class, String.class, String.class, String.class, String.class, String.class }; 


AbstractTableModel heeft namelijk al een methode om de class op te kunnen vragen op basis van column index: http://docs.oracle.com/ja....html#getColumnClass(int)

Als ik het goed heb zorgt DefaultTableModel voor ten minste onderscheid tussen de verschillende objecten:
  • Date
  • Number
  • ImageIcon
  • Boolean
  • String

Acties:
  • 0 Henk 'm!

  • Mattie112
  • Registratie: Januari 2007
  • Laatst online: 16:15
Dat bovenste zal ik voor de gein even proberen vanmiddag. Ik zou zeggen dat dit ook moet werken inderdaad.

Waarom ik dat defineer? Ja goede vraag eigenlijk. Ik was toen aan het zoeken hoe je een custom table model maakte zodat ik (oa) in kon stellen dat je een veld niet mag bewerken én omdat je dan beter weet wat er achter de schermen gedaan wordt.

Ik zal vanmiddag ook even kijken wat er gebeurt als ik dat niet defineer, bedankt voor de tips!

3780wP (18x 210wP EC Solar) | 2x Marstek Venus E (5.12kWh)

Pagina: 1