Swing - java.lang.IndexOutOfBoundsException

0

Witam,
mam delikatny kłopot z aplikacją pisaną w pradawnej trchnologii javy czyli swingu:
Mam taki mini projekcik który przedstawia sklep z samochodami. Klasa Klient, klasa Samochod wszystko zrobione w panelach swinga i połączone z JDBC.
Po dodaniu nowego obiektu nie mogę wykonywać na nim żadnych operacji, tylko na starych elementach, nie ważne czy to klient czy samochód.Po zresetowaniu aplikacji wszytskie zmiany są zapisane i już mogę usuwać lub updatować wcześniej dodany obiekt, ale tylko do czasu dodania nowego elementu. Teraz tak: kod wrzuce z dodawania samochodu(gdzie jest metoda update), ale przypominam że z klientem nie działa tak samo:

public void actionPerformed(ActionEvent e) {
if(e.getSource() == add)
{

		String carBrand = tfCarBrand.getText();
		String color = tfColor.getText();
		int price = Integer.parseInt(tfPrice.getText());
		int mileage = Integer.parseInt(tfMileage.getText());
		double capacity = Double.parseDouble(tfCapacity.getText());
		
		Database.insertCar(carBrand, color, price, mileage, capacity);
		model1.updateLista(Database.selectCar());
	}

To jest metoda (którą zaraz przerobie na lambde), która dodaje samochód. Ale wydaje mi się że kłopot może być gdzie indziej:
Otóż mam tu zastosowane TableModel, i obawia się ta metoda aktualizująca model się psuje:

public class ModelCarTable extends AbstractTableModel{

private List<Car> list; //lista bedzie zawierac elementy, gdzie kazdy element listy to bedzie sobny wiersz w naszej tabeli

private List<String> columns;

public ModelCarTable(List<Car> list, List<String> columns) {
	this.list = list;
	this.columns = columns;
}

public void updateLista(List<Car> lista)
{
	this.list = lista;
	fireTableDataChanged();
}

@Override
public int getColumnCount() {
	return columns.size(); //kolumn masz tyle ile naglowkow
}

@Override
public int getRowCount() {
	return list.size(); //wierszy masz tyle ile wynosi liczba elementow w liscie
}

@Override
public Object getValueAt(int rowNumber, int columnNumber) {
	Car row = list.get(rowNumber); //pobierasz do obiektu s element z kolekcji lista spod indeksu row, czyli odpwiada

	
	if (columnNumber == 0)
	{
		return row.getId();
	}
	else if (columnNumber == 1)
	{
		return row.getCarBrand();
	}
	else if (columnNumber == 2)
	{
		return row.getColor();
	}
	else if (columnNumber == 3)
	{
		return row.getPrice();
	}
	else if (columnNumber == 4)
	{
		return row.getCapacity();
	}
	else
	{
		return row.getMileage();
	}
}	

@Override
public String getColumnName(int idx) {
	return columns.get(idx);
}

Z góry dzięki za poświęcenie chwilki.
Pozdrawiam

0

Po uruchominieu Aplikacji mogę dodać tylko jedną posatć lub samochód. Po dodaniu nowego obiektu nie mogę też usuwać, jedyne co to mogę updateować, ale tylko wcześniej dodane elementy

Bo co? Umiesz ty sensownie opisać w czym problem? Co się dzieje jak próbujesz dodać drugi element? Wywala się aplikacja? Guziki nie są klikalne? Lecą wyjątki? Nic się nie dzieje? Zapnij debuger w miejscach które powinny wykonać akcje dodawania/usuwania i zobacz co się tam dzieje.

0
Shalom napisał(a):

Po uruchominieu Aplikacji mogę dodać tylko jedną posatć lub samochód. Po dodaniu nowego obiektu nie mogę też usuwać, jedyne co to mogę updateować, ale tylko wcześniej dodane elementy

Bo co? Umiesz ty sensownie opisać w czym problem?

Pisałem i testowałem jendocześnie i faktycznie palnąłem głupotę, dodawać obiekty mogę, ale problem jest z tymi nowo dodanymi podczas 1 sesji działania aplikacji :
java.lang.IndexOutOfBoundsException: Index: 6, Size: 6 - Aplikacja się nie wyłącza ale blokue operacje na nowo dodanych obiekatch.
Dodawać moge cały czas. Aktualizować i usuwać wcześniej dodane obiekty z bazy też mogę. Przyciski działają wszytsko ok, ale nowo dodane obiekty (te które dodaję podczas pracy aplikacji są nie do ruszenia - chyba że zrestartuje aplikację).

1

Kodu nie czytałem, ale jeżeli size = 6, to maksymalny dopuszczalny indeks wynosi 5, a Ty gdzieś korzystasz z indeksu 6.

0

jw, gdzieś w kodzie odwołujesz się do elementu poza tablicą. Co wiecej przecież ten wyjątek pokazuje ci dokładnie w ktorym miejscu w kodzie!

0

Napisz post jeszcze raz, tym razem użyj znaczników kolorujących składnię. Wskaż wiersz, w którym pojawia się błąd.

0

Eclipse przekierowuje mnie tutaj:

bUpdate = new JButton("update"); bUpdate.addActionListener(e -> {createUpdateCarWindow();});

Ta lambda odnosi się do metody w której błąd wskazuje na :
PanelCarUpdate p = new PanelCarUpdate(model, list.get(table.getSelectedRow()), frame);

0

Wygląda, że list ma 5 elementów, a w table jest zaznaczony szósty wiersz.

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