Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99

    [JAVA] Colorare celle singolarmente su Jtable

    Ciao,


    vorrei ovviare al problema di selezione Jtable con singola cella .

    Ho pensato di colorare le celle interessate tramite click del mouse.


    Ho creato un Mouse listner, che ad esempio, per verificarne il funzionamento, mi restituisce le coordinate della cella nel Jtable e il contenuto della cella.


    Non riesco in alcun modo a colorare la singola cella.

    Ho letto in giro di un tablerenderer ma non riesco a capirne il funzionamento...avete degli esempi semplici da mostrarmi?


    grazie
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    questa sarebbe la classe che implementa il renderer:

    codice:
    class myRender extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    			
    Component cell = super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
    			 
    			cell.setBackground(Color.green ); 
    			return cell;
    		}
    	}
    e questo è il richiamo dentro il mouse listener...

    codice:
    jTable.addMouseListener(new MouseAdapter()    
            {   
            	public void mouseClicked(MouseEvent evt)   
            	{   
            		int rowIndex = jTable.getSelectedRow();
                    int colIndex = jTable.getSelectedColumn();
                    
                     myRender mr = new myRender();
                     jTable.getColumnModel().getColumn(5).setCellRenderer(mr);
                     jTable.getColumnModel().getColumn(6).setCellRenderer(mr);
     JOptionPane.showMessageDialog(null, "cliccato su riga: " + rowIndex + " e colonna: " + colIndex); 
            	}   
            	});

    codice preso da questo sito che però colora una colonna...
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Modifica così:

    codice:
    class myRender extends DefaultTableCellRenderer {
      public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    			
        Component cell = super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
    			 
        if(hasFocus) cell.setBackground(Color.green ); 
        return cell;
      }
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    ho provato anche con "is selected"...continua a seguire la logica del range di celle.


    cliccando sulla singola cella la colora.

    cliccando su una seconda cella cerca il range con la cella precedente e colora il range...


    ma dai è mai possibile non si possa fare una cosa del genere?
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    Modificando così sono riuscito ad ottenere l'effetto voluto utilizzando il tasto CTRL insieme al click del mouse.


    aggiunta voce:

    codice:
     jTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    modifica al listner:
    codice:
     jTable.addMouseListener(new MouseAdapter()    
            {   
            	public void mouseClicked(MouseEvent evt)   
            	{   
            		int rowIndex = jTable.getSelectedRow();
                    int colIndex = jTable.getSelectedColumn();
                   myRender vr = new myRender();jTable.getColumnModel().getColumn(5).setCellRenderer(vr);  
                   myRender mr = new myRender();jTable.getColumnModel().getColumn(6).setCellRenderer(mr);           	}   
            	});
    ed il nuovo renderer:
    codice:
    	class myRender extends DefaultTableCellRenderer {
    		  public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    					
    		    Component cell = super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
    					 
    		    if(!hasFocus && isSelected) cell.setBackground(Color.green ); 
    		    else  {cell.setBackground(Color.white);}
    		    if( isSelected) cell.setBackground(Color.green ); 
    		    return cell;
    		  }
    		}
    Il problema è la colonna adiacente...a me interessa gestire individualmente le celle almeno sulle colonne 5 e 6.

    settando come dico io la 5, cliccando in qualsiasi cella della colonna 6 estende la selezione della 5...

    any ideas?
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  6. #6
    Certo che vai a cercare sempre le cose più "semplici da fare".....
    codice:
    //CODICE PER LA CREAZIONE E SETTAGGIO DELLA TABELLA
    AttributiveCellRenderer render = new AttributiveCellRenderer();
    for (int i = 0; i < table.getColumnModel().getColumnCount(); i++) {
          table.getColumnModel().getColumn(i).setCellRenderer(render);
    }
    table.addMouseListener(render);
    //FINE CODICE SETTAGGIO TABELLA
    public class AttributiveCellRenderer extends DefaultTableCellRenderer implements MouseListener {
        List<Point> selectedCells = new ArrayList<Point>();
    
        public AttributiveCellRenderer() {
    
        }
    
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
            Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            Point point = new Point(row, column);
            if (selectedCells.contains(point)) {
    
                comp.setBackground(Color.red);
    
            } else {
                comp.setBackground(UIManager.getColor("Table.background"));
            }
    
            return comp;
        }
    
        @Override
        public void mouseClicked(MouseEvent e) {
            if (e.isControlDown()) {
                JTable table = (JTable) e.getSource();
                int itsRow = table.rowAtPoint(e.getPoint());
                int itsColumn = table.columnAtPoint(e.getPoint());
                Point point = new Point(itsRow, itsColumn);
                if (selectedCells.contains(point)) {
                    selectedCells.remove(point);
                } else {
                    selectedCells.add(point);
                }
                table.repaint();
            }
        }
    
        @Override
        public void mousePressed(MouseEvent e) {}
    
        @Override
        public void mouseReleased(MouseEvent e) {}
    
        @Override
        public void mouseEntered(MouseEvent e) {}
    
        @Override
        public void mouseExited(MouseEvent e) {}
    
    }
    Vedi un pò se ti torna

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.