» »

[Java]Problem z vektorjem

[Java]Problem z vektorjem

KernelPanic ::

Spostovani!

Obupujem nad delom kode, ki vztrajno (od noci iz cetrtka na petek :D) mece ven exception. Tukaj je code chunck:
            try
            {
                CModelListOpenedFiles model=(CModelListOpenedFiles)this.toolBarFileSwitcher().
                    listOpenedFiles().getModel();

                System.out.println("Vector size: "+model.getSize());
                System.out.println("Selected vector index to be deleted: "+iIndexSelectedDocument);

                strRemovedFilename=model.remove(iIndexSelectedDocument);
            }
            catch(Exception ex)
            {
                System.out.println(ex);
            }
Torej, rad bi pobrisal element iz modela za JList (kot sem to delal ze ziljon times, vedno je delovalo). zgornja dva System.out-a izpiseta trenutno vrednost modela 1 ter index, ki se brise, ima vrednost 0. To je ok! Vendar, zakaj mi skoci na exception? Aja, se izpisek iz konzole:
Vector size: 1
Selected vector index to be deleted: 0
java.lang.ArrayIndexOutOfBoundsException: -1


S spostovanjem,
Marko

kr?en ::

Ti exception lepo razlozi kje je napaka. Hoces brisat indeks, ki ne obstaja oz. je seznam prazen. Debugaj korak za korakom in preveri zadevo. Pa Vector je deprecated v Javi.

Zgodovina sprememb…

  • spremenil: kr?en ()

KernelPanic ::

Cakaj malo, zgornja system.out.println ravno ovrecita tvojo trditev, namrec, velikost vektorja pred removanjem je 1, torej je edini dostopni indeks elementa 0. V prvotnem postu poglej pod izpisom kode, kaj izpiseta System.out.println ...

Arto ::

KernelPanic je izjavil:

Cakaj malo, zgornja system.out.println ravno ovrecita tvojo trditev, namrec, velikost vektorja pred removanjem je 1, torej je edini dostopni indeks elementa 0.

Ampak ti pa brišeš stvar na indeksu -1.

KernelPanic ::

Vector size: 1
Selected vector index to be deleted: 0
java.lang.ArrayIndexOutOfBoundsException: -1
Brisem v indexu 0. Ali ga mogoce vector object zmanjsa samodejno za 1, znotraj svoje kode?

Lp,
Marko

Arto ::

Dej sprintej vn še iIndexSelectedDocument :P

KernelPanic ::

Saj sem ga, poglej kodo, v prejsnjem postu je to:
Selected vector index to be deleted: 0

Arto ::

Aja pa res. A to maš znotraj kake for zanke al pa kej?

EDIT: Kaj se pa zgodi, če indeks povečaš za 1? A pravilno deluje?

Zgodovina sprememb…

  • spremenil: Arto ()

KernelPanic ::

Ok, gremo malo ozadja: Delam na enostavnem file editorju, ki hrani v JList (v njegovem modelu) imena odprtih datotek. Ko pritisnem File->New, naredim novo prazno datoteko in ime bi rad dodal v ta vektor, ki ga omenjamo. Koda je sledeca:
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource()==this.menuItemFileNew())
        {
            CDocument currentDocument=new CDocument(CDefaults.NEW_FILENAME_EN);

            this.panelMain().openedDocuments().add(currentDocument);

            this.menuItemFileSave().setEnabled(true);
            this.menuItemFileSaveAs().setEnabled(true);

            CModelListOpenedFiles model=(CModelListOpenedFiles)this.toolBarFileSwitcher().
                    listOpenedFiles().getModel();

            model.addElement(currentDocument.
                    paneDocument().filename());

            this.toolBarFileSwitcher().setVisible(true);
            this.menuItemFileClose().setEnabled(true);

            if(this.panelMain().openedDocuments().size()>1)
            {
                this.menuItemFileCloseAll().setEnabled(true);
            }
            this.toolBarFileSwitcher().listOpenedFiles().setSelectedIndex(model.size()-1);
        }
