Problem z zapisem ;/

0

Nie wiem co zrobiłem zle, siedze na tym juz kilka godzin i nie potrafie odszukac pomyłki.

  1. Dane z pliku wstawiane sa do tablicy dane:

  2. Jeśli atrybuut obiektu _status = "Zamknięte" obiekt wstawiany jest do 2giej tablicy dane2[][]
    3, Przy okazji okreslam wielkosc tablicy zliczajac przy wczytywaniu do dane[][] ilosc obiektow z atrybutem +status = Zamkniete. if(zlecenia.get(i)._status.equals("Zamknięte")){wielkosc_tabeli++;}

  3. Obiekt wedruja kolejno do tej tablicy licznik++

    wielkosc_tabeli=0;
    String[][] dane=new String[zlecenia.size()][10]; //wiersze, kolumny
    for (int i=0;i<zlecenia.size();i++)
        {
        for (int j=0;j<9;j++)
                      {
                         dane[i][0]=zlecenia.get(i)._numer;
                         dane[i][1]=zlecenia.get(i)._data_przyjecia;
                         dane[i][2]=zlecenia.get(i)._przyjal;
                         dane[i][3]=zlecenia.get(i)._serwisuje;
                         dane[i][4]=zlecenia.get(i)._data_realizacji;
                         dane[i][5]=zlecenia.get(i)._apteka;
                         dane[i][6]=zlecenia.get(i)._status;
                         dane[i][7]=zlecenia.get(i)._cel;
                         dane[i][8]=zlecenia.get(i)._rozwiazanie;
                      }
        if(zlecenia.get(i)._status.equals("Zamknięte")){wielkosc_tabeli++;}
        }
    

    String[][] dane2=new String[wielkosc_tabeli][10];
    licznik=0;

    for (int i=0;i<zlecenia.size();i++)
    {
    if((dane[i][6]).equals("Zamknięte"))
    {
    for (int j=0;j<9;j++)
    {
    dane2[licznik][j]=dane[i][j];
    }
    licznik++;
    }
    }

I tu niby wszystko działa (tak mi sie wydaje) Poznije sa wyswietlane w tabelce:

String[]nag={"Nr:","Data przyjęcia:","Przyjął","Serwisuje","Data realizacji","Apteka:","Status:","Cel:","Rozwiązanie:"};

JTable table = new JTable();
ModelTabelki model = new ModelTabelki( dane2, nag );
table = new JTable(model);
js = new JScrollPane( table );

I to wszystko tez działa. Problem zaczyna sie gdy chce osiagnac cos takiego. Klikam myszka na wiersz w tebelce ( tez w wyswietlonymi obiektami z atrybutem = zamkniete) i chce aby zadała sie pytanie czy przywrocic zlecnie. Jesli tak to zmienia wartowsc atrybutu w obiekcie zaznaczonym myszka (Czyli w wierszu na "Zakończone").

table.addMouseListener(new MouseAdapter()
{
public void mouseClicked(final MouseEvent e)
{
if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2)
{
JTable tabela=(JTable)(e.getSource()); //obiera numer wiersza przy kliknięciu
index_do_edycji=tabela.getSelectedRow();
String tymczasowa=zlecenia.get(index_do_edycji)._numer;
//---------------------------------------------------------
if (JOptionPane.showConfirmDialog(new JFrame(),"Czy przywrócić zlecenie?", "Title",JOptionPane.YES_NO_OPTION)
== JOptionPane.YES_OPTION)
{
for (int i=0;i<zlecenia.size();i++)
{
if(zlecenia.get(i)._numer.equals(tymczasowa))
{
zlecenia.get(i)._status="Zakończone";
}
}
//zapis
if(EmployeeListDecorator4.saveList(zlecenia, fileName_zlecenia))
{System.out.println("Zapisalem liste pracownikow...");}
else {System.out.println("Nie udalo sie zapisac listy pracownikow.");return;}
}

I niby wszystko działa do czasu. Okazuje się ze zmienia wartości tych atrybutów ale w innych wierszach niż powinien. Mysle ze pomyliłem cos z przekazaniem zazaczonego wiersza:

JTable tabela=(JTable)(e.getSource()); //obiera numer wiersza przy kliknięciu
index_do_edycji=tabela.getSelectedRow();
String tymczasowa=zlecenia.get(index_do_edycji)._numer;

I potem mamy wyszukiwanie

                  for (int i=0;i<zlecenia.size();i++)
                         {
                         if(zlecenia.get(i)._numer.equals(tymczasowa))
                           {
                            zlecenia.get(i)._status="Zakończone";
                           }
                         }

I nie mam pojecia dlaczego to nie działa ;/ Pomocy może ktoś mnie uświadomi ;)

0

Zamiast getSelectedRow() użyj:

Point p = e.getPoint();
int rowView = table.rowAtPoint(p);
int row = table.convertRowIndexToModel(rowView);
0

Użyłem, ale to nie to. W obu przypadkach wywala sie w tymsamym miejscu. Np jak wyświetlam w tabelce 10 wierszy to 7 jest ok A z 3ma nic sie nie dzije. Nie zmienia atrybutu _status. Nie wiem dlaczego.

0

Wypisuj sobie numer wiersza ktory klikasz - jesli jest zly (a przeciez jest) musisz zastanowic sie dlaczego selection model zwraca niepoprawny wiersz. Ja mialem podobna sytuacje dla JComboBox, gdzie getSelectedIndex() liniowo wyszukuje indeksu porownujac selectedItem z kazdym elementem modelu metoda equals(). Okazalo sie ze w modelu ten sam obiekt jest wlozony wiecej niz raz, a co za tym idzie zawsze przy takim liniowym wyszukiwaniu zwracane bylo pierwsze wystapienie. Nie wiem jak jest u Ciebie ale moze to cie naprowadzi.

0

Raczej to nie tobo:

  1. Obiekt ma pole _numer ktore uzupełniane jest automatycznie licznik++ wic kazdy bedzie mail inna wartosc
  2. dodałem porownywanie tez innego pola:

for (int i=0;i<zlecenia.size();i++)
{
if((zlecenia.get(i)._cel.equals(tymczasowa))&&(zlecenia.get(i)._numer.equals(tymczasowa2)))
{
zlecenia.get(i)._status="Zakończone";
}
}

Wiec tak naprawde sprawdza 2 wartosci _numer i dodatkowo jeszcze _cel. dopiero wtedy zmienia wartosc w obiekcjie _status.

Wiec mysle ze rozpoznaje dobrz. Nie mam pojecia w czym jest problme ;/

0

Zrobiłem mały test i jednak problem jest z wyborem wiersza w tabelce.

Podswietla linie o indeksie 4 a pobiera linie o indeksie 3 Jednak nie zawsze. Ale to juz cos

1 użytkowników online, w tym zalogowanych: 0, gości: 1