JComboBox

RaptoXX

Grünschnabel
Hallo!
Bei meinem letzten Projekt ist was schiefgelaufen. (Arraylist ändern)
Und zwar habe ich vergessen zu schreiben, dass nur das Element, das die Kontonummer, die ich in der ComboBox ausgewählt habe, geändert werden soll. Das hat dazu geführt, dass ich die gesamte Arraylist mit diesen einzigen Element überschrieben habe.

Dummerweise führte gestern ein PC-Absturz dazu, dass mir das Projekt verloren ging. Hab jetzt auf die Schnelle was Neues gemacht, allerdings sind da ein paar Fehler drin, wo ich nicht weiter weiß.

Hier mal der Code meiner Klassen:

Kontodaten:
Java:
package test;

public class Kontodaten {

	private int kontonr;
	private String vname;
	private String nname;
	private double betrag;
	
	public Kontodaten(int kontonr, String vname, String nname, double betrag) {
	}
	public String getVName() {
	return vname;
	}
	void setVName(String vname) {
	this.vname = vname;
	}
	public String getNName() {
	return nname;
	}
	void setNName(String nname) {
	this.nname = nname;
	}
	void setKontonummer(int kontonr) {
	this.kontonr = kontonr;
	}
	int getKontonummer() {
	return kontonr;
	}
	void setBetrag(double betrag) {
	this.betrag = betrag;
	}
	double getBetrag() {
	return betrag;
	}
}

KontoGUI
Java:
package test;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JButton;
import javax.swing.JTextField;

public class KontoGUI extends JFrame implements ActionListener {
	
	String[][] inhalt; //Eigenschaften der Klasse
	JTable table;
	JPanel p;
	JPanel p1;
	JLabel kontonr = new JLabel("Kontonummer:");
	JComboBox Kontonr = new JComboBox();
	JLabel nname = new JLabel("Name:");
	JLabel vname = new JLabel("Vorname:");
	JLabel betrag = new JLabel("Betrag:");
	JTextField tfNName = new JTextField();
	JTextField tfVName = new JTextField();
	JTextField tfBetrag = new JTextField();
		JButton showButton = new JButton("Daten anzeigen");
		JButton changeButton = new JButton("Ändern");
		JButton clearButton = new JButton("Löschen");
		
	JPanel p2;
    ArrayList<Kontodaten> liste = new ArrayList<Kontodaten>();
	
	public void initPanel1(){
		p1= new JPanel();
		p1.setLayout(null);
		kontonr.setBounds(20,25,110,30);
		p1.add(kontonr);
		Kontonr.setBounds(150,25,110,30);
		p1.add(Kontonr);
		showButton.setBounds(20,70,240,20);
		p1.add(showButton);
		
		nname.setBounds(20,100,110,30);
		p1.add(nname);
		vname.setBounds(20,130,110,30);
		p1.add(vname);
		betrag.setBounds(20,160,110,30);
		p1.add(betrag);
		
		tfNName.setBounds(150,100,110,30);
		p1.add(tfNName);
		tfVName.setBounds(150,130,110,30);
		p1.add(tfVName);
		tfBetrag.setBounds(150,160,110,30);
		p1.add(tfBetrag);
		
		changeButton.setBounds(20,210,240,30);
		p1.add(changeButton);
		clearButton.setBounds(20,255,240,30);
		p1.add(clearButton);
		
		showButton.addActionListener(this);
		changeButton.addActionListener(this);
		clearButton.addActionListener(this);
		}
	
public KontoGUI(){
	erzeugeliste(liste);
	this.setTitle("Kontoverwaltung");
	this.setSize(500,250);
	String[] kon = new String[liste.size()];
	for (int i=0; i<liste.size(); i++)
		kon[i]=String.valueOf(liste.get(i).getKontonummer());
	Arrays.sort(kon);
	Kontonr= new JComboBox(kon);
	initGUI();
	}

	public void initPanel2(){
		p2= new JPanel();
		p2.setLayout(new BorderLayout());
		String[] titel = {"Kontonr.","Vorname", "Name","Betrag"};
		inhalt = new String[liste.size()][4];
		table = new JTable(inhalt, titel);
		p2.add(new JScrollPane(table),BorderLayout.CENTER);
		tabellenausgabe();
		
	}
	
	public void initGUI() {
	p = (JPanel)this.getContentPane();
	initPanel1();
	initPanel2();
	p.setLayout(new GridLayout(1,2));
	p.add(p1);
	p.add(p2); 
	this.pack();
	}
	private static void erzeugeliste(ArrayList<Kontodaten> liste) {
		liste.add(new Kontodaten(2350124, "Luise", "Auermann", 2000.00));
        liste.add(new Kontodaten(4250125, "Hans", "Zaun", 1200.00));
        liste.add(new Kontodaten(7440127, "Tom", "Bock", -400.00));
        liste.add(new Kontodaten(1760126, "Mario", "Haus", 317.74));
        liste.add(new Kontodaten(5140133, "Saskia", "Brauer", -74.68));
        liste.add(new Kontodaten(8560142, "Julia", "Hess", 147.58));
        liste.add(new Kontodaten(9930141, "Christin", "Berger", 0.00));
        liste.add(new Kontodaten(3270132, "Andreas", "Wagner", 641.21));
        liste.add(new Kontodaten(1180135, "Caroline", "Großmann", -474.15));
        liste.add(new Kontodaten(4810155, "Axel", "Auermann", 1.23));
	}
	public void actionPerformed(ActionEvent event) {
		Object source = event.getSource();
		
		//Event:Anzeigen
		if(source == showButton){
		for (int i = (liste.get(i).getKontonummer());;){
			tfVName.setText(inhalt[i][1]);
			tfNName.setText(inhalt[i][2]);
			tfBetrag.setText(inhalt[i][3]);
		}
		}
		
		//Event:Clear
		if(source == clearButton){
		tfVName.setText("");
		tfNName.setText("");
		tfBetrag.setText("");
		}
		
		//Event:Ändern
		if(source == changeButton){
		for (int i= 0; i<liste.size(); i++ ){
			if(liste.get(i).getKontonummer().equals(Kontonr))
			inhalt[i][1]= String.valueOf(tfVName);
			inhalt[i][2]= String.valueOf(tfVName);
			inhalt[i][3]= String.valueOf(tfBetrag);
		}
		}
	}
		

	
	private void tabellenausgabe() {
		for (int i=0;i<liste.size();i++){
		inhalt[i][0]= String.valueOf(liste.get(i).getKontonummer());
		inhalt[i][1]= liste.get(i).getVName();
		inhalt[i][2]= liste.get(i).getNName();
		inhalt[i][3]= String.valueOf(liste.get(i).getBetrag());
		} 
		table.repaint();
		}
}

