Combobox in Abhängigkeit von Spinner

Chris87

Mitglied
Hallo,

ich habe folgendes Problem: Ich habe ein GUI für ein Navigationsprogramm innerhalb eines Gebäudes geschrieben. Die Navigation erfolgt anhand der Eingabe von Start/Ziel-Raum und Start/Ziel-Etage in JSpinner. Ich möchte nun jedoch zusätzliche Informationen in Form einer Combox darstellen, die sich je nach Eingabe der Spinner ändern z.B. wählt man als Start: Raum 10, Etage 2 und die Combobox zeigt direkt "Büro" an. Also einen Listener.
Bin da aber echt ratlos zur Zeit. Vielleicht kennt jemand eine gute Quelle wo sowas step by step erklärt wird.

Danke schonmal

Grüße Christian
 
Wenn du dein Problem konkretisierst kann man bestimmt weiterhelfen. Hast du denn schon den Listener? Wo liegt das Problem?
 
Achso Entschuldigung🙂 Also die grafische Oberfläche steht soweit, möchte nurnoch als Zusatzfunktion die Combobox einfügen, die auf die Spinnereingabe reagiert.
 
Das kann man so aber schlecht sagen, weil wir dein Model nicht kennen.
Denkbar wäre z.B. so etwas grob wie
Java:
			public void stateChanged(ChangeEvent e) {
				int etageValue = (Integer) etage.getValue();
				int raumValue = (Integer) raum.getValue();
				for (Location location : model) {
					if(location.getRaum() == raumValue && location.getEtage() == etageValue){
						bezeichnung.setSelectedItem(location); //bezeichnung = combobox
						break;
					}
				}
			}

D.h. wenn sich einer der Spinner ändert (gleiche Listener an beide) durchläufst du deine Objekte/Model und prüfst ob eines der Objekte der Etagen und Raumzahl passt und selektierst diese in der Combobox. Gibt aber sicherlich noch viele andere Möglichkeit und es kommt eben auf deinen bisherigen Code an.

Aber hier mal ein Beispiel:
Java:
import java.awt.Component;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.ListCellRenderer;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class App {

	public static void main(String[] args) throws Exception {

		JFrame frame = new JFrame();
		JPanel panel = new JPanel();
		
		final Location[] model = new Location[]{new Location(1, 1, "Abstellkammer"), new Location(2, 10, "Büro")}; //usw...
		
		
		JLabel etageLbl = new JLabel("Etage");
		final JSpinner etage = new JSpinner(new SpinnerNumberModel(0, 0, 3, 1));
		etage.setEditor(new JSpinner.NumberEditor(etage, "00"));
		JLabel raumLbl = new JLabel("Raum");
		final JSpinner raum = new JSpinner(new SpinnerNumberModel(0, 0, 10, 1));
		raum.setEditor(new JSpinner.NumberEditor(raum, "00"));
		
		final JComboBox bezeichnung = new JComboBox(model);
		bezeichnung.setRenderer(new ListCellRenderer() {
			JLabel label = new JLabel();
			@Override
			public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
				Location loc = (Location) value;
				label.setText(loc.getBezeichnung());
				return label;
			}
		});
		
		ChangeListener listener = new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent e) {
				int etageValue = (Integer) etage.getValue();
				int raumValue = (Integer) raum.getValue();
				for (Location location : model) {
					if(location.getRaum() == raumValue && location.getEtage() == etageValue){
						bezeichnung.setSelectedItem(location);
						break;
					}
				}
			}
		};
		
		etage.addChangeListener(listener);
		raum.addChangeListener(listener);
		etageLbl.setLabelFor(etage);
		raumLbl.setLabelFor(raum);
		panel.add(etageLbl);
		panel.add(etage);
		panel.add(raumLbl);
		panel.add(raum);
		panel.add(bezeichnung);
		frame.add(panel);

		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}

}
class Location{
	private int etage, raum;
	private String bezeichnung;
	
	public Location(int etage, int raum, String bezeichnung) {
		this.etage = etage;
		this.raum = raum;
		this.bezeichnung = bezeichnung;
	}
	
	public int getEtage() {
		return etage;
	}
	
	public void setEtage(int etage) {
		this.etage = etage;
	}
	
	public int getRaum() {
		return raum;
	}
	
	public void setRaum(int raum) {
		this.raum = raum;
	}
	
	public String getBezeichnung() {
		return bezeichnung;
	}

	public void setBezeichnung(String bezeichnung) {
		this.bezeichnung = bezeichnung;
	}
	
}
 
Schonmal danke für die Mühe Basti, das hilft mir schon ein wenig weiter. Trotzdem hier mal mein Code
Java:
import javax.swing.*;
import inf.v3d.obj.*;
import inf.v3d.view.ViewerPanel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import inf.vtk.uiswing.*;
import javax.swing.border.*;

