ArrayList nach Datenbankeintrag aktualisieren

Ollek

Bekanntes Mitglied
Hallo,

ich schreibe gerade an einem Programm, womit Artikel verwaltet werde können.

Ich diese Artikel haben Haupt und Unterkategorien. Beim Start des Programms werden alle Artikel aus der Datenbank in den Cache geladen. Wenn ich eine Haupt und Unterkategorie auswähle, dann werden mir auch nur die Artikel angezeigt, die dort vorhanden sind. Wenn ich dann wieder "Alle" auswähle, werden mir wieder alle angezeigt. Das passiert über ComboBoxen.

Wollte mich bei euch erkundigen, ob es eine saubere Programmierung ist, wie ich es gemacht habe.. Oder ob ich dort noch was verbessern muss...

Wenn ich eine Haupt und Unterkategorie auswähle, werden die Listen gefiltert und eine neue Liste wird an die Methode setListOfArticle(ArrayList) im TableModel weitergegeben und die aktuelle Tabelle wird gecleart und die neue Liste wird eingefügt und die Methode wird mit der fireTableDataChanged() aktualisiert.
DIe komplette Liste mit den Artikeln wird in der Klasse ArticleManagement gespeichert und bei Bedarf wieder neu eingebunden.

Ich zeige euch mal die Klassen und freue mich über eure Kommentare..

Java:
public class ArticleTableModel extends AbstractTableModel  {
	
	private String[] columnNames = new String[]{"Bezeichung", "SKU"};
	private ArrayList<Article> listOfArticles = new ArrayList<Article>();

	@Override
	public int getColumnCount() {
		return columnNames.length;
	}

	@Override
	public int getRowCount() {
		return listOfArticles.size();
		
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		
		Article article = listOfArticles.get(rowIndex);

		switch(columnIndex){
			case 0: return article.getDescription();
			case 1: return article.getArtnr();
		}
		return "Fehler";
	}
	
	public Article getValueAt(int rowIndex) {

		return listOfArticles.get(rowIndex);
	}
	
	public String getColumnName(int iColumn){
		return columnNames[iColumn];
	}

	public ArrayList<Article> getListOfArticles() {
		return listOfArticles;
	}