Kontoverwaltung:
Java:
package test;

public class Kontoverwaltung {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		KontoGUI stud = new KontoGUI();
		stud.setLocation(500,250);
		stud.setVisible(true);
	}

}

Die Fehler sind folgende:
1. Beim "Ändern" gibt es einen Fehler: (rot unterstrichen)
"Cannot invoke equals(JComboBox) on the primitive type int"
2. Wenn ich das Programm starte, kommt zwar das Fenster, aber die Tabelle ist leer, bzw. stehen bei den Kontonummern "0" und bei den Beträgen "0.0".

Was ist da falsch, bzw. fehlt mir dort was?
Bitte wieder um schnelle Hilfe und wenn mgl. um den richtigen Code, da ich ab Freitag mit Prüfungen beschäftigt bin und das Projekt gern vorher fertig haben möchte. ;)

mfG RaptoXX
 
1. Beim "Ändern" gibt es einen Fehler: (rot unterstrichen)
"Cannot invoke equals(JComboBox) on the primitive type int"
ja, warum willst du auch einen Integer mit einer JComboBox vergleichen? (Zeile 139 in KontoGUI.java)

2. Der Fehler liegt in der Methode initPanel2:
Java:
        String[] titel = {"Kontonr.","Vorname", "Name","Betrag"};
        inhalt = new String[liste.size()][4];
        table = new JTable(inhalt, titel);
Du erzeugst ein neues Array 'inhalt' mit der korrekten Größe, aber befüllst es nicht!

PS: Wenn du den Code korrekt einrückst, vereinfachst du uns das Lesen.
PS2: Du solltest unbedingt vermeiden, in Graphischen Oberflächen mit absoluten Bounds/Koordinaten zu arbeiten. Bei verschiedenen Themes oder LookAndFeels, Betriebssystemen, Schriftgrößen, etc. kann es sonst zu fehlerhafter Darstellung kommen.
 
Hi!

Ist mir jetzt auch aufgefallen, dass das beim ersten Fehler schlecht geht. Will ja eigentlich den Wert der ComboBox mit denen in der Tabelle vergleichen. Wie wäre dazu der Code?

Ich befülle die Tablle nicht? Das versteh ich grad nicht. Ich habe doch am Ende der initPanel2 die "tabellenausgabe()", die ich ab Zeile 149 in der KontoGUI geschrieben habe, verwendet.

mfG RaptoXX
 
Zuletzt bearbeitet:
1. Du solltest die Trennung zwischen Model (=Daten) und View (=sichtbare Anzeige) berücksichtigen. Für beide (Tabelle wie JComboBox) kannst du ein Datenmodell angeben, dass unabhängig von der tatsächlichen (optischen/graphischen) Darstellung ist.

2. Wozu rufst du table.repaint() auf (in der Methode tabellenausgabe)? Für das neu Zeichnen der Tabelle gibt es Listener, die in den normalen TableModels bei Änderungen an den Daten dafür sorgen, dass die Tabelle neu gezeichnet wird.
Problem ist in deinem Fall, dass du die Daten (leeres Array) an den Constructor der Tabelle übergibst, dieser daraus ein TableModel generiert und du danach die Daten füllst. Du musst die Reihenfolge vertauschen!

Für die Tabellen gibt es ein HowTo: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html
 
Hallo!

Das erste geht klar. Ich hab dazu ne Lösung gefunden.

Nur bei dem zweiten komm ich echt nicht weiter. Ich hab das ganze so gemacht, wie es in der Hilfe drin war. Leider kommt es auf das selbe hinaus; überall sind Nullen.

Habe auch versucht, wie du es genannt hast die Reihenfolge zu verändern. -> selbes Ergebnis

Er findet auch defintiv die Arraylist und er weiß auch, dass sie aus 10 Elementen besteht, aber dennoch kommt nichts sinnvolles dabei raus.

Sorry, aber ich blick da langsam echt nicht mehr durch. :(

EDIT: Fehler gefunden! Mein Konstruktor für Kontodaten in der ersten Klasse war leer. :eek:
Damit konnte er die Werte nicht zuweisen und alles ist "Null" gewesen. Jetzt ist die Tabelle gefüllt. Muss jetzt noch die Buttons funktionstüchtig machen und dann wars das auch. Ich danke vielmals für die Hilfe.

mfG RaptoXX
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück