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

    JCheckBox in JTable

    Buongiorno ragazzi,

    Ho un problema stupido ma è da Venerdì che mi ha bloccato.
    nella mia JTable ho messo un JCheckBox che permetterà a tempo debito per indicare a chi verrà spedita una mail ed a chi no.

    Però dopo averlo inserito si conporta in maniera mutuamente esclusiva ovvero se clicco uno l'altro che era a true sarà messo a falso e ed il primo non viene portato a true deve essere cliccato per una seconda volta. e questo comportamente viene sempre ripetuto

    qui diu seguito posto il codice utilizzato

    Inizializzazione tabella e cella che conterrà il CheckBox
    codice:
    public void ModelingTable(Object [][] dati_t, int rows, int columns, final Object[] dLastUpdating){
    
    	    // Creo il modello della tabella e l'applico ad un istanza di Jtable
    	    tableModel=null;
    	    TableColumn column=null;
    	    DefaultTableColumnModel columnModel = new DefaultTableColumnModel();
    		for(int i = 0; i < columns; i++) {
    			// modello attributi colonna singola
    		 	
       		 	tableModel = new DefaultTableModel1(dati_t, tableHeaders1);
       			column = new TableColumn(i, widths1[i]);
       			column.setHeaderValue(tableHeaders1[i]);
       			columnModel.addColumn(column);
       			
    		}
    	  //  TableModel tableModel = new DefaultTableModel(tableData, tableHeaders);
    
    		jTable1 = new JTable(tableModel, columnModel);
    		
    		for(int i = 0; i < columns; i++) {
    			 jTable1.getColumn("Send_Mail").setCellRenderer(new CheckBoxRenderer());
    			jTable1.getColumn("Send_Mail").setCellEditor(new CheckBoxEditor(dati_t));
    
    		}
    ...segue
    Editor per JCheckBox
    codice:
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class CheckBoxEditor extends AbstractCellEditor implements TableCellEditor {
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = -7138255194415617187L;
    	private JCheckBox jc;
    	private Object [][] dati;
    	
    	public CheckBoxEditor(Object [][] dati) {
    		jc = new JCheckBox();
    		this.dati=dati;
    	}
    
    
    	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    		
    		System.out.println();
        	if (isSelected) {
          		jc.setForeground(table.getSelectionForeground());
          		jc.setBackground(table.getSelectionBackground());
          		
        	} 
        	else{
          		jc.setForeground(table.getForeground());
          		jc.setBackground(table.getBackground());
        	}
        	return jc;
    	}
    
    	public Object getCellEditorValue() {
    		return ((JCheckBox)jc).isSelected();
    	}
    	
    	public boolean stopCellEditing() {
        	return super.stopCellEditing();
      	}
     
    	protected void fireEditingStopped() {
        	super.fireEditingStopped();
      	}
    }
    Renderizzazione per il JCheckBox
    codice:
    import java.awt.Component;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 5266080252364837753L;
    
    	public CheckBoxRenderer() {
    		setHorizontalAlignment(JLabel.CENTER);
    	}
    
    	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    		if (isSelected) {
    			setForeground(table.getSelectionForeground());
    			//super.setBackground(table.getSelectionBackground());
    			setBackground(table.getSelectionBackground());
    		} else {
    			setForeground(table.getForeground());
    			setBackground(table.getBackground());
    		}
    		setSelected((value != null && ((Boolean) value).booleanValue()));
    		return this;
    	}
    }


    Grazie mille x ogni aiuto/consiglio.
    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

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Perchè complicarsi la vita in questo modo? JCheckBox è già un editor di default nelle JTable per i valori di tipo Boolean.
    E' sufficiente che il tuo TableModel indichi che per quella determinata colonna, il valore è di tipo Boolean e si arrangia la JTable a gestirlo correttamente (poi, se vi sono personalizzazioni è un altro paio di maniche).

    Ad ogni modo, tutto ciò che va messo a punto è il TableModel, in particolare questi quattro metodi:

    codice:
    public boolean isCellEditable(int row, int col);
    public Class getColumnClass(int col);
    public void setValueAt(Object value, int row, int col);
    public Object getValueAt(int row, int col);
    Il primo va implementato in modo che ritorni "true" per la colonna che visualizzerà la JCheckBox (in questo modo diciamo alla JTable che quella colonna è modificabile dall'utente).

    Il secondo va implementato in modo che ritorni Boolean.class per la colonna che visualizzerà la JCheckBox (in questo modo la JTable caricherà automaticamente l'editor ed il renderer corretto, ovvero una JCheckBox).

    Il terzo va implementato in modo da memorizzare il valore value (che sarà un Boolean, basta fare un cast) per la proprietà che indica se la particolare riga è selezionata o meno e successivamente invocare

    fireTableRowsUpdated(row, row);

    Il quarto dovrà restituire il booleano che indica se la riga è selezionata o meno (un Boolean.TRUE o Boolean.FALSE).

    Non serve creare né un CellEditor, né un Renderer per questo tipo di proprietà che vengono gestite automaticamente dalla JTable.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Ciao LeleFT

    Innanzitutto grazie per la risposta.

    E pensare che mi stavo ammalando per una situazione così semplice

    In verità però ho implementato solamente la:
    codice:
    public boolean isCellEditable(int row, int col);
    public Class getColumnClass(int col);
    ed con questi due metodi ho già messo a posto la situazione.

    Lo terrò presente per il futuro.
    Grazie ancora,
    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

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.