Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [JAVA] JTable

  1. #1

    [JAVA] JTable

    Nonostante le ricerche nel web non sono riuscito a capire come fare ad inserire in una colonna della JTabel i flag booleani!!!
    Ho bisogno di un esempio sul mio codice, che vi spiego e posto di seguito.
    Nel codice richiamo più volte la costruzione di tabelle JTable e per questo ho creato la classe Tables che a seconda dei parametri passati al costruttore restituisce la tabella del caso.
    Invoco la costruzione della tabella:
    codice:
    JTable tablePagato = new Tables(numeroBolletta).drawTable();
    panUP.add(new JScrollPane(tablePagato));
    Di seguito la classe Tables con il costruttore che ci interessa in questo caso, invocato con il passaggio del parametro di tipo int:
    codice:
    package tabelle;
    
    import java.awt.Dimension;
    
    import javax.swing.JRadioButton;
    import javax.swing.JTable;
    import javax.swing.ListSelectionModel;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableColumn;
    
    import calcoliBolletta.CalcoliBolletta;
    import database.Condomini;
    import database.Millesimi;
    import utility.Arrotondamenti;
    import utility.Decimali;
    import utility.LeggiDataPagato;
    import utility.LeggiPagato;
    
    public class Tables {
    		
    	final DefaultTableModel model = new DefaultTableModel();
    	private JTable table = new JTable(model);
    	
    	private String[] condomino = Condomini.getElencoCognome();
    	
    	private int numRow;
    	private Object[][] datiColonna;
    	private Object[] lastRow;
    	private Object[] columnHeaders;
    	private int[] misureColonne;
    	private int dimX;
    	private int dimY;
    	private String evidenziaRow = null;
    	private String coloreRow = null;
    
    [.....]
    
    // OPERAZIONI AGGIUNTIVE: PAGATO SI/NO
    	public Tables(int numeroBolletta) {
    		String pagato = new LeggiPagato().leggi(numeroBolletta);
    		String dataPagato = new LeggiDataPagato().leggi(numeroBolletta);
    		
    		columnHeaders = new Object[] {"PAGATO","CHECK",};
    		numRow = 2;
    		datiColonna = new String[columnHeaders.length][numRow];
    		
    		// PRIMA colonna 0
    		datiColonna[0][0] = "SI";
    		datiColonna[0][1] = "NO";
    		// SECONDA colonna 1
    		datiColonna[1][0] = pagato;
    		datiColonna[1][1] = pagato;
    		
    		lastRow = new Object[] {"DATA:",dataPagato};
           	misureColonne = new int[] {80,80};
           	dimX = 160;
           	dimY = 48;
           	
           	draw();
    	} // FINE METODO
    
    [.....]
    
    	public void draw() {
    		table.setPreferredScrollableViewportSize(new Dimension(dimX,dimY));
    		table.setFillsViewportHeight(true);
    		table.setColumnSelectionAllowed(false);
    		table.getTableHeader().setReorderingAllowed(false); // SPOSTAMENTO DELLE COLONNE
    		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    		table.setAutoResizeMode(0); //AUTO RESIZE OFF
    		table.setEnabled(false);
            TableColumn colonna = null;
            
            // DATI JTABLE
            for(int i=0; i<columnHeaders.length; i++) {
            	model.addColumn("<html>"+columnHeaders[i]+"</html>", datiColonna[i]);
            }
            for(int i=0; i<numRow; i++) {
            	for(int x=0; x<model.getColumnCount(); x++) {
            		table.getColumnModel().getColumn(x).setCellRenderer(new TableModel(numRow,evidenziaRow,coloreRow));// SETUP TABELLA
            	}
            }
            model.addRow(lastRow); // ULTIMA RIGA
            
        		//SETUP delle COLONNE
            for(int i=0; i<columnHeaders.length; i++) {
            	// IMPOSTAZIONI COLONNE
            	colonna = table.getColumnModel().getColumn(i);
            	colonna.setResizable(false);
            	colonna.setPreferredWidth(misureColonne[i]);
            }
    	} // FINE METODO
    	
    	public JTable drawTable() {
    		return table;
    	} // FINE METODO
    } // FINE CLASSE
    Poi ho la classe TableModel, dove a secondo dei valori o meno che assegno ad alcune variabili nei costruttori della classe Table, ottengo la formattazione delle tabelle, come colore di backgroung delle righe, colore testo etc...
    codice:
    package tabelle;
    
    import java.awt.Color;
    import java.awt.Component;
    
    import javax.swing.JLabel;
    import javax.swing.JTable;
    import javax.swing.SwingConstants;
    import javax.swing.table.DefaultTableCellRenderer;
    
    public class TableModel extends DefaultTableCellRenderer {
    	   
    	  /**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    
    	private String[] checkRed;
    	private int lastRow;
    	private String evidenziaRow,coloreRow;
    	
    	public TableModel(String[] checkRed) {
    		this.checkRed = checkRed;
    	}
    	
    	public TableModel(int lastRow, String evidenziaRow, String coloreRow) {
    		this.checkRed = null;
    		this.lastRow = lastRow;
    		this.evidenziaRow = evidenziaRow;
    		this.coloreRow = coloreRow;
    	}
    	
    	@Override
    	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    		JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    	    
    	    setOpaque(true);
    	    
    	    label.setHorizontalAlignment(SwingConstants.CENTER);
    	    
    	    // COLORE ALTERNATO RIGHE
    	    if (row%2 == 0) {
    	    	label.setBackground(Color.WHITE);
    	    } else {
    	    	label.setBackground(new Color(232,242,254));
    	    }
    	    
    	    // SFONDO DIVERSO PER LE TABLE CHE NON CHIAMANO IL CHECK (CIOE' DIVERSE DAL RegistroCassa)
    	    if (checkRed == null) {
    	    	if (row == lastRow) label.setBackground(new Color(173,255,47));
    	    	if (evidenziaRow != null) { // evidenzia la riga del condomino nella table millesimi!!!
    	    		if (row == Integer.parseInt(evidenziaRow)-1) label.setBackground(new Color(250,150,0));
    	    	}
    	    	if (coloreRow != null) { // colora le righe delle tabelle AGGIUNTE/DETRAZIONI
    		    	if (coloreRow.equals("DETRAZIONI")) {label.setForeground(Color.RED); }
    		    	else { label.setForeground(Color.BLUE); }
    	    	}
    	    }
    	    
    	    // SCRITTA ROSSA PER LE VOCI OUT se richiamata nel costruttore
    	    if (checkRed != null) {
    		    if (Boolean.parseBoolean(checkRed[row])) {
    		    	label.setForeground(Color.RED);
    		    } else {
    		    	label.setForeground(Color.BLUE);
    		    }
    	    }
    	    
    	    // COLORE RIGA SELEZIONATA
    	    if (isSelected) label.setBackground(Color.LIGHT_GRAY);
    	    
    	    return label;
        }  
    }
    Volendo realizzare la semplice tabella come nel codice sopra postato della classe Tables, con sole due colonne e tre righe, dove al fianco delle celle con la scritta SI e NO, a secondo del valore della variabile "pagato" (Si/NO oppure TRUE/FALSE) mi appaia il flag booleano spuntato o meno, come posso fare!?
    Grazie a Tutti per l'attenzione

  2. #2

  3. #3
    se non ricordo male il checkBox è "selezionabile" in automatico nelle jtable, quindi il lavoro da fare è di meno.

    devi semplicemente ridefinire il TableCellRender e il tableCellNonMiRicordo di quella colonna ed il gioco è fatto.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    mi pare che qui faccia pure un esempio
    RTFM Read That F*** Manual!!!

  5. #5
    Non ho ben capito come si fa e quindi non riesco ad inserirlo nel mio codice!!!

  6. #6
    codice:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package graphicComponent;
    
    import java.awt.Component;
    import javax.swing.JButton;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.table.TableCellRenderer;
    
    /**
     * @version 1.0 11/09/98
     */
    public class ButtonRender extends JButton implements TableCellRenderer {
    
        /**
         *
         */
        private static final long serialVersionUID = 1L;
    
        public ButtonRender() {
            super();
            setOpaque(true);
    
        }
    
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (isSelected) {
                setForeground(table.getSelectionForeground());
                setBackground(table.getSelectionBackground());
            } else {
                setForeground(table.getForeground());
                setBackground(UIManager.getColor("Button.background"));
            }
            setText("Lancia File");
            this.setEnabled(true);
            return this;
        }
    }
    codice:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package graphicComponent;
    
    import java.awt.Component;
    import java.awt.Desktop;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.net.URL;
    import javax.swing.AbstractCellEditor;
    import javax.swing.JButton;
    import javax.swing.JOptionPane;
    import javax.swing.JTable;
    import javax.swing.table.TableCellEditor;
    
    /**
     *
     * @author Utente1
     */
    public class ButtonEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
    
        private JButton pulsante;
        private String path;
    
        public ButtonEditor() {
            pulsante = new JButton("Lancia File!");
            pulsante.addActionListener(this);
        }
    
        @Override
        public Object getCellEditorValue() {
            return path;
        }
    
        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            path = (String) value;
            if (path.equalsIgnoreCase("") || path.equalsIgnoreCase(" ")) {
                JOptionPane.showMessageDialog(null, "Nessun File Associato", "Errore apertura file", JOptionPane.ERROR_MESSAGE);
            }
            return pulsante;
        }
    
        private URI getFileURI(String filePath) {
            URI uri = null;
            filePath = filePath.trim();
            if (filePath.indexOf("http") == 0 || filePath.indexOf("\\") == 0) {
                if (filePath.indexOf("\\") == 0) {
                    filePath = "file:" + filePath;
                    filePath = filePath.replaceAll("#", "%23");
                }
                try {
                    filePath = filePath.replaceAll(" ", "%20");
                    URL url = new URL(filePath);
                    uri = url.toURI();
                } catch (MalformedURLException ex) {
                    ex.printStackTrace();
                } catch (URISyntaxException ex) {
                    ex.printStackTrace();
                }
            } else {
                File file = new File(filePath);
                uri = file.toURI();
            }
            return uri;
        }
    
        public void launchFile(File file) {
            if (!Desktop.isDesktopSupported()) {
                return;
            }
            Desktop dt = Desktop.getDesktop();
            try {
                dt.open(file);
            } catch (IOException ex) {
                launchFile(file.getPath());
            }
        }
    
        public void launchFile(String filePath) {
            if (filePath == null || filePath.trim().length() == 0) {
                return;
            }
            if (!Desktop.isDesktopSupported()) {
                return;
            }
            Desktop dt = Desktop.getDesktop();
            try {
                dt.browse(getFileURI(filePath));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            launchFile(path);
        }
    }
    con questi rendere "se non ricordo male" disegnavo un jbutton in una colonna di una jtable, ma ti ripeto, se guardi nella documentazione mi sembra di ricordare che il JCheckBox è tra i "pochi" componenti che possono essere inseriti in modo semplice in una JTable

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    guarda nel tutorial della oracle, il primo esempio di JTable dice questo

    codice:
     String[] columnNames = {"First Name",
                                    "Last Name",
                                    "Sport",
                                    "# of Years",
                                    "Vegetarian"};
     
            Object[][] data = {
            {"Kathy", "Smith",
             "Snowboarding", new Integer(5), new Boolean(false)},
            {"John", "Doe",
             "Rowing", new Integer(3), new Boolean(true)},
            {"Sue", "Black",
             "Knitting", new Integer(2), new Boolean(false)},
            {"Jane", "White",
             "Speed reading", new Integer(20), new Boolean(true)},
            {"Joe", "Brown",
             "Pool", new Integer(10), new Boolean(false)}
            };
     
            final JTable table = new JTable(data, columnNames);
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));
            table.setFillsViewportHeight(true);
    e l'esempio lo trovi qui

    in questo modo in automatico ha il check per valori di true o false (senza dover fare il rendering manualmente)

    Se deve anche modificarli o renderli editabili le cose si complicano(e conviene passare per un modello che indica il tipo di dato da aspettarsi per ogni colonna).

    non so il livello di preparazione di Wolvy, ma penso che per iniziare quello fornito dalla oracle dovrebbe bastargli
    RTFM Read That F*** Manual!!!

  8. #8
    Grazie ragazzi dell'aiuto.....

    ota inserisco come valore nell'object data il boleano:
    new Boolean(false) o new Boolean(true)
    a seconda del caso,
    soltanto che, invece del checkBox viene visualizzato il valore false o true!!!

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.