Avatar billede mungojerrie Nybegynder
19. september 2005 - 19:19 Der er 15 kommentarer og
1 løsning

JTable og getTableCellRendererComponent

Hej

Jeg vil lige høre hvornår metoden
getTableCellRendererComponent
bliver kaldt.

Jeg benytter metoden til at give alle mine celler en anden baggrund, da mine data kan indholde en farve i kolonne 0 som så bliver brugt til baggrundsfarven.

Problemet er at selvom jeg angiver en "null" i min data for kolonne 0, så bliver der alligevel vist farven fra foregående kolonne, hvor der gemmer sig en farve.

public Component getTableCellRendererComponent(JTable jtable, Object o, boolean isSelected, boolean hasFocus, int row, int column) {
Color color = (Color)TableModel.getValueAt(row, 0);
if(color!=null)setBackground(color);
}


Men det er nok en fejl 40 :-)
Avatar billede _carsten Nybegynder
20. september 2005 - 08:22 #1
Kunne vi ikke se en lidt mere specifik kode (hvor / hvordan du anvender den )

Umiddelbart ser det ikke rigtigt ud.
Avatar billede mungojerrie Nybegynder
20. september 2005 - 09:44 #2
kode skal du få :-)

public class StdTableCellRenderer extends DefaultTableCellRenderer {
   
    /**
    * constructor
    *
    */
    public StdTableCellRenderer() {
        setOpaque(true); //MUST do this for background to show up.
    }
   
    public Component getTableCellRendererComponent(JTable jtable, Object o,
            boolean isSelected, boolean hasFocus, int row, int column) {

        DefaultServerDataView dsdv = (DefaultServerDataView)jtable.getModel();
        Color color = (Color)dsdv.getValueAt(row, 0);
        if(color!=null){
            setBackground(color);
        }
    }
}



public class ConverterServerDataView extends DefaultServerDataView {

    public void setUpTableColumns(JTable table) {
        StdTableCellRenderer scr = new StdTableCellRenderer();
       
        ..................
        table.getColumnModel().getColumn(Ordre.HASTE_DATO_COL).setCellRenderer(scr);
        ..................
       
    }
}


public abstract class DefaultServerDataView extends DefaultTableModel {
    public DefaultServerDataView(Object[][] data, String[] headers){
        super(data, headers);
        columnNames = headers;
        dataRows = data;
    }
}
Avatar billede _carsten Nybegynder
20. september 2005 - 10:45 #3
Skulle lige se om du brugte din egen cellRenderer

RET:

        if(color!=null){
            setBackground(color);
        }

TIL:


        if( o !=null){
            setBackground(color);
        }
        else
            setBackground(new Color.YELLOW);

Så skulle det virke
Avatar billede _carsten Nybegynder
20. september 2005 - 10:47 #4
Ps.

        DefaultServerDataView dsdv = (DefaultServerDataView)jtable.getModel();
        Color color = (Color)dsdv.getValueAt(row, 0);

Skal ikke bruges til noget i den forbindelse !
Avatar billede mungojerrie Nybegynder
20. september 2005 - 10:49 #5
øhhh, hvis jeg ikke skal bruge:
        DefaultServerDataView dsdv = (DefaultServerDataView)jtable.getModel();
        Color color = (Color)dsdv.getValueAt(row, 0);
hvor skal jeg så få min color fra ?? :-)
Avatar billede _carsten Nybegynder
20. september 2005 - 11:02 #6
Jeg har vist misforstået dig.

Dit farvevalg sker udfra et Color object i kolonne 0, eller hva ??

Men du mangler et return statement - for du ikke compilefejl ???

    public Component getTableCellRendererComponent(JTable jtable, Object o,
            boolean isSelected, boolean hasFocus, int row, int column) {

        DefaultServerDataView dsdv = (DefaultServerDataView)jtable.getModel();
        Color color = (Color)dsdv.getValueAt(row, 0);
        if(color!=null){
            setBackground(color);
        }

        return this;
    }