public class GrafischeOberflaeche extends JFrame implements ActionListener {

//Attribute   
    // Spinner für Start- und Zieleingabe
    private JSpinner sraumSpinner = new JSpinner(new SpinnerNumberModel(1.0,
            1.0, 180.0, 1.0));
    // Startraum
    private JSpinner setageSpinner = new JSpinner(new SpinnerNumberModel(1.0,1.0, 3.0, 1.0));
    // Startetage
    private JSpinner zraumSpinner = new JSpinner(new SpinnerNumberModel(1.0,1.0, 180.0, 1.0));
    // Zielraum
    private JSpinner zetageSpinner = new JSpinner(new SpinnerNumberModel(1.0,1.0, 3.0, 1.0));
    // Zieletage
    private JButton buttonNavigieren = new JButton("Navigation starten");
    // großes Panel für 3D-Navigation
    private ViewerPanel viewerpanel = new ViewerPanel();
    // Testlabels für den Weg (müssen ersetzt werden)!!!
    private JLabel l1 = new JLabel();
    private JLabel l2 = new JLabel();
    private JLabel l3 = new JLabel();

// Konstruktor
    public GrafischeOberflaeche() {
        Object3D.setAutoRegister(true);
        JPanel grundPanel = new JPanel(new BorderLayout());
        JPanel linkerSeitenrand = new JPanel(new BorderLayout());
        JPanel wegFeldRahmen = new JPanel(new BorderLayout());
        JPanel wegFeldPanel = new JPanel(new BorderLayout());
        JPanel viewerPanel = new JPanel(new BorderLayout());
        JPanel rahmenAußen = new JPanel(new BorderLayout());
        JPanel rahmenInnen = new JPanel(new BorderLayout());
        JPanel start = new JPanel(new GridLayout(4, 2));
        JPanel ziel = new JPanel(new GridLayout(4, 2));

        // Testlabels
        wegFeldRahmen.setBorder(new TitledBorder("Weg"));
        wegFeldPanel.add(l1);
        wegFeldPanel.add(l2);
        wegFeldPanel.add(l3);

        // Hinzufügen der Toolbar
        JToolBar toolbar = new JToolBar();
        toolbar.add(new VTKViewControlToolbar(viewerpanel.getCanvas()));
        toolbar.add(new VTKViewPointToolbar(viewerpanel.getCanvas()));

        // Anordnung der Starteingabe
        start.setBorder(new TitledBorder("Startkoordinaten"));
        start.add(new JLabel("Startraum:"));
        start.add(sraumSpinner);
        start.add(new JLabel("Startetage:"));
        start.add(setageSpinner);

        // Anordnung der Zieleingabe
        ziel.setBorder(new TitledBorder("Zielkoordienaten"));
        ziel.add(new JLabel("Zielraum:"));
        ziel.add(zraumSpinner);
        ziel.add(new JLabel("Zieletage:"));
        ziel.add(zetageSpinner);

        setSize(900, 600); 
        setTitle("Navigation");
        setLocation(0, 0);

        // Layout der einzelnen Felder
        add(grundPanel, BorderLayout.CENTER);
        grundPanel.add(viewerPanel, BorderLayout.CENTER);
        viewerPanel.add(toolbar, BorderLayout.NORTH);
        viewerPanel.add(viewerpanel, BorderLayout.CENTER);
        grundPanel.add(linkerSeitenrand, BorderLayout.WEST);
        linkerSeitenrand.add(rahmenAußen, BorderLayout.NORTH);
        linkerSeitenrand.add(wegFeldRahmen, BorderLayout.CENTER);
        wegFeldRahmen.add(wegFeldPanel, BorderLayout.CENTER);
        rahmenAußen.add(rahmenInnen, BorderLayout.CENTER);

        buttonNavigieren.setBorder(new EtchedBorder(EtchedBorder.RAISED));
        buttonNavigieren.setBackground(new Color(200, 200, 100));
        buttonNavigieren.addActionListener(this);
        rahmenAußen.add(buttonNavigieren, BorderLayout.SOUTH);
        rahmenInnen.add(start, BorderLayout.NORTH);// evtl. Anpassen
        rahmenInnen.add(ziel, BorderLayout.SOUTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent ae) {
        if (ae.getSource() == buttonNavigieren) {
            // Anweisungen fehlen noch!!!
        }
    }
    public static void main(String[] args) {
        new GrafischeOberflaeche();
    }

}
 
Zuletzt bearbeitet von einem Moderator:
Ich habe jetzt den ganzen Mittag rumprobiert und bekomme das soweit hin. Ich denke aber ich werds doch anders umsetzen und zwar ohne Combobox.
Anhand der Spinnereingabe sollen die weiteren Raumdaten aus der Datenbank geholt werden und in dem Ausgabefeld unten rechts einfach angezeigt werden. Sind immerhin 150 Räume mal drei Etagen. Was haltet ihr von der Alternative?
 

Zurück
Oben