Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 30
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    16

    [JAVA]jlabel in jtable

    ciao a tutti, volevo chiedervi se era possibile inserire una label o cmq un'immagine in una tabella?io devo visualizzare un database e volevo aggiungere alla tabella esistente una colonna chiamata cancella dove poter visualizzare una immagine, in modo che cliccando sull'img posso dirgli di cancellare la determinata riga...c'č un modo per farlo?ho gia provato ma non sono riuscita..e ho provato ad usare la ricerca ma non mi andava grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    E' possibile. Faccio un caso generico che comprende qualsiasi JComponent.
    Primo: implementare DefaultTableCellRenderer(per visualizzare il componente)
    codice:
    import java.awt.Component;
    import javax.swing.JComponent;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
    
    public class PanelRender extends DefaultTableCellRenderer {
        
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if(value instanceof JComponent) {
                return (JComponent)value;
            } else {
                return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            }
        } 
    }
    Secondo: implemenatere TableCellEditor(per intercettare l'editing e passare il click al Jcomponent)
    codice:
    import java.awt.Component;
    import javax.swing.AbstractCellEditor;
    import javax.swing.JComponent;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.table.TableCellEditor;
    
    public class PanelEditor extends AbstractCellEditor implements TableCellEditor {
            private JComponent panel = null;	
    	
            public Object getCellEditorValue() {
    		return panel;
    	}
    		
    	public Component getTableCellEditorComponent(JTable table, Object value,
    		boolean isSelected, int row, int column) {
    		panel = (JComponent)value;
    		return panel;
    	}
    }
    A questo punto hai tutti gli strumenti. Faccio un esempio per spiegarti il funzionamento.
    codice:
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;
    
    
    public class NewClass {
        
        public static void main(String[] args) {
    
            //Creo due JComponent, in questo caso bottoni dove potresti inserire l'immagine
            JButton button = new JButton("Qua ci metti l'img");
            JButton button2 = new JButton("Qua ci metti l'img");
    
            //Aggiungo dei listener ai bottoni, al loro interno andra' il codice per la rimozione
            button.addActionListener( new ActionListener() {
                public void actionPerformed(ActionEvent  e) {
                    System.out.println("Simo");
                }
            } );
            button2.addActionListener( new ActionListener() {
                public void actionPerformed(ActionEvent  e) {
                    System.out.println("Simo2");
                }
            } );
    
            //Valori delle celle. Notare: passo anche i bottoni nella terza colonna
            Object[][] tableData = {
                { "1", "2", button },
                { "3", "4", button2 },
            };
            //Nomi delle colonne
            Object[] tableHeaders = {"A", "B", "Cancella"};
    
            // Creo il modello della tabella e l'applico ad un istanza di Jtable
            TableModel tableModel = new DefaultTableModel(tableData, tableHeaders);
            JTable table = new JTable();
            table.setModel(tableModel);
    
            // Alla terza colonna,identificata per nome, applico l'editor e il render personalizzati.
            table.getColumn("Cancella").setCellRenderer(new PanelRender());
            table.getColumn("Cancella").setCellEditor(new PanelEditor());
            table.setRowHeight(40); //Metto un altezza che mi consenta di vedere tutto il bottone
            
            // Mando tutto a video
            JScrollPane tableScroller = new JScrollPane(table);
            JFrame window = new JFrame("Test");
            window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            window.add(tableScroller, BorderLayout.CENTER);
            window.pack();
            window.setVisible(true);
        }
    }
    Guarda se questo esempio con qualche modifica fa al caso tuo.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    16
    grazie mille!!domani ci do un'occhiata e vedo se riesco ad adattarla, grazie ancora

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    16
    grazie ancora, sono riuscita ad adattarla. grande

  5. #5
    Salve ho letto il codice sopra e l'ho anche usato, ottimo.
    Ho il seguente problema perō:

    Ho utilizzato il codice per costruirmi un atabella che ha 2 colonne e n righe. Nella prima colonna ho inserito delle JLabel con delle immagini, nella seconda ho inserito dei JScrollPane che hanno a loro volta una JTextArea dentro.
    Tutto questo lavoro lo faccio fare ad una classe che mi restituisce la cosa voluta.
    La costruzione viene fatta quando clicco su di un JButton (ho messo un ActionListener)
    e la tabella viene messa dentro un JScrollPane.
    Fin qui tutto OK.
    Il problema č che non fiene fattoil refresh della tabella, infatti per vedere i risultati riduco ad icona, ingrandisco e allora compaiono i risulati.
    Ho provato a fare updateUI() nella classe che costruisce la tabella o alJScrollPane che contiene la tabella ma niente.
    Mi sapreste dire il perchč e come posso risolverslo?

    Grazie mille

  6. #6
    prova a richiamare il metodo repaint() sulla JTable
    Al mio segnale... scatenate l'inferno!

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Ciao, che tipo di modifica fai alla tabella? Togli delle righe o cambi i valori delle celle?
    Prova
    codice:
    tuoTableModel.fireTableDataChanged()
    oppure
    codice:
    tuoTableModel.fireTableStructureChanged()
    //EDIT:Non usare perche' rimuove i Renderer personalizzati che devono essere riassegnati
    EDIT: Dimenticavo, se tuoTableModel e' di tipo TableModel, devi castare a DefaultTableModel
    codice:
    ((DefaultTableModel)tableModel).fireTableDataChanged();
    Altrimenti puoi utilizzare metodo suggerito da R@ve M@ster.

  8. #8
    Scusate la mia ignoranza ma nč repaint() nč gli altri metodi funzionano.

    ((DefaultTableModel)tableModel).fireTableDataChang ed();
    non lo vede nemmeno come aiuto l'editor.

    Come faccio

  9. #9
    dimenticavo; alla tabella vado a sostituire tutte le righe e le colonne con nuove foto e nuove informazioni

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Beh, a questo punto posta il codice. A me va sia repaint() che l'altro metodo.

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.