	public void setListOfArticles(ArrayList<Article> listOfArticles) {
		this.listOfArticles.clear();
		this.listOfArticles.addAll(listOfArticles);
		this.fireTableDataChanged();
	}

JScrollPane mit JTable
Java:
private JTable showArticleTable(){
		
		// TableModel
//		tblModel = new ArticleTableModel();
		tblModel.setListOfArticles(ArticleManagement.getInstance().getArticleList());

Java:
public class ArticleManagement extends Observable {
	
	//Attribute
	private ArrayList<Article> listOfArticles;
	private static ArticleManagement articleManagement = null;
	private DatabaseArticle dbArt = DatabaseFatory.getInstance().createDatabaseArticle();
	private Article selectedArticleInView = null;
	private ArrayList<Article> filteredListOfArticles = null;
	private SVVLogger logger = SVVLogger.getInstance();

/**
	 * Methode erstellt einen neuen Artikel.
	 * Es wird überprüft, ob dieser Artikel 
	 * schon im Cache vorhanden ist oder nicht.
	 * 
	 * @param article Artikel der hinzugefügt werden soll
	 */
	public void create(Article article){
		
		String iUniqueKey = article.getUniqueKey();
				
		if(listOfArticles.contains(iUniqueKey)){
			JOptionPane.showConfirmDialog(null, "Der Artikel mit der Artikelnummer \n" + article.getArtnr() + "\n ist schon in der Datenbank vorhanden.\n \nSoll dieser nun angezeigt werden?" , "Artikle schon vorhanden", JOptionPane.YES_NO_OPTION);
		}else {
			listOfArticles.add(article);
			dbArt.create(article);
			logger.log(Level.INFO, ArticleManagement.class, "Artikel " + article.getDescription() + " wurde hinzugefügt.");
		}
	}


	/**
	 * Es werden alle Artikel aus
	 * der Datenbank gelesen und eine
	 * ArrayList<Article> geschrieben
	 */
	public void readAllFromDatabase(){
		listOfArticles = (ArrayList<Article>) dbArt.selectAll();
	}

/**
	 * Gibt eine ArrayList<Article> mit Artikeln zurück,
	 * die in der übergebenen Unterkategorie sind.
	 * 
	 * @param subCat	Unterkategorie
	 * @return			ArrayList<Article>
	 */
	public ArrayList<Article> getArticleList(SubCategory subCat) {
		if(subCat.getDescription() == "Alle")
			return listOfArticles;
		else
			return getFilteredListOfArticles(subCat);
	}

/**
	 * Methode liefert die Artikel-Objekte zurück,
	 * die sich in der selektierten Unterkategorie
	 * befinden
	 * 
	 * @param selectedSubCat	selektierte Unterkategorie
	 * @return	ArrayList<Article> befinden sich 
	 * 			in der Unterkategorie
	 */
	public ArrayList<Article> getFilteredListOfArticles(SubCategory selectedSubCat) {
		if(filteredListOfArticles == null)
			filteredListOfArticles = new ArrayList<Article>();
		else
			filteredListOfArticles.clear();
		
		for(Article article : listOfArticles){
			if(article.getSubCat() == selectedSubCat.getId())
				filteredListOfArticles.add(article);
		}
		return filteredListOfArticles;
	}

Java:
public class Breadcrumb extends JPanel{

private JComboBox cbMainCatList;
	private JComboBox cbSubCatList;
	private JComboBox cbApplGrpList;
	private ArticleTableModel model;
	
	private Vector<String> vSubCats = new Vector<String>();
	
	public Breadcrumb(ArticleTableModel model){
		this.model = model;
		initalize();
	}

/**
	 * Klasse reagiert auf die Auswahl des Users
	 * in der ComboBox der Unterkategorien
	 * 
	 * @author 
	 *
	 */
	class ItemListenerForSubCatBox implements ItemListener {

		@Override
		public void itemStateChanged(ItemEvent e) {
			SubCategory subCat = null;
			ArrayList<Article> listOfArticles = null;
			
			if(cbSubCatList.getSelectedItem() != null){
				subCat = (SubCategory) cbSubCatList.getSelectedItem();
				SubCatManagement.getInstance().setSelectedSubCatInBreadcrumb(subCat);
				listOfArticles = ArticleManagement.getInstance().getArticleList(subCat);
				
				model.setListOfArticles(listOfArticles);
			}
		}
	}
}

GUI
Java:
/**
	 * Zum Speichern von neuen Artikeln
	 * 
	 * @author 
	 *
	 */
	class SaveListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {
			ArticleManagement.getInstance().create(artAtt.getNewArticle());
			tblModel.setListOfArticles(ArticleManagement.getInstance().getArticleList());
			
			artAtt.clearTextFields();
		}
		
	}
 
Hi,

also ich bin gerade mal drübergeflogen und hab eigentlich keine groben Fehler gefunden. Ist meiner Ansicht nach recht sauber Programmiert. Vllt etwas mehr dokumentieren wäre schön gewesen.

Grüße Swoop
 
grundsätzlich finde ich das Programm recht sauber und ordentlich.
Code:
Vectoren
sind meiner Meinung nach nicht so sinnvoll, aber ok...das ist geschmackssache.

Und deine Methoden und Variablen sind entsprechend ihrer "Tätigkeit" benamt => also langt das imho an Dokumentation.
 
Immer wenn ich ein einen neuen EIntrag in der Datenbank vornehmme, lösche ich die aktuelle Liste, die dem TableModel gekannt ist und übergebe eine neue.

Gibt es keinen anderen weg? Oder ist es so gang und gebe?
 

Neue Themen


Zurück
Oben