Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    TableCellRenderer: settare sfondo riga

    Ciao: ho passato un po' di tempo a vedere degli esempi qua e là ma non ho ben capito una cosa.
    Io voglio fare questo nel mio programma: inserisco del testo, clicco un buttone: se esiste una cella con questo testo, voglio cambiare lo sfondo di tutta la riga in questione.

    Ora, ho capito che bisogna mettere le mani su questo metodo getTableCellRendererComponent ma:

    1. lo setto una volta e fa lui il controllo per tutte le celle della tabella?

    negli esempi che ho visto, si definisce il metodo getTableCellRendererComponent nella classe opportuna che estende DefaultTableCellRenderer .
    Poi si crea la tabella e si setta
    codice:
    table.setDefaultRenderer(Object.class, new MyTableCellRender());
    Ma quindi io devo: prima disegnare la tabella senza TableCellRenderer, poi una volta che cerco informazioni, devo settare il TableCellRenderer e ridisegnare la tabella?

    Altra cosa: dato che non vedo nessuna chiamata al metodo getTableCellRendererComponent, mi vien da pensare che viene chiamato per ogni cella al momento della creazione della tabella. Quindi posso integrare direttamente dentro questo metodo il controllo per sapere se la cella contiene il testo ricercato?

    Sono confuso, molto. Non capisco se il controllo lo devo fare fuori o dentro e quando usare il Renderer.

    La mia idea era
    Codice PHP:
    for(int i=0i<data_serialize.length;i++) 
              for(
    int j=0;j<4;j++) 
                        if(
    data[i][j].contains(text)) 
                               ;
    //colora riga 

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Se fai un tuo renderer ti consiglio di estendere JLabel ed implementare quell'interfaccia.

    Ogni nuova cella provoca una chiamata a quel metodo (detto senza giri di parole). Quindi all'interno di quel metodo devi porre degli if in base al valore di una determinata variabile (tipo la riga o la colonna).

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    import java.util.Vector;
    
    class MyTableCellRenderer extends JLabel implements TableCellRenderer {
      MyTableCellRenderer() {
        setOpaque(true);
      }
    
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocused, int row, int column) {
        
        // Righe pari rosse, righe dispari verdi
        if(row % 2 == 0) setBackground(Color.RED);
        else setBackground(Color.GREEN);
        
        // Riga selezionata in nero
        if(isSelected) setBackground(Color.BLACK);
    
        // Cella selezionata in nero -- Rimuovi il commento alla riga
        // if(hasFocused) setBackground(Color.BLACK);
      
       
        return this;
      }
    }
    
    class MyFrame extends JFrame {
      private JTable table;
      private DefaultTableModel model;
      
      MyFrame() {
        JPanel panel = new JPanel(new BorderLayout());
        
        model = new DefaultTableModel();
        table = new JTable(model);
        
        model.addColumn("Prima");
        model.addColumn("Seconda");
        model.addColumn("Terza");
        
        for(int i=0; i<10; i++) {
          Vector<String> row = new Vector<String>();
          row.addElement("");
          row.addElement("");
          row.addElement("");
          model.addRow(row);
        }
        
        table.setDefaultRenderer(Object.class, new MyTableCellRenderer());
        JScrollPane scrollPane = new JScrollPane(table);
        
        panel.add(scrollPane);
        
        add(panel);
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }
      
      
      public static void makeGUI() {
        MyFrame mf = new MyFrame();
        mf.setSize(500,500);
        mf.setVisible(true);
      }
      
      public static void main(String[] args) {
        try {
          SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
              makeGUI();
            }
          });
        } catch(Exception e) {}
      }
    }

  3. #3
    Quello l'ho capito come funziona, infatti mi funzionano quegli esempi.
    Posto il mio codice

    Metodo cerca, se viene inserito qualcosa crea la tabella e colora lo sfondo delle celle con il testo (intanto le celle, le righe ci penso dopo)
    Codice PHP:
    private void cerca(String text){
              
              if (
    text.equals("")){
                   
    JOptionPane.showMessageDialog(null"Inserisci informazioni da cercare""Attenzione"JOptionPane.WARNING_MESSAGE);
                   return ;
              }   
              
              
    crea_tabella(data_serializetrue);


    Codice PHP:
    private void crea_tabella(String[][] databoolean flag){
              
              
    modeltable = new DefaultTableModel(data,col);           
              
    table = new JTable(modeltable);
              if(
    flag==true)
                   
    table.setDefaultRenderer(Object.class, new MyTableCellRender());
              ......
              ...... 

    Codice PHP:
    class MyTableCellRender extends DefaultTableCellRenderer 
              
             public 
    MyTableCellRender() {             
                 
    setOpaque(true);  
             } 
             
             
             public 
    Component getTableCellRendererComponent JTable tableObject valueboolean isSelectedboolean hasFocusint rowint col){  
                  
                                   
                 
    Component cell super.getTableCellRendererComponent(tablevalueisSelectedhasFocusrowcol);
                 if (
    isSelected) {               
                      
    cell.setBackground(Color.green);
                 } 
                 else {
                      if ((
    table.getModel().getValueAt(row,col).toString()).contains("a"))                       
                           
    cell.setBackground(Color.cyan);                
                      else 
                           
    cell.setBackground(Color.lightGray);               
                 }
                 
                 return 
    cell;
             }  
              
        } 

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Jimmy5nomana
    Quello l'ho capito come funziona, infatti mi funzionano quegli esempi.
    Posto il mio codice

    Metodo cerca, se viene inserito qualcosa crea la tabella e colora lo sfondo delle celle con il testo (intanto le celle, le righe ci penso dopo)
    guarda alle differenze col tuo codice, se questo funziona qualcosa non va quando lo integri ed è proprio li che devi concentrarti
    RTFM Read That F*** Manual!!!

  5. #5
    Ok allora. Quando cerco, ridisegno la tabella e questa sparisce, ci rimangono solo gli headers.

    Perchè Patrick dice
    Se fai un tuo renderer ti consiglio di estendere JLabel ed implementare quell'interfaccia.
    Non può andare bene lo stesso questo?
    Codice PHP:
    class MyTableCellRenderer extends DefaultTableCellRenderer 

  6. #6
    Ok allora.
    Codice PHP:
         private void cerca(String text){
              
              if (
    text.equals("")){
                   
    JOptionPane.showMessageDialog(null"Inserisci informazioni da cercare""Attenzione"JOptionPane.WARNING_MESSAGE);
                   return ;
              }   
              
              
    RUN_JavaGui.set_panel(new Mostra_Diff(data_serialize,false));
        } 
    Non capisco perchè usando questa funzione in sede di apertura di un file salvato, mi visualizza correttamente la tabella, però se provo a visualizzare la stessa tabella in un nuovo frame (senza evidenziare le righe col testo da cercare) non me la fa più vedere. Si ed è esattamente la stessa chiamata. Ho provato a fare un revalidate() ma non funziona.

  7. #7
    A occhio cosa c'è che non va?
    Codice PHP:
        private void crea_tabella(String[][] databoolean flag){
              
              
    modeltable = new DefaultTableModel(data,col);           
              
    table = new JTable(modeltable);
              
    /*if(flag==true){
                   TableColumn tcol;
                   table.setDefaultRenderer(Object.class, new MyTableCellRenderer());
              }*/

              
              
    table.setIntercellSpacing(new Dimension(5,1));
              
    scroll = new JScrollPane(table);
              
    table.setRowHeight(table.getRowHeight()+10);
              
    table.setColumnSelectionAllowed(true);
              
    table.setAutoCreateRowSorter(true);
              
    table.getColumnModel().getColumn(1).setPreferredWidth(210);
              
    head table.getTableHeader();
              
    head.setBackground(Color.YELLOW);
              
              
    scroll.setBorder(BorderFactory.createLineBorder(new Color(210,220,230), 15));       
              
              
    add(scroll,BorderLayout.CENTER);
         }
         
         
              
         private 
    void cerca(String text){
              
              if (
    text.equals("")){
                   
    JOptionPane.showMessageDialog(null"Inserisci informazioni da cercare""Attenzione"JOptionPane.WARNING_MESSAGE);
                   return ;
              }   
              
              
    to_search=info.getText();
              
    RUN_JavaGui.set_panel(new Mostra_Diff(data_serialize,true));
              
    RUN_JavaGui.get_panel().revalidate();
                          
         }
         
         
         
         class 
    MyTableCellRenderer extends DefaultTableCellRenderer 
         
    //class MyTableCellRenderer extends JLabel implements TableCellRenderer{
             
    public MyTableCellRenderer() {             
                 
    setOpaque(true);  
             } 
             
             
             public 
    Component getTableCellRendererComponent JTable tableObject valueboolean isSelectedboolean hasFocusint rowint col){  
                  
                                   
                 
    Component cell super.getTableCellRendererComponent(tablevalueisSelectedhasFocusrowcol);
                 if (
    isSelected) {               
                      
    cell.setBackground(Color.blue);
                 } 
                 else {
                      if ((
    table.getModel().getValueAt(row,col).toString()).contains(to_search))                       
                           
    cell.setBackground(Color.orange);                
                      else 
                           
    cell.setBackground(Color.white);               
                 }
                 
                 return 
    cell;
             }  
              
        } 

  8. #8
    a prima occhiata non c'è nulla di errato....
    non ti conviene fare un debug per vedere dove sta il tuo errore?

    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  9. #9
    Ok funziona. In poche parole: io creo un nuovo pannello e ridisegno la tabella, stavolta col Renderer. Quindi devo salvare, o inviare come parametro il testo contenuto nella JTextArea del vecchio pannello. Quindi ho creato un altro costruttore con parametro una String per la JTextArea, e questo lo salvo in un campo static del nuovo pannello. Normale che prima non funzionasse, lo salvavo e perdevo il riferimento al vecchio pannello.
    (Adesso l'ultima cosa che mi manca è l'ordinamento sul rowsroter, ho aperto un topic, vado a vederemi altri esempi.)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.