Visualizzazione dei risultati da 1 a 10 su 12

Discussione: jTable

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    22

    jTable

    Buongiorno a tutti,non sono un esporto di java ma devo realizzare un progetto per l'università. In un Pannello che si apre subito dopo un clic su una tabella, inserisco traquillamente delle JLabel e delle JCombobox, andesso in questo pannello mi servirebbe una tabella con una colonna, ma non riesco prorpio ad inserirla...il codice è:

    private void PizzeMousePressed(java.awt.event.MouseEvent evt) {

    int RigaSelezionata=-1;
    String NomePizza = null;
    String Ingredienti = null;
    RigaSelezionata = Pizze.getSelectedRow();
    NomePizza = (String) Pizze.getValueAt(RigaSelezionata, 0);
    Ingredienti = (String) Pizze.getValueAt(RigaSelezionata, 1);
    int p=0;

    String[] tokens = Ingredienti.split(",|\\s");
    String[] Sottrai = new String[(tokens.length/2)+1];
    for(int i=0;i<tokens.length;i++){
    if(tokens[i].equals("")){
    System.out.println("Questo è vuoto");
    }else {
    Sottrai[p] = tokens[i];
    p++;
    }
    }



    JComboBox box2=new JComboBox(Sottrai);
    if(NomePizza!=null){
    JLabel labelNomePizza= new JLabel(NomePizza);
    JLabel labelIngredienti = new JLabel("Gli ingredienti sono:" + Ingredienti);
    JLabel label1=new JLabel("Supplementi :");
    JLabel label2=new JLabel("Sottrai :");

    label1.setHorizontalAlignment(javax.swing.SwingCon stants.LEFT);
    label2.setHorizontalAlignment(javax.swing.SwingCon stants.LEFT);

    Vector v = new Vector(3);
    v.add("Paperino");
    TableModel dataModel = new VectorTableModel(v);
    JTable t = new JTable(dataModel);

    final JComponent[] inputs = new JComponent[] {
    labelNomePizza,
    labelIngredienti,
    label1,
    box1,
    label2,
    box2,
    t
    };



    dove il codice della classe VectorTableModel è:




    public class VectorTableModel extends AbstractTableModel {


    Vector v = null;
    String[] ColName = {"Ingrediente Selezionato"};


    public VectorTableModel(Vector v) {
    this.v = v;
    }




    @Override
    public int getRowCount() {
    return v.size();
    }

    @Override
    public int getColumnCount() {
    return ColName.length;
    }

    @Override
    public Object getValueAt(int row, int col) {
    VectorIngredienti b =(VectorIngredienti)v.elementAt(row);
    return b.ingrediente;

    }
    @Override
    public String getColumnName(int col) {
    return ColName[col];
    }
    public Class getColumnClas(int col) {
    return getValueAt(0, col).getClass();
    }
    @Override
    public boolean isCellEditable(int row, int col){
    /*if ((col == 2)|| (col == 3))
    return true;
    else return false;*/
    return false;
    }
    @Override
    public void setValueAt(Object value, int row,int col) {
    VectorIngredienti b = (VectorIngredienti)v.elementAt(row);
    b.ingrediente=((String)value);
    fireTableDataChanged();
    }
    }



    e il il codice del Vector è:


    public class VectorIngredienti {
    public Object ingrediente;


    public VectorIngredienti(Object ingrediente) {
    this.ingrediente = ingrediente;

    }
    }

  2. #2
    il codice deve essere messo tra i tag [code][/code]
    altrimenti non si capisce nulla
    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

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    il codice deve essere messo tra i tag
    altrimenti non si capisce nulla
    Non solo... va anche postato indentato, altrimenti ha poco senso anche l'uso del tag CODE.

    Con l'introduzione del nuovo forum, la cosa è stata anche migliorata: è sufficiente entrare in modalità avanzata per poter avere tutti gli strumenti di editing, quindi fare clic sul pulsante "#", che automaticamente inserisce i tag appositi.

    Ciao.
    Ultima modifica di LeleFT; 01-10-2013 a 13:34
    "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

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    22
    Allora cercherò di essere più chiaro, aiutandomi anche con delle immagini.
    Io ho un menù inserito in una tabella "Pizze", cliccando su questa tabella mi si apre un pannello(utile per aggiungere o sottrare gli ingredienti) all'interno ho inserito delle JLabel e due comboBox una degli ingredienti disponibili e una degli ingredienti della pizza selezionata, adesso vorrei inserire una tabella dove vanno messi gli ingredienti selezionati nella prima combobox (ho deciso una tabella cosi non ho problemi per poi eliminarli nel caso in cui si cambia scelta), passo al codice:

    codice:
    private void PizzeMousePressed(java.awt.event.MouseEvent evt) {                                   
            
            int RigaSelezionata=-1;
            String NomePizza = null;
            String Ingredienti = null;
            RigaSelezionata = Pizze.getSelectedRow();
            NomePizza = (String) Pizze.getValueAt(RigaSelezionata, 0);
            Ingredienti = (String) Pizze.getValueAt(RigaSelezionata, 1);
            int p=0;
            
                   String[] tokens = Ingredienti.split(",|\\s");  
                   String[] Sottrai = new String[(tokens.length/2)+1];
                   for(int i=0;i<tokens.length;i++){
                      if(tokens[i].equals("")){
                          System.out.println("Questo è vuoto");
                      }else {
                          Sottrai[p] = tokens[i];
                          p++;
                      }
                  }
                  
              
          
            JComboBox box2=new JComboBox(Sottrai);
            if(NomePizza!=null){
            JLabel labelNomePizza= new JLabel(NomePizza);
            JLabel labelIngredienti = new JLabel("Gli ingredienti sono:" + Ingredienti);
            JLabel label1=new JLabel("Supplementi :");
            JLabel label2=new JLabel("Sottrai :");
            
            label1.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
            label2.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
            
             Vector v = new Vector(3); 
             v.add("Paperino");
             TableModel dataModel = new VectorTableModel(v);
             JTable table = new JTable(dataModel); 
              
            final JComponent[] inputs = new JComponent[] {
                    labelNomePizza,
                    labelIngredienti,
                    label1,
            box1,
                    label2,
                    box2,
                    table
            };
    }

    Il codice del tableModel è:

    codice:
    public class VectorTableModel extends AbstractTableModel  {
        
       
    Vector v = null;
    
    String[] ColName = {"Ingrediente Selezionato"};
    
     public VectorTableModel(Vector v) {
    this.v = v; 
    } 
    
        
    
    
        @Override
        public int getRowCount() {
            return v.size();
        }
    
        @Override
        public int getColumnCount() {
           return ColName.length;
        }
    
        @Override
        public Object getValueAt(int row, int col) {
            VectorIngredienti b =(VectorIngredienti)v.elementAt(row);
            return b.ingrediente;
    
    } 
        @Override
         public String getColumnName(int col) {
             return ColName[col];
    } 
        @Override
     public Class getColumnClass(int col) {
    return getValueAt(0, col).getClass();
    } 
        @Override
        public boolean isCellEditable(int row, int col){
           /*if ((col == 2)|| (col == 3))
               return true;
           else return false;*/
           return false;
        } 
        @Override
        public void setValueAt(Object value, int row,int col) {
             VectorIngredienti b = (VectorIngredienti)v.elementAt(row);
             b.ingrediente=((String)value);
             fireTableDataChanged();
    }
    }
    il codice del vettore è:

    codice:
    public class VectorIngredienti {
        public Object ingrediente; 
    
    
    public VectorIngredienti(Object ingrediente){//, String author, int quantity, float price) {
    this.ingrediente = ingrediente;
    
        }
    }

    Quando nel JComponent non inserisco la table ottengo:
    senza table.jpg

    Quando inserisco la table, invece di vedersi la tabella, lo sfondo diventa bianco e vedo solamente le comboBox e il tasto ok!!!A cosa è dovuto?

    Ps Naturalmente manca tutto il codice che inserisce l'ingrediente selezionato nella tabella!!!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da gmnf Visualizza il messaggio
    Quando nel JComponent non inserisco la table ottengo:
    senza table.jpg

    Quando inserisco la table, invece di vedersi la tabella, lo sfondo diventa bianco e vedo solamente le comboBox e il tasto ok!!!A cosa è dovuto?
    Quindi il JTable vuoi farlo vedere nel "message" (insieme ad altri componenti) di un JOptionPane ?? Se così, ora è chiaro!

    Innanzitutto (questo vale in generale), se in un layout inserisci solo JTable, il suo header non ce l'hai, dovresti aggiungerlo esplicitamente (usando JTable in un JScrollPane è automatico questo).

    Poi comunque se la tabella fosse inizialmente vuota allora effettivamente la sua dimensione potrebbe essere 0 (o comunque tale da non vedersi). Ma se ci sono elementi, la tabella dovrebbe avere una dimensione "preferita" tale da farli vedere.
    In ogni caso è una questione di dimensioni e dovresti comunque valutare tu se mettere JTable in un JScrollPane o no.

    P.S. fatti stampare il "preferred size" di JTable, vedi subito che dimensione ha quando è nel JOptionPane.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    22
    Ho inserito JScrollPane, ma non cambia nulla, anzi mi ritrovo un "messaggio" più grande ma sempre con lo sfondo bianco....ho fatto in questo modo:

    codice:
     Vector v = new Vector(3); 
             v.add("Paperino");
             TableModel dataModel = new VectorTableModel(v);
             JTable t = new JTable(dataModel); 
             JScrollPane scrollpane = new JScrollPane(t); 
             
            final JComponent[] inputs = new JComponent[] {
                    labelNomePizza,
                    labelIngredienti,
                    label1,
                    box1,
                    label2,
                    box2,
                    t
                    
            };
    Ho stampato il t.preferredSize() che corrisponde a: [width=15,height=16], e quello dello ScrollPane che è: [width=456,height=406];
    Inoltre ho cercato di usare il metodo setSize ma non succede nulla.

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da gmnf Visualizza il messaggio
    Buongiorno a tutti,non sono un esporto di java ma devo realizzare un progetto per l'università. In un Pannello che si apre subito dopo un clic su una tabella, inserisco traquillamente delle JLabel e delle JCombobox, andesso in questo pannello mi servirebbe una tabella con una colonna, ma non riesco prorpio ad inserirla
    Quale è il problema esatto del "inserirla"? Non l'hai detto e dal codice non si evince facilmente il contesto di uso/inserimento di questa tabella.

    Inoltre ti segnalo che fireTableDataChanged nel setValueAt non è di per sé sbagliato ... è solo molto più "radicale" (aggiorna *tutto*). Visto che cambia solo una cella, basterebbe fireTableCellUpdated(row, col); .

    E public Class getColumnClas(int col) il nome non è corretto (manca una 's'), quindi non hai fatto un override. E comunque sarebbe preferibile restituire il Class "letterale" cioè String.class, perché se il Vector è vuoto tra l'altro avresti una eccezione.
    Ultima modifica di andbin; 01-10-2013 a 12:12
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    22
    ok ci gioco un pò, grazie per il supporto!!!!

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.