Swing Optimierung eines TableModels

Eldorado

Bekanntes Mitglied
Gute Tag zusammen,
ich habe zum Anzeigen von Buchungen folgendes TableModel geschrieben. Das "Problem" ist, dass ich zwei Arten von Buchungen habe, die beide in dieser einen Tabelle angezeigt werden sollen. Das ist zum einen Verkäufe(Sale) auf die diese Tabelle auch optimiert ist und zum anderen Abrechnungen(Settlement). Diese werden mit dem Produkt-Namen "Abrechnung" angezeigt, haben natürlich die Menge 1 und eben den dazugehörigen Preis. Ich habe das unterscheiden dieser beiden Typen(definiert über Klassen) momentan so gelöst, dass ich versuche das eine zu casten, die ClassCastException abfange, falls es nicht der erste Typ ist und dann halt den zweiten Typ annehme. Mir kommt diese Methode nicht sehr geschickt und schön vor. Als alternative könnte man natürlich mit getClass vergleichen, was aber nach meinem wissen auch kein so guter Stil ist. Wäre nett, wenn jemand eine "schönere" Mathode kennt, diese bzw. den Ansatz zu posten. Vielen Dank! Hier wie versprochen der Quellcode des Models(Sale und Settlement erben beide von UserBook) und die Klasse die die Daten in der Tabelle beinhaltet:
Java:
public class UserBookTableModel extends AbstractTableModel {

    private ArrayList<BookTableData> data;

    public UserBookTableModel(ArrayList<UserBook> data) {
        for (UserBook userBook : data) {
            addUserBook(userBook);
        }
    }

    public UserBookTableModel() {
        data = new ArrayList<BookTableData>();
    }

    public void addUserBook(UserBook userBook) {
        try {
            Sale sale = (Sale) userBook;
            data.add(new BookTableData(sale.getProduct().getName(), sale.getAmount(), (double) (sale.getDatePrice() * 100)));
        } catch (Exception e) {
            Settlement settlement = (Settlement) userBook;
            data.add(new BookTableData("Abrechnung", 1, (double) (settlement.getMoney() * 100)));
        }
    }

    public void removeUserBook(BookTableData data) {
        this.data.remove(data);
    }

    public void clearTable() {
        data.clear();
    }

    public int getRowCount() {
        return data.size();
    }

    public int getColumnCount() {
        return 4;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        switch (columnIndex) {
            case 0:
                return data.get(rowIndex).getName();
            case 1:
                return data.get(rowIndex).getPrice();
            case 2:
                return data.get(rowIndex).getAmount();
            case 3:
                return data.get(rowIndex).getPrice() * data.get(rowIndex).getAmount();
            default:
                return null;
        }
    }

    @Override
    public String getColumnName(int column) {
        switch (column) {
            case 0:
                return "Produkt";
            case 1:
                return "Preis";
            case 2:
                return "Menge";
            case 3:
                return "Gesamtpreis";
            default:
                return null;
        }
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }
Java:
public class BookTableData {

    private String name;
    private int amount;
    private double price;

    public BookTableData(String name, int amount, double price) {
        this.name = name;
        this.amount = amount;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public int getAmount() {
        return amount;
    }

    public double getPrice() {
        return price;
    }
}

Edit: Falsches TableModel drin gehabt^^
 
Zuletzt bearbeitet:
Saubererweise sollten dann beide Klassen eine gemeinsame Oberklasse haben. Wenn das nicht geht, halte ich es auch für ...naja, seltsam... beide in einer Tabelle darzustellen.

Aber zu deinem Problem: Schonmal instanceof gehört?
Java:
if (userBook instanceof Sale)
    // für Sale
else
   // für Settlement
 
das scheint genau das zu sein was ich suche, Danke!
Zu deiner Anmerkung: 🙂

Sale und Settlement erben beide von UserBook

Edit: Ich habe mir mal ein bisschen das instanceoff angesehen und dabei gelesen dass das auch mehr oder weniger "gebrandmarkt" ist, also eher auch nicht verwendet werden sollte. Würde mich jetzt mal interessieren, was an meinem "Design" falsch ist, dass ich vor diesem Problem stehe bzw. wie man es umgehen kann.
mfg
Eldorado
 
Zuletzt bearbeitet:

Zurück
Oben