JList multiple

di il
7 risposte

JList multiple

Ciao a tutti!
Sto lavorando su un progetto universitario riguardante java e VHDL. Il mio widget 4 Jlist, 3 Jbutton e un JTextField,esso permette di inserire le stringhe dal textfield nelle liste selezionate. Le stringhe inserite poi devono essere selezionate e scritte su un file di uscita(in estensione VHDL), e' una specie di assistente che semplifica la scrittura del codice.
Il mio problema e': riesco ad inserire le stringhe solo in una delle 4 JList, quindi non so come effettuare l'inserimento sulla lista selezionata.
Ho pensato di usare MouseListener per selezionare una delle 4 liste e ListSelectionListener per effettuare l'inserimento della stringa nella lista selezionata.
Forse, sto sbagliando approccio Vorrei sapere cosa ne pensate.
Grazie per il vostro aiuto!

Ho allegato l'immagine con la UI.
Allegati:
25570_2060a1ea645f975e699cc8ce3e921e4d.png
25570_2060a1ea645f975e699cc8ce3e921e4d.png

7 Risposte

  • Re: JList multiple

    Un suggerimento: usa una variabile di tipo JList per memorizzare il riferimento alla JList "attualmente selezionata". Quindi, grosso modo:
    
    private JList listaEntity;      // La tua lista ENTITY
    private JList listaComponent;   // La tua lista COMPONENT
    private JList listaSignal;      // La tua lista SIGNAL
    private JList listaPort;        // La tua lista PORT;
    
    private JList selectedList;     // la lista "attualmente selezionata"
    
    Inizialmente puoi prevedere che la lista selezionata sia la lista ENTITY, quindi al riferimento assegnerai listaEntity, poi, quando l'utente fa clic col mouse sopra una delle liste, andrai ad aggiornare questo riferimento (sarebbe "utile" all'utente sapere quale lista è attualmente selezionata, magari colorandone il bordo o in altro modo, vedi tu). Su ciascuna JList, quindi, puoi sfruttare il ListSelectionListener che hai già registrato per fargli fare questo "di più":
    
    public void valueChanged(ListSelectionEvent lse) {
       if ( !lse.getValueIsAdjusting() ) {
          ...   // Fai quel che vuoi fare alla notifica di selezione da parte dell'utente
    
          // Imposta come "attualmente selezionata" la JList su cui l'utente ha cliccato
          selectedList = (JList) lse.getSource();
       }
    }
    
    A questo punto, gli inserimenti delle stringe le farai solo ed esclusivamente tramite il riferimento alla selectedList:
    
    // E' il clic sul pulsante ADD
    public void actionPerformed(ActionEvent) {
       // Non so che ListModel tu abbia usato...
       ((TuoListModel) selectedList.getModel()).inserisci( ... );
    }
    
    Ciao.
  • Re: JList multiple

    Ciao LeleFT, ho provato ad usare ListSelectionListener nel modo in cui mi hai suggerito ed ho ottenuto un risultato strano.
    Ho provato ad implementare un MouseListener che dovrebbe farmi cambiare la lista ma non capisco perche' le stringhe continuano ad essere inserite nell'ultima list.
    
    lass ClickListener implements MouseListener {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    JList list = (JList) e.getSource();
                    if (list == entList) {
                        selectedList = entList;
                    } else if (list == compList) {
                        selectedList = compList;
                    } else if (list == sigList) {
                        selectedList = sigList;
                    } else {
                        selectedList = portList;
                    }
                    int index = selectedList.locationToIndex(e.getPoint());
                    selectedList.setSelectedIndex(index);
                }
            }
       }
    [/code
  • Re: JList multiple

    Incolla il codice nella finestra di risposta, selezionalo e clicca sul pulsante </>
    verrà formattato come codice, non usare immagini.
  • Re: JList multiple

    Inanzitutto, è corretto MouseListener perchè se la lista su cui l'utente clicca è vuota, non viene scatenato un cambio di selezione (ovvio), quindi il ListSelectionListener non verrebbe notificato.

    Poi, tutte quelle if non ti servono a nulla (se sei certo che il MouseListener sia stato registrato solo sulle liste e non su altro):
    
    @Override
    public void mouseClicked(MouseEvent me) {
       selectedList = (JList) me.getSource();
       ... // altro tuo codice operativo
    }
    
    E questo dovrebbe essere sufficiente.

    Per capire il perchè delle stringhe che vengono inserite sempre sulla stessa lista, dovresti farci vedere il codice dell'inserimento (immagino sia il actionPerformed del pulsante ADD).

    Ciao.
  • Re: JList multiple

    Mi da' errore sul primo if quando cerco di effettuare l'inserimento della stringa ma poi essa va inserita nella PORT list.
    
    public void valueChanged(ListSelectionEvent e) {
            if (!e.getValueIsAdjusting()) {
    
                if (selectedList.getSelectedIndex() == -1) {
                    //No selection, disable fire button.
                    removeButton.setEnabled(false);
    
                } else {
                    //Selection, enable the fire button.
                    removeButton.setEnabled(true);
                }
            }
        }
    
    Questo e' il codice del actionPerformed.
    
    class AddListener implements ActionListener, DocumentListener {
            private boolean alreadyEnabled = false;
            private JButton button;
    
            AddListener(JButton button) {
                this.button = button;
            }
    
            //Required by ActionListener.
            public void actionPerformed(ActionEvent e) {
                String name = textField.getText();
                
                if (name.equals("") || alreadyInList(name)) {
                    Toolkit.getDefaultToolkit().beep();
                    textField.requestFocusInWindow();
                    textField.selectAll();
                    return;
                }
    
                int index = selectedList.getSelectedIndex(); //get selected index
                if (index == -1) { //no selection, so insert at beginning
                    index = 0;
                } else {           //add after the selected item
                    index++;
                }
                //listModel take textField.getText();
                listModel.insertElementAt(name, index);
                //If we just wanted to add to the end, we'd do this:
                //listModel.addElement(employeeName.getText());
    
                //Reset the text field.
                textField.requestFocusInWindow();
                textField.setText("");
    
                //Select the new item and make it visible.
                selectedList.setSelectedIndex(index);
                selectedList.ensureIndexIsVisible(index);
            }
            
            boolean alreadyInList(String name) {
                return listModel.contains(name);
            }
    
            //Required by DocumentListener.
            public void insertUpdate(DocumentEvent e) {
                enableButton();
            }
    
            //Required by DocumentListener.
            public void removeUpdate(DocumentEvent e) {
                handleEmptyTextField(e);
            }
    
            //Required by DocumentListener.
            public void changedUpdate(DocumentEvent e) {
                if (!handleEmptyTextField(e)) {
                    enableButton();
                }
            }
    
            private void enableButton() {
                if (!alreadyEnabled) {
                    button.setEnabled(true);
                }
            }
    
            private boolean handleEmptyTextField(DocumentEvent e) {
                if (e.getDocument().getLength() <= 0) {
                    button.setEnabled(false);
                    alreadyEnabled = false;
                    return true;
                }
                return false;
            }
        }
    
    Sto debuggando per capire cosa provochi l'errore.Inoltre ho modificato il mouseListener e funziona quando seleziono una delle 4 liste, forse vanno in conflitto i Listener? Allego il codice
    
    class ClickListener implements MouseListener {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 1) {
                    if (e.getSource() != null) {
                        JList<String> list = (JList<String>) e.getSource();
                        String name = list.getName();
    
                        for (Map.Entry<String, JList<String>> val : labelMap.entrySet()) {
                            if (val.getKey().equals(name)) {
                                selectedList = val.getValue();
                                break;
                            }
                        }
    
                    }
                }
            }
    
            @Override
            public void mousePressed(MouseEvent e) {
    
            }
    
            @Override
            public void mouseReleased(MouseEvent e) {
    
            }
    
            @Override
            public void mouseEntered(MouseEvent e) {
    
            }
    
            @Override
            public void mouseExited(MouseEvent e) {
    
            }
        }
    
  • Re: JList multiple

    Guarda bene l'actionPerformed() nella classe AddListener: dopo aver discriminato il punto di inserimento della stringa, vai a fare l'inserimento direttamente sull'oggetto listModel. Chi è quell'oggetto? Non lo vedo dichiarato da nessuna parte. Se quella è una inner-class e listModel è dichiarato nella classe contenitore "bene", altrimenti quel codice non compila proprio. Tra l'altro, usi quell'oggetto listModel anche nel metodo alreadyInList.

    Ho scritto "bene" tra virgolette perchè, nel caso dell'ipotesi della inner-class, bisogna capire a chi fa riferimento quell'oggetto. Se, come immagino, è il ListModel della lista su cui fare l'inserimento, allora tale riferimento va aggiornato assieme alla selectedList: quando questa cambia, va recuperato il "nuovo" ListModel.


    Ciao.
  • Re: JList multiple

    LeleFT, avevi ragione sul listModel. Ho creato un metodo che aggiorna il riferimento all'oggetto e funziona tutto. Mi sei stato molto d'aiuto, grazie mille.
    Ciao!
Devi accedere o registrarti per scrivere nel forum
7 risposte