Ker imam opravka z JList, se po tej kodi se izvede changeSelection of JList:
@Override
    public void valueChanged(ListSelectionEvent e)
    {
        if(e.getSource().equals(this.toolBarFileSwitcher().listOpenedFiles()))
        {
            CModelListOpenedFiles model=(CModelListOpenedFiles)this.toolBarFileSwitcher().
                listOpenedFiles().getModel();

            if(!e.getValueIsAdjusting())
            {
                if(model.getSize()>0)
                {
                    int iIndexSelectedDocument=this.toolBarFileSwitcher().
                            listOpenedFiles().getSelectedIndex();

                    CDocument selectedDocument=this.panelMain().openedDocuments().
                            get(iIndexSelectedDocument);

                    if(this.panelMain().documentActive()!=null)
                    {
                        this.panelMain().documentActive().setVisible(false);
                    }

                    this.panelMain().setDocumentActive(selectedDocument);

                    this.panelMain().add(this.panelMain().documentActive(),
                            BorderLayout.CENTER);

                    if(this.panelMain().documentActive().paneDocument().
                            getText().length()>0)
                    {
                        this.toolBarFileSwitcher().panelActiveDocumentInfo().
                                panelFileSizeInfo().updatePanel(this.panelMain().
                                documentActive().paneDocument().
                                    getText().length(),
                                        true);
                    }
                    else
                    {
                        this.toolBarFileSwitcher().panelActiveDocumentInfo().
                                panelFileSizeInfo().updatePanel(this.panelMain().
                                documentActive().paneDocument().
                                    getText().length(),
                                        false);
                    }

                    this.panelMain().documentActive().setVisible(true);
                    this.panelMain().documentActive().
                            paneDocument().addKeyListener(this);
                    this.panelMain().documentActive().
                            paneDocument().requestFocus();
                }
                else
                {
                    this.toolBarFileSwitcher().setVisible(false);
                    this.panelMain().setDocumentActive(null);
                    this.panelMain().openedDocuments().removeAllElements();
                    model.clear();
                    this.menuItemFileClose().setEnabled(false);
                    this.menuItemFileCloseAll().setEnabled(false);

                    this.panelMain().updateUI();
                }
            }
        }
    }
Torej, kje je tocno problem: Tale .remove sem izgleda resil (se sam nevem kako), vendar se mi je pojavil nov problem: Ce pritisnem File->New (iz menija) po zagonu programa, se ustvari nov file (s tem mislim nov element v JList ter nov, prazen dokument), tako kot mora. File->New nato lahko tudi ponavljam, stvar lepo dela! Ce pa izberem funkcijo File-Close All ali pritiskam File->Close do zadnjega odpretga fajla, se fajli lepo zapirajo in brisejo iz JList (iz njegovega modela) ter iz internega vetkorja odprtih dokumentov. In ko so vsi fajli zaprti in v JList ni nobenega elementa, pritisnem File->New, se mi stvar usuje v:
            model.addElement(currentDocument.
                    paneDocument().filename());
znotraj actionPerformed metode. In mi ni jasno zakaj?! Seznam je prazen, vendar ni null. Ima nic elementov in ne vem, zakaj ne morem dodati z omenjeno vrstico novega elementa v vektor.

Lp,
Marko

Zgodovina sprememb…

KernelPanic ::

Aja, prilagam se sliko, da bo bolj jasno:
 File Editor GUI

File Editor GUI

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Java]Client/Server preko socketa

Oddelek: Programiranje
91777 (1613) KernelPanic
»

Java pomoč

Oddelek: Programiranje
131802 (1581) Serial
»

[Java] Zagon appleta v HTML

Oddelek: Programiranje
161541 (1363) Bela01
»

[JAVA] branje iz datoteke

Oddelek: Programiranje
242406 (2041) Bela01
»

[Java] Shranjevanje podatkov in datotek

Oddelek: Programiranje
71229 (1182) Vesoljc

Več podobnih tem