Avatar billede mungojerrie Nybegynder
20. september 2005 - 11:06 #7
ja, jeg sætter farven udfra værdien i dsdv.getValueAt(row, 0);

koden er ikke fuldstændig, så jo der mangler et return statement

hele metoden er her:

    public Component getTableCellRendererComponent(JTable jtable, Object o,
            boolean isSelected, boolean hasFocus, int row, int column) {
       
        DefaultServerDataView dsdv = (DefaultServerDataView)jtable.getModel();
       
        Color color = (Color)dsdv.getValueAt(row, 0);

        if(color!=null){
            setBackground(color);
        }else{
            setBackground(getBackground());
        }
       
        if(o!=null){
            switch (column) {
                case 0: setText(formatDate(o)); break;
                case 3: setText(formatDate(o)); break;
               
                case 4: setText(formatNumber(o)); break;
                case 5: setText(formatNumber(o)); break;
               
                default: setText(o.toString()); break;
            }
           
        }else{
            setText("");
        }
       
        if (hasFocus) {
            setBorder( UIManager.getBorder("Table.focusCellHighlightBorder") );
            if (jtable.isCellEditable(row, column)) {
                super.setForeground( UIManager.getColor("Table.focusCellForeground") );
                super.setBackground( UIManager.getColor("Table.focusCellBackground") );
            }
        } else {
            setBorder(noFocusBorder);
        }
        color = null;
        return this;
    }
Avatar billede _carsten Nybegynder
20. september 2005 - 11:44 #8
Får du slet ingen compilefejl ??
Avatar billede mungojerrie Nybegynder
20. september 2005 - 11:56 #9
nej, synes du jeg burde det ? og i såfald hvorhenne ?
Avatar billede _carsten Nybegynder
20. september 2005 - 12:46 #10
Den her; Color color = (Color)dsdv.getValueAt(row, 0);
Bør give compile eller runtimefejl !

Gør den ikke det ???

Hvis ikke - tvivler jeg på du anvender den !!
Avatar billede mungojerrie Nybegynder
20. september 2005 - 12:52 #11
er nu ret sikker på den bliver brugt da alle mine rækker får baggrundsfarven blå som er i mine data i række 0 kolonne 0
men vi kan godt blive enige om at den burde fejle, hvis ikke der er et Color obj i cellen
Avatar billede mungojerrie Nybegynder
20. september 2005 - 13:06 #12
så fik jeg det til at virke....

kode:

    public Component getTableCellRendererComponent(JTable jtable, Object o,
            boolean isSelected, boolean hasFocus, int row, int column) {
       
        DefaultServerDataView dsdv = (DefaultServerDataView)jtable.getModel();
        Object obj = dsdv.getValueAt(row, 0);
        Color color = null;

        if(obj instanceof Color){
            color = (Color)dsdv.getValueAt(row, 0);
        }
       
        if(color!=null){
            setBackground(color);
        }else{
            super.setBackground(jtable.getBackground());
        }
       
        if(o!=null){
            switch (column) {
                case 0: setText(formatDate(o)); break;
                case 3: setText(formatDate(o)); break;
               
                case 4: setText(formatNumber(o)); break;
                case 5: setText(formatNumber(o)); break;
               
                default: setText(o.toString()); break;
            }
           
        }else{
            setText("");
        }
       
        if (isSelected) {
              //super.setForeground(jtable.getSelectionForeground());
              super.setBackground(jtable.getSelectionBackground());
        }
        return this;
    }
Avatar billede _carsten Nybegynder
20. september 2005 - 13:22 #13
Lyder fornuftigt :)
Avatar billede mungojerrie Nybegynder
20. september 2005 - 13:31 #14
jeg vil nu gerne give dig point som tak for hjælpen :-)
Avatar billede _carsten Nybegynder
20. september 2005 - 13:35 #15
Jeg er med på en deler - fatter ikke at jeg overså den, mener dog stadig den vil give runtimefejl, det kan ikke være anderledes.
Avatar billede mungojerrie Nybegynder
20. september 2005 - 13:36 #16
du får bare det hele :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester