Abhängige Listenfelder

alfie71

Grünschnabel
Hallo zusammen,
in VBA habe ich in meinem Programm, um eine Auswahl einzuschränken bis zu drei Comboboxen oder Listenfelder abhängig voneinander gestaffelt.
Das heisst, wenn der User im ersten Feld, das Kundennummern enthält, eine Auswahl trifft, dann wird das zweite Feld mit Bestellnummern gefüllt, die diesem Kunden zugeordnet sind. Nach einer Auswahl einer Bestellnummer werden im dritten Feld die einzelnen Positionen dieser Bestellung angezeigt.
Ich bin neu in Java und weiss jetzt überhaupt nicht, wie das hier funktionieren soll. Könnt Ihr mir bitte auf die Sprünge helfen?
Vielen Dank schon mal.

Kann mir denn keiner helfen?
 
Zuletzt bearbeitet:
So eine pauschale Anfrage ist schwierig zu beantworten. Willst Du grundsätzliche Tipps zu Java. Suchst Du eine fertige Lösung für Dein Problem. Hast Du schon etwas programmiert und kommst nicht weiter? Mit welcher Oberfläche arbeitest Du? SWT, Swing?

Was willst Du denn tun? Deine VB Anwendung umschreiben? Ist das eine Neuentwicklung?

Tasten wir uns ran ;-) ....
 
Hallo,
ich will das, was ich bis jetzt mit Access2003 und VBA entwickelt habe, mit JAVA und MySQL umschreiben bzw. neu erstellen. Ich arbeite mit Netbeans als IDE und habe den Grundaufbau der GUI erstellt. Jetzt will ich sie mit Leben aus der MySQL Datenbank füllen. Dafür habe ich eine Tabelle, in der die Kundennummern und der Kundenname aufgelistet sind. Wenn der User nun eine Zeile dieser Tabelle anklickt, sollen in der ersten Combobox alle Bestellnummern angezeigt werden, die diesem Kunden zugeordnet sind. Und bei der Auswahl einer Bestellnummer sollen in der dritten Combobox die einzelnen Positionen der Bestellung angezeigt werden.
Ich weiss jetzt überhaupt nicht, wie ich so etwas aufbauen muss. Ich weiss nur, dass ich einen Actionlistener einrichten muss, aber wie schaffe ich es, dass eine Combobox mit Werten gefüllt wird, die eine Abhängigkeit zu einem anderen Objekt Tabelle oder Combobox haben.
Wie muss der Code dafür aussehen? :confused:
 
Ich nehme an Du verwendest SWING. Sagt Dir MVC etwas? Bist Du fit in OO oder sind das Deine ersten Gehversuche in einer Objektorientierten Sprache?

Ich denke ich habe morgen etwas Zeit ein kleines Beispiel zu schreiben, damit Du eine Richtung bekommst.

Grüße
 
Hi,

ich habe Dir eine Skizze programmiert. Ich verwende Dabei das MVC-Pattern (Model Controller View). Die Modell - Klasse arbeiten mit Benachrichtigungen, das heißt, wie auch immer Du die Daten änderst (sei es durch direkte Änderung eines Objektes oder über die Gui), die GUI zeichnet sich neu.

Ich befürchte, der Code wird mehr Frage aufwerfen als lösen. Du kannst dann aber gerne nachhaken. Hoffe es hilft.

Grüße

Java:
package de.tutorials;

import java.io.Serializable;
import java.util.Observable;

public class Kunde extends Observable implements Serializable{
	
		private int id;
		private String name;
		
		
		
		public Kunde() {
			this(0, "");
		}
		public Kunde(int id, String name) {
			setId(id);
			setName(name);
		}
		
		
		public int getId() {
			return id;
		}
		public void setId(int id) {
			this.id = id;
			fireEvent();
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
			fireEvent();
		}
		
		public String toString() {
			return "Id=" +id + ", Name=" + name;
		}
		
		private void fireEvent() {
			setChanged();
			notifyObservers();
		}
	
}

Java:
package de.tutorials;

import java.io.Serializable;
import java.util.Observable;

public class Bestellung extends Observable implements Serializable {
	
	private int id;
	private Kunde kunde;
	private String bestellnummer;
	
	public Bestellung() {
		this(0,new Kunde(),"ohne");
	}
	
	public Bestellung(int id, Kunde kunde, String bestellnummer) {
		setId(id);
		setKunde(kunde);
		setBestellnummer(bestellnummer);
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
		fireEvent();
	}
	public Kunde getKunde() {
		return kunde;
	}
	public void setKunde(Kunde kunde) {
		this.kunde = kunde;
		fireEvent();
	}
	public String getBestellnummer() {
		return bestellnummer;
	}
	public void setBestellnummer(String bestellnummer) {
		this.bestellnummer = bestellnummer;
		fireEvent();
	}
	
	public String toString() {
		return "Id=" + getId() + ", Kunde=" + getKunde() + ", Bestellnummer=" + getBestellnummer();
	}
	
	private void fireEvent() {
		setChanged();
		notifyObservers();
	}


}

Java:
package de.tutorials;

import java.io.Serializable;
import java.util.Observable;

public class Bestellposition extends Observable implements Serializable {
	
	private int id;
	private Bestellung bestellung;
	private String artikel;
	
	
	
	public Bestellposition(int id, Bestellung bestellung, String artikel) {
		setId(id);
		setBestellung(bestellung);
		setArtikel(artikel);
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
		fireEvent();
	}
	public Bestellung getBestellung() {
		return bestellung;
	}
	public void setBestellung(Bestellung bestellung) {
		this.bestellung = bestellung;
		fireEvent();
	}
	public String getArtikel() {
		return artikel;
	}
	public void setArtikel(String artikel) {
		this.artikel = artikel;
		fireEvent();
	}
	
	public String toString() {
		return "Id=" + getId() + ", Bestellung=" + getBestellung() + ", Artikel=" + getArtikel(); 
	}
	
	private void fireEvent() {
		setChanged();
		notifyObservers();
	}



}

Java:
package de.tutorials;

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;



public class DatenModel extends Observable implements Observer{
	
	
	private ArrayList<Kunde> kunden = new ArrayList<Kunde>();
	private ArrayList<Bestellung> bestellungen = new ArrayList<Bestellung>();
	private ArrayList<Bestellposition> bestellPositionen = new ArrayList<Bestellposition>();
	
	private Kunde kundeFilter = null;
	private Bestellung bestellungFilter = null;
	
	public DatenModel(){
		// Spieldaten
		Kunde mayer = new Kunde(1,"Mayer");
		Kunde müller = new Kunde(2,"Müller");
		Kunde schulz = new Kunde(3,"Schulz");
		
		Bestellung bestellung1 = new Bestellung(1,mayer,"Bestellung 1");
		Bestellung bestellung2 = new Bestellung(2,mayer,"Bestellung 2");
		Bestellung bestellung3 = new Bestellung(3,müller,"Bestellung 3");
		Bestellung bestellung4 = new Bestellung(4,müller,"Bestellung 4");
		Bestellung bestellung5 = new Bestellung(5,schulz,"Bestellung 5");
		Bestellung bestellung6 = new Bestellung(6,schulz,"Bestellung 6");
	
		addKunde(mayer);
		addKunde(müller);
		addKunde(schulz);

		addBestellung(bestellung1);
		addBestellung(bestellung2);
		addBestellung(bestellung3);
		addBestellung(bestellung4);
		addBestellung(bestellung5);
		addBestellung(bestellung6);
		
		
		addBestellposition (new Bestellposition(1,bestellung1,"Mutter"));
		addBestellposition (new Bestellposition(2,bestellung1,"Schraube"));
		addBestellposition (new Bestellposition(3,bestellung1,"Niete"));
		addBestellposition (new Bestellposition(4,bestellung2,"Nagel"));
		addBestellposition (new Bestellposition(5,bestellung2,"Hammer"));
		addBestellposition (new Bestellposition(6,bestellung2,"Zange"));
		addBestellposition (new Bestellposition(7,bestellung3,"Dübel"));
		addBestellposition (new Bestellposition(8,bestellung3,"Bohrer"));
		addBestellposition (new Bestellposition(9,bestellung3,"Kleber"));
		addBestellposition (new Bestellposition(10,bestellung4,"Hefter"));
		addBestellposition (new Bestellposition(11,bestellung4,"Klemme"));
		addBestellposition (new Bestellposition(12,bestellung4,"Dies und Das"));
		addBestellposition (new Bestellposition(13,bestellung5,"Haken"));
		addBestellposition (new Bestellposition(14,bestellung5,"Ösen"));
		addBestellposition (new Bestellposition(15,bestellung5,"Krims"));
		addBestellposition (new Bestellposition(16,bestellung6,"Krams"));
		addBestellposition (new Bestellposition(17,bestellung6,"Tod"));
		addBestellposition (new Bestellposition(18,bestellung6,"Teufel"));
	
		setKundeFilter(kunden.get(0));
	}
	
	
	public Kunde getKundeFilter() {
		return kundeFilter;
	}


	public void setKundeFilter(Kunde kundeFilter) {
		this.kundeFilter = kundeFilter;
		setBestellungFilter(getBestellungen().get(0));
		//fireEvent();
	}


	public Bestellung getBestellungFilter() {
		return bestellungFilter;
	}


	public void setBestellungFilter(Bestellung bestellungFilter) {
		this.bestellungFilter = bestellungFilter;
		fireEvent();
	}


	public void addKunde(Kunde kunde) {
		kunde.addObserver(this);
		kunden.add(kunde);
		fireEvent();
	}
	
	
	public void addBestellung(Bestellung bestellung) {
		bestellung.addObserver(this);
		bestellungen.add(bestellung);
		fireEvent();
	}
	
	
	public void addBestellposition(Bestellposition bestellposition) {
		bestellposition.addObserver(this);
		bestellPositionen.add(bestellposition);
		fireEvent();
	}
	
	public List<Kunde> getKunden() {
		
		return kunden;
		
	}
	public List<Bestellung> getBestellungen() {
		List<Bestellung> retval = new ArrayList<Bestellung>();
		for(Bestellung bestellung : bestellungen){
			if(bestellung.getKunde().getId() == kundeFilter.getId())
				retval.add(bestellung);
		}
		return retval;
		
	}
	
	public List<Bestellposition> getBestellungPositionen() {
		List<Bestellposition> retval = new ArrayList<Bestellposition>();
		for(Bestellposition bestellPosition : bestellPositionen){
			if(bestellPosition.getBestellung().getId() == bestellungFilter.getId())
				retval.add(bestellPosition);
		}
		return retval;
		
	}
	
	@Override
	public void update(Observable arg0, Object arg1) {
		fireEvent();
	}
	private void fireEvent() {
		setChanged();
		notifyObservers();
	}
	
}

Java:
package de.tutorials;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.util.Observable;
import java.util.Observer;

import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class ControlDemoProgramm extends JFrame{

	private JPanel centerPanel = null;
	private JComboBox kundenComboBox = null;
	private JComboBox bestellungCombox = null;
	private JList bestellPositionen = null;
	private DatenModel datenModel = null;
	
	
	
	static {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	public ControlDemoProgramm() {
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	
		getContentPane().add(getCenterPanel(), BorderLayout.CENTER);
		
		pack();
		
		
	}
	
	public static void main(String[] args) {
		new ControlDemoProgramm().setVisible(true);

	}

	
	private DatenModel getDatenModel() {
		if(datenModel == null) {
			datenModel = new DatenModel();
		}
		return datenModel;
	}

	private JPanel getCenterPanel() {
		if(centerPanel == null) {
			centerPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
			centerPanel.add(getKundenComboBox());
			centerPanel.add(getBestellungCombox());
			centerPanel.add(getBestellPositionen());
		}
		return centerPanel;
	}

	private JComboBox getKundenComboBox() {
		if(kundenComboBox == null) {
			kundenComboBox = new JComboBox(new ComboBoxKundenController());
		}
		return kundenComboBox;
	}

	private JComboBox getBestellungCombox() {
		if(bestellungCombox == null) {
			bestellungCombox = new JComboBox(new ComboBoxBestellungController());
		}
		return bestellungCombox;
	}

	private JList getBestellPositionen() {
		if(bestellPositionen == null) {
			bestellPositionen = new JList(new ListBestellPositionenController());
		}
		return bestellPositionen;
	}
	
	
	class ComboBoxKundenController extends AbstractListModel implements ComboBoxModel, Observer {

		private Kunde selectItem = null;
		public ComboBoxKundenController() {
			getDatenModel().addObserver(this);
		}
		@Override
		public Object getSelectedItem() {
			return selectItem;
		}

		@Override
		public void setSelectedItem(Object anItem) {
			selectItem = (Kunde) anItem;
			getDatenModel().setKundeFilter(selectItem);
			fireContentsChanged(this, -1, -1);
			
		}

		@Override
		public Object getElementAt(int index) {
			
			return getDatenModel().getKunden().get(index);
		}

		@Override
		public int getSize() {
			
			return getDatenModel().getKunden().size();
		}
		@Override
		public void update(Observable o, Object arg) {
			fireContentsChanged(this, -1, -1);
			
		}
		
	}
	
	class ComboBoxBestellungController extends AbstractListModel implements ComboBoxModel, Observer {

		private Bestellung selectItem = null;
		public ComboBoxBestellungController() {
			getDatenModel().addObserver(this);
		}
		@Override
		public Object getSelectedItem() {
			return selectItem;
		}

		@Override
		public void setSelectedItem(Object anItem) {
			selectItem = (Bestellung) anItem;
			getDatenModel().setBestellungFilter(selectItem);
			fireContentsChanged(this, -1, -1);
			
		}

		@Override
		public Object getElementAt(int index) {
			
			return getDatenModel().getBestellungen().get(index);
		}

		@Override
		public int getSize() {
			
			return getDatenModel().getBestellungen().size();
		}
		@Override
		public void update(Observable o, Object arg) {
			fireContentsChanged(this, -1, -1);
			
		}
		
	}
	
	class ListBestellPositionenController extends AbstractListModel implements Observer {

		private Bestellung selectItem = null;
		public ListBestellPositionenController() {
			getDatenModel().addObserver(this);
		}
		

		@Override
		public Object getElementAt(int index) {
			
			return getDatenModel().getBestellungPositionen().get(index);
		}

		@Override
		public int getSize() {
			
			return getDatenModel().getBestellungPositionen().size();
		}
		@Override
		public void update(Observable o, Object arg) {
			fireContentsChanged(this, -1, -1);
			
		}
		
	}

}
 
Wie schwer ist es denn den Code so umzubauen, dass es drei Listen sind?
Ich hab die zwei Comboboxen mal ausgetauscht und dafür Listen eingesetzt. Es wird zwar was angezeigt, aber beim klick in die erste Liste passiert schon nix mit der zweiten liste. Gescheigeden mit der dritten Liste :)

Muß denn da noch ein onClick Ereignis hinzugefügt werden?

Und dann noch ne Frage. Das ganze kann ich doch auch in SWT programmieren? Bzw dann muß ich doch die Label und contentprovider verwenden?
 
Zuletzt bearbeitet:
Wie schwer ist es denn den Code so umzubauen, dass es drei Listen sind?
Ich hab die zwei Comboboxen mal ausgetauscht und dafür Listen eingesetzt. Es wird zwar was angezeigt, aber beim klick in die erste Liste passiert schon nix mit der zweiten liste. Gescheigeden mit der dritten Liste :)

Muß denn da noch ein onClick Ereignis hinzugefügt werden?

Und dann noch ne Frage. Das ganze kann ich doch auch in SWT programmieren? Bzw dann muß ich doch die Label und contentprovider verwenden?


Zu den Listen statt der Comboboxen: Im Gegensatz zu den ComboBoxen können Listen mehrere selektierte Zeilen haben. Deswegen kann nicht einfach nur die beiden Methoden die das ComboBoxModel Interface fordert, einbauen. Stattdessen muss man tatsächlich eine Art "onlick" verwenden. Nur heißt der hier ListSelectionListener. Code steht weiter unten.

Zu SWT. natürlich kann man das auch in SWT programmieren. Hättest Du früher geantwortet, dann wäre das Beispiel halt in SWT geschrieben worden.

Label und ContentProvider gehören zu JFACE einer Technik, die auf SWT aufsetzt. Das erleichtert das Handling sehr. Im Grunde haben Content- und Labelprovider die Aufgabe meiner Controllerklassen. Ich würde SWT + JFACE verwenden. Der Nachteil ist, das SWT nicht Bestandteil von J2SE ist.

Da Du mit Netbeans arbeitest gehe ich davon aus, dass Du keine Rich-Client entwickeln willst. Bis Du mit Java etwas sicherer bist würde ich Dir deshalb empfehlen erst mit SWING zu beginnen.

Aber vielleicht sagt Du ja noch ein wenig zu Deinem Projekt und zur Wahl der GUI....


Hier die angepasste Maske.

Gruß

Java:
package de.tutorials;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.util.Observable;
import java.util.Observer;

import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class ControlDemoProgramm extends JFrame{

	private JPanel centerPanel = null;
	private JList kundenListBox = null;
	private JList bestellungListbox = null;
	private JList bestellPositionen = null;
	private DatenModel datenModel = null;
	
	
	
	static {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	public ControlDemoProgramm() {
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	
		getContentPane().add(getCenterPanel(), BorderLayout.CENTER);
		
		pack();
		
		
	}
	
	public static void main(String[] args) {
		new ControlDemoProgramm().setVisible(true);

	}

	
	private DatenModel getDatenModel() {
		if(datenModel == null) {
			datenModel = new DatenModel();
		}
		return datenModel;
	}

	private JPanel getCenterPanel() {
		if(centerPanel == null) {
			centerPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
			centerPanel.add(getKundenListBox());
			centerPanel.add(getBestellungListBox());
			centerPanel.add(getBestellPositionen());
		}
		return centerPanel;
	}

	private JList getKundenListBox() {
		if(kundenListBox == null) {
			kundenListBox = new JList();
			kundenListBox.setModel(new ComboBoxKundenController());
		}
		return kundenListBox;
	}

	private JList getBestellungListBox() {
		if(bestellungListbox == null) {
			bestellungListbox = new JList();
			bestellungListbox.setModel(new ComboBoxBestellungController());
		}
		return bestellungListbox;
	}

	private JList getBestellPositionen() {
		if(bestellPositionen == null) {
			bestellPositionen = new JList(new ListBestellPositionenController());
		}
		return bestellPositionen;
	}
	
	
	class ComboBoxKundenController extends AbstractListModel implements Observer {

		
		public ComboBoxKundenController() {
			getDatenModel().addObserver(this);
			ListSelectionListener listener = new ListSelectionListener(){

				@Override
				public void valueChanged(ListSelectionEvent e) {
					getDatenModel().setKundeFilter((Kunde) getKundenListBox().getSelectedValue());
					
				}};
			getKundenListBox().addListSelectionListener(listener);
		}
		
		@Override
		public Object getElementAt(int index) {
			
			return getDatenModel().getKunden().get(index);
		}

		@Override
		public int getSize() {
			
			return getDatenModel().getKunden().size();
		}
		@Override
		public void update(Observable o, Object arg) {
			fireContentsChanged(this, -1, -1);
			
		}
		
	}
	
	class ComboBoxBestellungController extends AbstractListModel implements  Observer {

		
		public ComboBoxBestellungController() {
			getDatenModel().addObserver(this);
			getBestellungListBox().addListSelectionListener(new ListSelectionListener(){

				@Override
				public void valueChanged(ListSelectionEvent e) {
					getDatenModel().setBestellungFilter((Bestellung) getBestellungListBox().getSelectedValue());
					
				}});
		}
		

		@Override
		public Object getElementAt(int index) {
			
			return getDatenModel().getBestellungen().get(index);
		}

		@Override
		public int getSize() {
			
			return getDatenModel().getBestellungen().size();
		}
		@Override
		public void update(Observable o, Object arg) {
			fireContentsChanged(this, -1, -1);
			
		}
		
	}
	
	class ListBestellPositionenController extends AbstractListModel implements Observer {

		private Bestellung selectItem = null;
		public ListBestellPositionenController() {
			getDatenModel().addObserver(this);
		}
		

		@Override
		public Object getElementAt(int index) {
			
			return getDatenModel().getBestellungPositionen().get(index);
		}

		@Override
		public int getSize() {
			
			return getDatenModel().getBestellungPositionen().size();
		}
		@Override
		public void update(Observable o, Object arg) {
			fireContentsChanged(this, -1, -1);
			
		}
		
	}

}
 
Zurück