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

    [Java] Problema con Jcombobox setSelectedItem

    cerco di spiegarvi la situazione.
    con questo metodo passo i dati da una riga di una JTable ad un altro JFrame:
    codice:
    ArrayList<String> list = new ArrayList<String>();
                    int numCol = model.getColumnCount();
                    Object value = null;
                    for (int i = 0; i < numCol; i++) {
                        value = tableData.getValueAt(tableData.getSelectedRow(), i);
                        list.add(value.toString());
                    }
                    FormModifica form = new FormModifica(list);
                    form.setVisible(true);
    nel frame:
    codice:
    public class FormModifica extends javax.swing.JFrame {
    
        private DBManager dbman = DBManager.getInstance();
        private String[] valori;
        private String id;
        private String name;
        private String author;
        private String editor;
        private String price;
        private String isbn;
        private String note;
    
        public FormModifica(ArrayList<String> list) {
            valori = (String[]) list.toArray(new String[list.size()]);
            id = valori[0];
            name = valori[1];
            author = valori[2];
            editor = valori[3];
            price = valori[4];
            isbn = valori[5];
            note = valori[6];
            initComponents();
            setLocationRelativeTo(null);
        }
    .....
    e fin qui tutto bene.
    in questo frame ho una jcomboxo che riempi da db mysql:
    codice:
        public ArrayList fillAuthor() throws SQLException, ClassNotFoundException, IOException {
            ArrayList list = new ArrayList();
            conn = DBManager.getInstance().takeConnection();
            CallableStatement cstmt = conn.prepareCall("{ CALL getAuthor() }");
            ResultSet rs = cstmt.executeQuery();
            while (rs.next()) {
                list.add(new ModelAuthor(rs.getInt("author_id"), rs.getString("author_name")));
            }
            cstmt.close();
            return list;
        }
    codice:
        private void fillAuthor() throws SQLException, ClassNotFoundException, IOException {
            comboAuthor.addItem("*");
            ArrayList listA = dbman.fillAuthor();
            for (Object objA : listA) {
                comboAuthor.addItem(objA);
            }
            comboAuthor.setSelectedItem(author); // non funziona
        }
    anche qiu tutto bene.
    quello che nn riesco a fare è settare l'item di default uguale alla String author.
    in pratica la JCombo si riempie tranquillamente, al jframe arriva il valore author senza problemi ma poi nn lo setta.
    dove sbaglio??

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    scusa ma l'oggetto author esiste nella lista del combo???

  3. #3
    si!!
    in pratica è l'autore del libro.
    è lo stesso che prendo dalla specifica colonna della JTable.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    vedi che non mi hai capito, allora guarda qui
    codice:
    private void fillAuthor() throws SQLException, ClassNotFoundException, IOException {
            comboAuthor.addItem("*");
            ArrayList listA = dbman.fillAuthor();
            for (Object objA : listA) {
                comboAuthor.addItem(objA);
            }
            comboAuthor.setSelectedItem(author); // non funziona
        }
    non so se la lista del combo era piena oppure no, ma qui fai che prima aggiungi l'item *, poi aggiungi tutti gli oggetti della lista (e attenzione non si sa se sono stringhe oppure no e soprattutto la tua fillAuthor non riferisce il tuo oggetto author e infine tenti di settare il tutto passando un oggetto che la combo non conosce (perché non ha il riferimento a quell'oggetto nella lista associata), per cui tu impazzisci perché per te l'autore esiste (ne esiste il contenuto), ma in generale non esiste il riferimento quindi non riesci ad ottenere il comportamento da te voluto.

    Ti potrebbe andare meglio usando l'indice, usando liste tipizzate e prendendo l'indice dell'autore (in modo da essere sicuro di contenere l'elemento)

  5. #5
    ok scusa avevo capito un'altra cosa.
    la lista della combo è piena.
    il metodo con cui la recupero è questa:
    codice:
        public ArrayList fillAuthor() throws SQLException, ClassNotFoundException, IOException {
            ArrayList list = new ArrayList();
            conn = DBManager.getInstance().takeConnection();
            CallableStatement cstmt = conn.prepareCall("{ CALL getAuthor() }");
            ResultSet rs = cstmt.executeQuery();
            while (rs.next()) {
                list.add(new ModelAuthor(rs.getInt("author_id"), rs.getString("author_name")));
            }
            cstmt.close();
            return list;
        }
    qui interrogo il db e riempio un oggetto ModelAuthor:
    codice:
    package com.mattepuffo.book;
    
    public class ModelAuthor {
    
        private int id;
        private String name;
    
        public ModelAuthor(String name) {
            this.name = name;
        }
    
        public ModelAuthor(int id, String name) {
            this.id = id;
            this.name = name;
        }
    
        public int getId() {
            return id;
        }
    
        @Override
        public String toString() {
            return name;
        }
    }
    nel JFrame metto prima l'asterisco per fare in modo che venga scelto per forza un autore.
    è una cosa che potrei levare se riuscissi a settare l'autore giusto in apertura.

    cmq mettendo così sembra che riesca a settare la voce giusta:
    codice:
        private void fillAuthor() throws SQLException, ClassNotFoundException, IOException {
    //        comboAuthor.addItem("*");
            ArrayList listA = dbman.fillAuthor();
            for (Object objA : listA) {
                comboAuthor.addItem(objA.toString());
            }
            comboAuthor.setSelectedItem(new ModelAuthor(author).toString());
        }
    in effetti prima objA poteva essere qualsiasi cosa.
    grazie per la dritta!

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    attento che concettualmente è sbagliato:

    codice:
    public ArrayList fillAuthor() throws SQLException, ClassNotFoundException, IOException {
            ArrayList list = new ArrayList();
            conn = DBManager.getInstance().takeConnection();
            CallableStatement cstmt = conn.prepareCall("{ CALL getAuthor() }");
            ResultSet rs = cstmt.executeQuery();
            while (rs.next()) {
                list.add(new ModelAuthor(rs.getInt("author_id"), rs.getString("author_name")));
            }
            cstmt.close();
            return list;
        }
    Non ti serve fare questo giro, perché se utilizzi liste tipizzate (e in questo caso hai string quindi ti aiuta parecchio) ti basta fare una cosa del tipo

    codice:
      combo.setSelectedIndex(list.indexOf(author));
    aggiungendo all'indice 1 nel caso in cui metti l'asterisco iniziale.
    Ricorda di essere sicuro che list.indexOf ritorni un valore >= 0 (altrimenti hai eccezione) e ti funziona (io usavo sempre sto giro)

  7. #7
    scusa probabilmente nn mi sono spiegtao bene perchè ho messo i nomi dei metodi uguali e nn ho specificato le classi di appartenenza.
    il metodo
    codice:
    public class DBManager {
    ............
    public ArrayList fillAuthor() throws SQLException, ClassNotFoundException, IOException {
            ArrayList list = new ArrayList();
            conn = DBManager.getInstance().takeConnection();
            CallableStatement cstmt = conn.prepareCall("{ CALL getAuthor() }");
            ResultSet rs = cstmt.executeQuery();
            while (rs.next()) {
                list.add(new ModelAuthor(rs.getInt("author_id"), rs.getString("author_name")));
            }
            cstmt.close();
            return list;
        }
    nn sta dentro al JFrame dove riempo la combo, ma nella classe che gestice le operazioni del db.
    poi dentro al JFrame:
    codice:
    public class FormModifica extends javax.swing.JFrame {
    ........
    private DBManager dbman = DBManager.getInstance();
    .......
        private void fillAuthor() throws SQLException, ClassNotFoundException, IOException {
            ArrayList listA = dbman.fillAuthor();
            for (Object objA : listA) {
                comboAuthor.addItem(objA.toString());
            }
            comboAuthor.setSelectedItem(new ModelAuthor(author).toString());
        }
    vale ancora quanto mi hai detto??

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    non ci siamo capiti.
    ComboBox sfrutta una lista per mantenere i suoi dati. Il setSelectedItem va bene se quell'oggetto che tu passi si trova nella lista, altrimenti no.
    Cosi ne crei uno nuovo e ne fai il toString e cmq non va perchè sono oggetti differenti (l'unico modo con cui lavori se non vai a specificare il tipo è Object e Object lavora coi riferimenti)

  9. #9
    uhm sono un pò confuso.
    o meglio, quello che nn riesco a capire è dove sto sbagliando.
    se nel metodo che interroga il db o nel metodo che dovrebbe riempire la combo.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    quello con cui alla fine fai la setSelectedItem, sbagli l'oggetto che gli passi perchè quell'oggetto non lo hai mai inserito!!1

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.