Avatar billede madiedk Nybegynder
27. august 2008 - 21:52 Der er 15 kommentarer og
1 løsning

jTable rendering problemer, getTableCellRendererComponent

Hej

jeg har gennemsøgt nettet og prøvet mig frem for at få jTable rendering til at virke. jeg har ved hæftet noget kode som skulle farve mine celler, bare så jeg kunne se at det virkede, men kan ikke få det til at virke, men den compiler da:

i min constructor har jeg denne kode:
            TableColumn col = jTable1.getColumnModel().getColumn(1);
            col.setCellRenderer(new MyCellRenderer());

og lige efter har jeg denne kode:

class MyCellRenderer extends JLabel implements TableCellRenderer{
    public MyCellRenderer(){
        setOpaque(true);
    }
   
    public Component getTableCellRendererComponent(JTable table,
            Object value,
            boolean isSelected,
            boolean hasFocus,
            int row,
            int column) {
       
        setHorizontalAlignment(JLabel.RIGHT);
        if(value == null)
            setText("");
        else
            setText(value.toString());
       
        if(value instanceof Integer){
            int i = ((Integer)value).intValue();
           
            if(i < 0)
                setForeground(Color.red);
            else
                setForeground(Color.black);
        }
       
        if(isSelected)
            setBackground(table.getSelectionBackground());
        else
            setBackground(table.getBackground());

        return this;
    }
}

hvorfor virker det ik?
Avatar billede _carsten Nybegynder
27. august 2008 - 22:03 #1
For mig at se er den rigtig, men du bruger standard farver, lav dem lidt hidsige så du bedre kan se det

        if(isSelected)
            setBackground(Color.YELLOW);
        else
            setBackground(Color.BLUE);
Avatar billede madiedk Nybegynder
27. august 2008 - 22:12 #2
det virker stadig ik.
jeg har lavet alt den anden GUI med netbeans som autogenerer koden, ved ik om det kan have noget at sige, plus at jeg også har lavet min eget AbstractTableModel til selve dataen.
Avatar billede _carsten Nybegynder
27. august 2008 - 22:17 #3
Det er ikke NetBeans skyld, jeg har stort set aldrig brugt andet.

Vent lige 10 sek, jeg tester den lige
Avatar billede madiedk Nybegynder
27. august 2008 - 22:21 #4
Fedt, tak fordi du gider.
jeg tænkte på om man skulle bruge jTable1.setColumnModel(...) som man kan via netbeans eller om det er fint at lave koden selv efter netbeans har initialiseret sin autogenerede kode.
med min AbstractTableModel har jeg nemlig bruge jTable1.setModel(omkostningerTableModel)
ved bare ik lige hvordan jeg skulle lave det med jTable1.setColumnModel(...)
Avatar billede _carsten Nybegynder
27. august 2008 - 22:25 #5
Har lige testet - den virker
Avatar billede madiedk Nybegynder
27. august 2008 - 22:26 #6
hmm...hvor går det mon galt for mig?
Avatar billede _carsten Nybegynder
27. august 2008 - 22:28 #7
Du kan sagtens gøre det efter initialiseringen

Jeg tror ikke du får sat renderen

Nedenstående bliver ikke eksekveret

            TableColumn col = jTable1.getColumnModel().getColumn(1);
            col.setCellRenderer(new MyCellRenderer());
Avatar billede madiedk Nybegynder
27. august 2008 - 22:33 #8
jeg har lige prøvet at sætte en
System.out.print("hej");

lige efter den kode du skriver ikke bliver eksekveret, og den skriver hej ud til consolen
Avatar billede _carsten Nybegynder
27. august 2008 - 22:35 #9
Prøv at flytte koden ned, sådan at det er det aller sidste der sker inden din Jframe vises på skærmen
Avatar billede _carsten Nybegynder
27. august 2008 - 22:39 #10
Jeg har en lille ide om at du måske initierer din tabel 2 gange - sidste gang uden den nye renderer
Avatar billede madiedk Nybegynder
27. august 2008 - 22:42 #11
gør ingen forskel, virker stadig ik.
I min kolonne 1 er der bare nogle tal, skulle de blive farvede eller hvad skal der ske når det virker?
Avatar billede _carsten Nybegynder
27. august 2008 - 22:44 #12
Baggrunden bliver farvet

Jeg laver lige et eksempel
Avatar billede _carsten Nybegynder
27. august 2008 - 22:51 #13
Her er et eksempel med din egen renderer, som jeg har modificeret lidt så du bedre kan se set.

Jeg lukker for i aften - fortsat god fornøjelse


import javax.swing.table.TableColumn;


public class NewJFrame extends javax.swing.JFrame {


    public NewJFrame() {
        initComponents();
                    TableColumn col = jTable1.getColumnModel().getColumn(1);
            col.setCellRenderer(new MyCellRenderer());
    }


    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new java.awt.FlowLayout());

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, "123", null, null},
                {null, "123", null, null},
                {null, "123", null, null},
                {null, "123", null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        getContentPane().add(jScrollPane1);

        pack();
    }// </editor-fold>


    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }


    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;

}











import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;


class MyCellRenderer extends JLabel implements TableCellRenderer{
    public MyCellRenderer(){
        setOpaque(true);
    }

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

        setHorizontalAlignment(JLabel.RIGHT);
        if(value == null)
            setText("");
        else
            setText(value.toString());

        if(value instanceof Integer){
            int i = ((Integer)value).intValue();
           
            if(i < 0)
                setForeground(Color.red);
            else
                setForeground(Color.black);
        }

        if(isSelected){
            setBackground(Color.YELLOW);
            setForeground(Color.BLUE);
        }
        else{
            setBackground(Color.BLUE);
            setForeground(Color.YELLOW);
        }

        return this;
    }
}
Avatar billede madiedk Nybegynder
27. august 2008 - 22:52 #14
ja for pokker du har nok ret, nu prøvede jeg at smide:
TableColumn col = jTable1.getColumnModel().getColumn(1);
col.setCellRenderer(new MyCellRenderer());

ned i koden til en button og så blev den blå når jeg klikkede, så det er sku nok noget med at jeg initierer 2 gange, selvom jeg ik lige kan se hvor men jeg roder lige lidt med det.
Avatar billede madiedk Nybegynder
27. august 2008 - 22:55 #15
tror jeg har fundet fejlen i min ene knap havde jeg fireTableStructureChanged(); når jeg ændrer den til fireTableDataChanged(); virker det selvfølgelig.
smid et svar, så vil jeg gå i gang med celleditoren:-)
Avatar billede _carsten Nybegynder
27. august 2008 - 23:02 #16
Smukt

Svar
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