Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 36
  1. #1

    [Java][Jtable] Jtable di jtextpane...

    Devo implementare un applicazione per l'elaborazione di stringhe...il modello della jtable si carica un blocco di stringhe per volta , quindi i dati su cui lavorare e da visualizzare nelle celle della jtable sono stringhe collezionate in un Vector...
    a questo punto io dovrei poter editare queste stringhe da interfaccia grafica...tipo selezionare il testo ed evidenziare il testo selezionato per una successiva elaborazione...
    tra i campi di testo, il + interessante sembra il jtextpane per il fatto che è + editabile...

    A questo punto la mia domanda come faccio a fare il rendering delle celle con dei jtextpane conall'interno stringhe da modificare?Si può fare?...

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Se vuoi usare un componente swing dentro una cella, devi scriverti un CellRenderer. Pero' il tuo Vector non dovra' contenere Stringhe, ma JTextPane. Infatti se nel Vector hai solo le stringhe, puoi far in modo attraverso un CellRenderer che la stringa ti venga visualizzata dentro un JTextPane, ma perdi la formattazione del carattere.
    Se quello che ti serve pero' e' solo poter rendere editabile la tabella, non occorre che usi JTextArea. Il TableModel te lo sei scritto da solo? In genere basta sovrascrivere correttamente i metodi isCellEditable() e setValueAt(). Il primo in modo che ti restituisca true, il secondo in modo che modifichi il valore nella struttura dati dentro il tableModel (nel tuo caso il Vector). ESEMPIO

  3. #3
    Grazie per la risposta...avevo pensato ank'io al vector di jtextpane...il modello l'ho scritto io e diciamo ke contiente la struttura dei dati sui quali devo lavorare...io pensavo che il jtext pane potevo spefificarlo al momento del rendering delle celle senza impostarlo prima nel modello della tabella...cmq adesso provo a fare così.
    Alla fine ho optato per il text pane perkè il testo al suo interno è più facilmente editabile e perchè ha + funzionalità grafiche che mi servono rispetto ad un componenete + semplice...
    grazie per la risposta. ciao

  4. #4
    ciao simo7784 scusa una cosa, approfitto visto che stavate parlando di JTable..
    io mi sono scritto un modello MyTableModel extends AbstractTableModel

    che metodo ci devo mettere dentro questa classe affinchè mi cancelli una riga della JTable.

    non posso usare removeRow(i) del DefaultTableModel?

    ciao e grazie

  5. #5
    penso che tu possa benissimo utilizzare il metodo di rimozione direttamente sulla struttura dati che utilizzi per la memorizzazione dei dati della jtable..

  6. #6
    ciao marbio17..ti ringrazio per avermi risposto, ma non ho ben capito che devo fare...
    sono giorni che provo invano ad informarmi su come si faccio un refresh della JTable senza nessun esito..

    quando hai postato
    "penso che tu possa benissimo utilizzare il metodo di rimozione direttamente sulla struttura dati che utilizzi per la memorizzazione dei dati della jtable.."

    cioè che dovrei fare..

  7. #7
    sono giorni che provo invano ad informarmi su come si faccio un refresh della JTable senza nessun esito..
    hai provato con il metodo repaint() sulla finestra che contiene la jtable...



    cioè che dovrei fare..

    devi eliminare il la cella/dato di interesse direttamente dalla struttura dati (matrice, vector,...)
    che tieni nella classe del modello...i dati del modello rappresentano effettivamente i dati della tabella!

  8. #8
    Buongiorno marbio17, facciamo così, adesso posto un pò di codice, dimmi dove metteresti il repaint()..

    allora mi sono costruito un Layout a casella, quindi la mia JTable sta in un box orizzontale.

    codice:
    Box b5= Box.createVerticalBox();			
    Box b6= Box.createHorizontalBox();
    		
    	b6.add(new JLabel("Contenuti presenti nel database"));
    	b5.add(b6);
    	b5.add(Box.createVerticalStrut(5));
    		
    	//JTable
    	b6=Box.createHorizontalBox();
    
    	//classe che mi gestisce la tabella
    	MyTableModel model = new MyTableModel(); 
    
    	table.setFillsViewportHeight(true);//mi rende la parte senza valori dello stesso colore
    	
    
    	initColumnSizes(table);//setta la larghezza delle colonne.
    		
    	table.setRowSelectionAllowed(true);
    	table.setColumnSelectionAllowed(false);
    	table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
            
            
            jsp= new JScrollPane();
    	jsp.getViewport().add(table);//metto alla tabella uno scrollpane
    		
    	b6.add(jsp);
            b5.add(b6);//aggiunta la tabella
    //Classe che gestisce la tabella JTable

    codice:
    	
    	class MyTableModel extends AbstractTableModel {
    		
    	private TableColumn column = null;
    	private Object[][] data;//matrice di oggetti
            private String[] columnNames = {"Titolo", // titoli delle colonne
                                            "Autore",
                                            "Tipologia",
                                            "Nome file",
                                            "Mb",
                                            "Supporto",
                                            "Indice",
                                            "Commenti"};
                   
    	public MyTableModel(){
    		
    		
    		
    		temp =mt.trova();//metodo che mi raccoglie i dati dopo una query al DB
    		data=new Object[temp.length][8];
    		
    		for(int i=0;i<temp.length;i++){
    			
    			
    			
    		data[i][0]=temp[i].getTitolo();
    			data[i][1]=temp[i].getAutore();
    				data[i][2]=temp[i].getTipologia();
    					data[i][3]=temp[i].getNome_file();
    						data[i][4]=temp[i].getDimensione();
    						    data[i][5]=temp[i].getSupporto();
    						        data[i][6]=temp[i].getIdsupporto();
    						             data[i][7]=temp[i].getCommento();
    		
    					                  
    }
    
    }
    
    
    
    	
            public int getColumnCount() {
               return columnNames.length;
            }
    
            public int getRowCount() {
                return data.length;
            }
    
            public String getColumnName(int col) {
                return columnNames[col];
            }
    
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
    
            /*
             * JTable uses this method to determine the default renderer/
             * editor for each cell.  If we didn't implement this method,
             * then the last column would contain text ("true"/"false"),
             * rather than a check box.
             */
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
    
            /*
             * questo metodo rende le celle editabili
             */
            public boolean isCellEditable(int row, int col) {
                
                return true;
                //if (col < 2) {
                //    return false;
                //} else {
                //    return true;
                //}
            }
    
            /*
             * Don't need to implement this method unless your table's
             * data can change.
             */
            public void setValueAt(Object value, int row, int col) {
                if (DEBUG) {
                    System.out.println("Setting value at " + row + "," + col
                                       + " to " + value
                                       + " (an instance of "
                                       + value.getClass() + ")");
                }
    
                data[row][col] = value;
                fireTableCellUpdated(row, col);
    
                if (DEBUG) {
                    System.out.println("New value of data:");
                    printDebugData();
                }
            }
    
            private void printDebugData() {
                int numRows = getRowCount();
                int numCols = getColumnCount();
    
                for (int i=0; i < numRows; i++) {
                    System.out.print("    row " + i + ":");
                    for (int j=0; j < numCols; j++) {
                        System.out.print("  " + data[i][j]);
                    }
                    System.out.println();
                }
                System.out.println("--------------------------");
            }
        }
    e questo è l'action listener del pulsante "cancella" che mi fa sparire i dati dal database ma non la riga selezionata, quindi non fa il refresh.

    codice:
    if (o instanceof JButton) {
    			if(o==cancella){
    				
    				try{
    					if(table.getSelectedRow()==-1){//se non hai selezionato niente
    					JOptionPane.showMessageDialog(null,"Non hai selezionato niente", "Attenzione",JOptionPane.ERROR_MESSAGE);
    					}else{
    				        int temp[] = table.getSelectedRows();//creo l'array delle righe selezionate
    					
    					int i=0;
    					
    					while (i<temp.length){
    						String titolo = (String)table.getValueAt(temp[i],0);
    						String autore = (String)table.getValueAt(temp[i],1);
    						String tipologia = (String) table.getValueAt(temp[i],2);
    					        String nome_file = (String) table.getValueAt(temp[i],3);
    				                int dimensione = (Integer)table.getValueAt(temp[i],4);
    				     	        String supporto = (String) table.getValueAt(temp[i],5);
    					        String idsupporto = (String) table.getValueAt(temp[i],6);
    					        String commento = (String) table.getValueAt(temp[i],7);
    						
    				VoceDistributore v=new VoceDistributore(titolo,autore,tipologia,nome_file,dimensione,supporto,idsupporto,commento);
    				
    					    mt.cancella(v); //chiamo il metodo per la cancellazione sul db che funziona
    					    
    				
    						i++;
    					
    					}
    					new MyTableModel();//qui ho provato a richiamare la classe per ricaricare i dati
    						
    				}
    				
    			}
    				catch(VoceAssente e){
    									
    					
    					JOptionPane.showMessageDialog(null,"Non esiste l'oggetto selezionato", "Attenzione",JOptionPane.ERROR_MESSAGE);
    	
    				
    				}
    			}
    ecco io adesso come faccio a fare sto benedetto refresh con questa situazione..sto uscendo pazzo eh eh..
    ciao e grazie

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Puoi metterlo nell'actionListener. Stai attento che, come ti e' stato suggerito, devi togliere la riga dalla struttura dati nel TableModel prima di fare il repaint.
    codice:
    new MyTableModel();
    questa riga da sola non fa niente.
    Per semplicita rimpiazzerei la matrice con un ArrayList di String[] che e' piu' facile da manipolare. Poi crei nel model un metodo remove(int row) che si occupa di eliminare la riga dalla struttura dati (puoi mettere qua il metodo fireTableDataChanged() che fa il refresh della tabella, altrimenti chiami il repaint nell'actionListener) e nell'ActionListener chiami il remove del model.
    Faccio un esempio banale.
    codice:
    package table;
    
    import java.util.ArrayList;
    import javax.swing.table.AbstractTableModel;
    
    public class MyModel extends AbstractTableModel {
        private ArrayList data;
    
        public MyModel() {
            data = new ArrayList();
            //Ho dei risultati, ottenuti in qualsiasi modo, e con questi popolo la lista.
            String[][] fingoDiEssereUnRS= new String[][]{{"a","s","d"},{"q","w","e"},{"z","x","c"}};
            for(int i=0; i<fingoDiEssereUnRS.length; i++) {
                data.add(fingoDiEssereUnRS[i]);
            }
        }
    
        public int getRowCount() {
            return data.size();
        }
    
        public int getColumnCount() {
            return ((String[])data.get(0)).length;
        }
    
        public Object getValueAt(int rowIndex, int columnIndex) {
            return ((String[])data.get(rowIndex))[columnIndex];
        }
        
        public void remove(int row) {
            data.remove(row);
            this.fireTableDataChanged();
        }
    }
    codice:
    package table;
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class NewTable extends JFrame implements ActionListener{
        private JScrollPane scroll;
        private JTable table;
        private JButton b;
        private MyModel model;
        
        public NewTable() {
            model = new MyModel();
            table =new JTable(model);
            scroll = new JScrollPane(table);
            this.add(scroll, BorderLayout.CENTER);
            b = new JButton("click me!");
            b.addActionListener(this);
            this.add(b, BorderLayout.SOUTH);
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            this.pack();
        }
        
        public void actionPerformed(ActionEvent e) {
            //Per semplicita' rimuovo la prima riga, ma e' il concetto che conta.
            model.remove(0);
        }
        
        public static void main(String[] args) {
            NewTable test = new NewTable();
            test.setVisible(true);
        }
    }

  10. #10
    allora ho un problema..ho messo il metodo per rimuovere una riga nel mio modello ma mi da errore

    //Classe che gestisce la tabella JTable
    codice:
    	class MyTableModel extends AbstractTableModel {
    		
    	private TableColumn column = null;
    	private Object[][] data;//matrice di oggetti
            private String[] columnNames = {"Titolo", // titoli delle colonne
                                            "Autore",
                                            "Tipologia",
                                            "Nome file",
                                            "Mb",
                                            "Supporto",
                                            "Indice",
                                            "Commenti"};
                   
    	public MyTableModel(){
    		
    		
    		
    		temp =mt.trova();//metodo che mi raccoglie i dati dopo una query al DB
    		data=new Object[temp.length][8];
    		
    		for(int i=0;i<temp.length;i++){
    			
    			
    			
    		data[i][0]=temp[i].getTitolo();
    			data[i][1]=temp[i].getAutore();
    				data[i][2]=temp[i].getTipologia();
    					data[i][3]=temp[i].getNome_file();
    						data[i][4]=temp[i].getDimensione();
    						    data[i][5]=temp[i].getSupporto();
    						        data[i][6]=temp[i].getIdsupporto();
    						             data[i][7]=temp[i].getCommento();
    		
    					                  
    }
    
    }
    
    
    
    	
            public int getColumnCount() {
               return columnNames.length;
            }
    
            public int getRowCount() {
                return data.length;
            }
    
            public String getColumnName(int col) {
                return columnNames[col];
            }
    
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
    
         
    
        public void remove(int row) {
            data.remove(row); //qua mi dice java:413: cannot find symbol
                                     //symbol  : method remove(int)
                                   //location: class java.lang.Object[][]
            this.fireTableDataChanged();
        }
    
    
            /*
             * JTable uses this method to determine the default renderer/
             * editor for each cell.  If we didn't implement this method,
             * then the last column would contain text ("true"/"false"),
             * rather than a check box.
             */
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
    
            /*
             * questo metodo rende le celle editabili
             */
            public boolean isCellEditable(int row, int col) {
                
                return true;
                //if (col < 2) {
                //    return false;
                //} else {
                //    return true;
                //}
            }
    
            /*
             * Don't need to implement this method unless your table's
             * data can change.
             */
            public void setValueAt(Object value, int row, int col) {
                if (DEBUG) {
                    System.out.println("Setting value at " + row + "," + col
                                       + " to " + value
                                       + " (an instance of "
                                       + value.getClass() + ")");
                }
    
                data[row][col] = value;
                fireTableCellUpdated(row, col);
    
                if (DEBUG) {
                    System.out.println("New value of data:");
                    printDebugData();
                }
            }
    
            private void printDebugData() {
                int numRows = getRowCount();
                int numCols = getColumnCount();
    
                for (int i=0; i < numRows; i++) {
                    System.out.print("    row " + i + ":");
                    for (int j=0; j < numCols; j++) {
                        System.out.print("  " + data[i][j]);
                    }
                    System.out.println();
                }
                System.out.println("--------------------------");
            }
        }
    e poi nell'action listener avrei fatto così, ditemi se è corretto:
    codice:
    if (o instanceof JButton) {
    			if(o==cancella){
    				
    				try{
    					if(table.getSelectedRow()==-1){//se non hai selezionato niente
    					JOptionPane.showMessageDialog(null,"Non hai selezionato niente", "Attenzione",JOptionPane.ERROR_MESSAGE);
    					}else{
    				        int temp[] = table.getSelectedRows();//creo l'array delle righe selezionate
    					
    					int i=0;
    					
    					while (i<temp.length){
    						String titolo = (String)table.getValueAt(temp[i],0);
    						String autore = (String)table.getValueAt(temp[i],1);
    						String tipologia = (String) table.getValueAt(temp[i],2);
    					        String nome_file = (String) table.getValueAt(temp[i],3);
    				                int dimensione = (Integer)table.getValueAt(temp[i],4);
    				     	        String supporto = (String) table.getValueAt(temp[i],5);
    					        String idsupporto = (String) table.getValueAt(temp[i],6);
    					        String commento = (String) table.getValueAt(temp[i],7);
    						
    				VoceDistributore v=new VoceDistributore(titolo,autore,tipologia,nome_file,dimensione,supporto,idsupporto,commento);
    				
    					    mt.cancella(v); //chiamo il metodo per la cancellazione sul db che funziona
    					    
    				model.remove(i);//richiamo il metodo del modello 
    						i++;
    					
    					}
    					
    						
    				}
    				
    			}
    				catch(VoceAssente e){
    									
    					
    					JOptionPane.showMessageDialog(null,"Non esiste l'oggetto selezionato", "Attenzione",JOptionPane.ERROR_MESSAGE);
    	
    				
    				}
    			}

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 © 2024 vBulletin Solutions, Inc. All rights reserved.