GUI Absturz nach 3x benutzen einer JComboBox

Asumanji

Mitglied
Hallo Comm,
ich bin grade dabei einen Kalender grafisch zu Programmieren. Der stellt beim starten den aktuellen Monat dar.
Mit 2 JComboBoxen ändere ich das ausgewählte Jahr mit der einen und den ausgewählten Monat mit der anderen.
Das heißt in diesem Fall das alle Elemente entfernt und passend für den neuen Monat erstellt werden.
Das Problem das ich nun habe ist, das sich das Programm aufhängt und sich nur noch über den Taskmanager schließen lässt, wenn ich 3x einen Eintrag in der JComboBox ändere.
Dabei ist die Reihenfolge der Änderung egal, also 3x Jahr ändern hat den selben Effekt wie 3x Monat ändern oder 2x Monat und 1x Jahr ändern.
Hat jemand schon mal ein ähnliches Problem gehabt?
Vielen Dank für eure Zeit
Gruß ich ;)
 

Joose

Top Contributor
Wenn die GUI hängen bleibt gibt es meist einen Programmierfehler.
Ohne Code kann man nicht wirklich helfen.

PS: Abstürzen ist etwas anderes als "hängen bleiben"
 
Zuletzt bearbeitet:

Asumanji

Mitglied
Danke für die schnelle Antwort. Du hast natürlich Recht, es hätte ja sein können das es ein bekanntes Problem ist.
Java:
this.cJahr.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				tKalender.removeAll();
				String strJahr = (String) cJahr.getSelectedItem();
				currYear = Integer.parseInt(strJahr);
				firstDay = new GregorianCalendar(currYear, currMonth, 1);
				DoW = firstDay.get(Calendar.DAY_OF_WEEK);
				mt = 31;
				initComponents();
				initListeners();
				tabpane.setSelectedIndex(6);
			}
		});
		
		this.cMonat.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				tKalender.removeAll();
				String strMonat = (String) cMonat.getSelectedItem();
				switch(strMonat){
					case "Januar": currMonth = 0;
					break;
					case "Februar": currMonth = 1;
					break;
					case "März": currMonth = 2;
					break;
					case "April": currMonth = 3;
					break;
					case "Mai": currMonth = 4;
					break;
					case "Juni": currMonth = 5;
					break;
					case "Juli": currMonth = 6;
					break;
					case "August": currMonth = 7;
					break;
					case "September": currMonth = 8;
					break;
					case "Oktober": currMonth = 9;
					break;
					case "November": currMonth = 10;
					break;
					case "Dezember": currMonth = 11;
					break;
				}
				firstDay = new GregorianCalendar(currYear, currMonth, 1);
				DoW = firstDay.get(firstDay.DAY_OF_WEEK);
				mt = 31;
				initComponents();
				initListeners();
				tabpane.setSelectedIndex(6);
			}
		});
	}

Das sind meine Listener für die JComboBoxen.
Ich habe da schon dran rumgebastelt, aber es ändert an meinem Problem nix.
Ich hoffe das ist übersichtlich genug.
 

Asumanji

Mitglied
Anhang anzeigen 7393
So sieht es aus und so soll es auch aussehen.
Eclipse zeigt noch ein paar Warnungen an:
Java:
	private JLabel		lblJahr			= new JLabel("Jahr:");
	private JComboBox	cJahr			= new JComboBox(strJahr);
	private JLabel		lblMonat		= new JLabel("Monat:");
	private JComboBox	cMonat			= new JComboBox(strMonate);
Warnung:
Java:
Description	Resource	Path	Location	Type
JComboBox is a raw type. References to generic type JComboBox<E> should be parameterized	Verwaltung.java	

Description	Resource	Path	Location	Type
Type safety: The constructor JComboBox(Object[]) belongs to the raw type JComboBox. References to generic type JComboBox<E> should be parameterized	Verwaltung.java
In strJahr sind die Jahre 2014, 2015 und 2016 gespeichert und in strMonate die Monate Januar bis Dezember, jeweils als
Java:
private String[] strMonate = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};

	private String 		lastYear		= String.valueOf(currYear - 1);
	private String 		thisYear		= String.valueOf(currYear);
	private String 		nextYear		= String.valueOf(currYear + 1);
	private String[] 	strJahr			= {lastYear, thisYear, nextYear};
Die erste Warnung taucht für jede der beiden JComboBox 2x auf und die 2. Warnung einmal für jede JComboBox.
Das Programm lässt sich auch ausführen, zumindest bis man zum 3. mal Monat/Jahr ändern will.
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Von drei möglichen Listenern (Jahr, Monat, Tag) zeigst du zwei. Was ist mit dem dritten? Und auch bei den beiden gezeigten Listenern fehlt viel zu viel, als das ich da was gescheites zu sagen könnte. In welcher Klasse befinden sich die Listener? Was ist tKalender und tabPane? Was pasisert in initComponents und initListeners?
Die Namen der zuletzt genannten Methoden legen die Vermutung nahe, daß du deine Gui in den actionPerformed() Methoden jedesmal neu aufbaust, was wiederum ein sehr schlechtes Design wäre.
 

Asumanji

Mitglied
Von drei möglichen Listenern (Jahr, Monat, Tag) zeigst du zwei.
Wozu brauche ich einen für den Tag? Die beiden Listener prüfen die Änderungen in den JComboBoxen um festzustellen welchen Monat und welches Jahr der Nutzer gewählt hat. Standardmäßig ist der aktuelle Monat im aktuellen Jahr offen, also Februar 2015.

Was ist mit dem dritten? Und auch bei den beiden gezeigten Listenern fehlt viel zu viel, als das ich da was gescheites zu sagen könnte. In welcher Klasse befinden sich die Listener?
Wenn ich das richtig im Blick hab, denn hab ich nur eine Klasse für alles.

Was ist tKalender und tabPane?
Ich hab einen JTabbedPane(left) tabPane und tKalender ist der Tab in dem der Kalender ist.

Was pasisert in initComponents und initListeners?
initComponents() bezogen nur auf den Kalender und in der Reihenfolge:
- GridLayout(0,7) da ich ja 7 Wochentage habe, Anzahl der Zeilen sind dynamisch je nach Monat
- Label für die 7 Wochentage werden hinzugefügt
- Variable mt (Tage im Monat) wird per Switch auf 30, 29 oder 28 gesetzt, Standard ist 31
- per Schleife werden leere Label erstellt, sodass der erste Tag im Monat auch den richtigen Wochentag zugeordnet bekommt
- per Schleife wird dann für jeden Tag ein JButton erstellt und Samstage und Sonntage gelb gefärbt
- nach dem letzen JButton eine Schleife für leere Label, damit die JComboBoxen auch wirklich immer unten rechts stehen
- dann werden Label für Jahr, ComboBox für Jahr, Label für Monat und ComboBox für Monat hinzugefügt
- dann nur noch die Einstellungen das der Text in den Labeln zentriert ist und die ComboBoxen auch den aktuelen Monat und Jahr anzeigen

initListeners():hier stehen die Listener für die beiden ComboBoxen drin. Für die einzelnen Tage (sind ja alles Buttons) sollen auch noch Listener dazukommen.

Die Namen der zuletzt genannten Methoden legen die Vermutung nahe, daß du deine Gui in den actionPerformed() Methoden jedesmal neu aufbaust, was wiederum ein sehr schlechtes Design wäre.
Jop, wie beschrieben werden halt alle Elemente entfernt und wieder komplett neu aufgebaut.
Wie kann man es besser machen? Ich bin ja davon ausgegangen das jeder Monat anders ist.

Danke für deine Antwort
 

Asumanji

Mitglied
Was meinst du mit anonymen Listenern? Ich muss doch für jedes Objekt das ein Event auslösen soll einen Listener erstellen, oder sehe ich das falsch?
 

Harry Kane

Top Contributor
Was meinst du mit anonymen Listenern?
In deinem ersten Codeschnipsel aus Post 3 legst du zwei anonyme ActionListener an bzw. zwei anonyme Klassen, die das ActionListener interface implementieren und als ActionListener für die JComboBoxen verwendet werden. Der Begriff "anonyme Klasse" ist dir aber schon geläufig?

Ich muss doch für jedes Objekt das ein Event auslösen soll einen Listener erstellen, oder sehe ich das falsch?
Nein, das siehst du richtig. Nur wie oben bereits geschrieben, haben die beiden JComboBoxen für Auswahl des Jahres und des Monats jeweils einen anonymen ActionListener. Dann schreibst du, dass in "initListeners() die Listener für die beiden ComboBoxen drinstehen". Entweder dein Schnipsel oben mit den anonymen Klassen ist aus der initListeners-methode, oder du legst verpasst den JComboBoxen womöglich zwei ActionListener, die sich irgewndwie in die Quere kommen.
Poste mal ein SSCCE. Dann erübrigt sich das Rumraten und spekulieren.
 

Asumanji

Mitglied
Danke, du hast mir echt geholfen.
Das Problem war das ich die Listener bereits initialisiert hatte und dachte sie werden wie die Objekte wieder entfernt.
Das führte dazu das ich bei jedem Ändern von den ComboBoxen die Listener wieder neu (oder zusätzlich?) initialisiert habe.
Das Problem ließ sich also dadurch beheben das ich den Methodenaufruf für die Listener aus den Events der ComboBoxen raus genommen habe.

Aber um zu meiner Frage zurückzukommen: du sagtest ja, dass das entfernen der Elemente und das neu aufbauen ein schlechtes Design ist. Wie kann man das besser machen?
Was heißt SSCCE? Meine du damit das "Kurzes, Selbständiges, Kompilierbares Beispiel"?
Und nein ich weiß nicht, was anonyme Klassen sind, kann mir aber denken das damit, wie du schon sagst, die Listener gemeint sind, da diese anders aufgerufen werden.
 

Harry Kane

Top Contributor
Wie man das besser machen kann, ist angesichts der Tatsache, dass ich nicht genau weiß, wie du es aktuell implementiert hast, schwer zu sagen.
Anstatt neue JLabel und JButtons zu erzeugen, könntest du ihnen z. B. einen neuen Text verpassen und JButtons, die für den aktuellen Monat nicht gebraucht werden, auf disabled oder invisible setzen. Dafür bräuchtest du aber einen LayoputManager, der sich um das visible-flag einer JComponent schert. ich weiss nicht, ob Gridlayout das tut (ich verwende seit Jahren für praktisch alle Layoutaufgaben das MigLayoutm und dort gibt es verschiedene Möglichkeiten, wie eine unsichtbare Component behandelt werden soll).
So wie du es beschrieben hast, zeigt dein JPanel mit den buttons und labeln nur die Daten für den aktuellen Monat. Das macht es zum einen schwierig zu programmieren, weil sich die Anzahl von Monat zu Monat ändert, und zum anderen finde ich es auch weniger übersichtlich als ein paar Tage vom vorangehenden und folgenden Monat mit anzuzeigen.
Du könnest z. B. ein GridLayout(7, 7) verwenden und die erste Reihe von Montag bis Sonntag grundsätzlich für den vorangehenden Monat verwenden. In der zweiten Reihe würde dann erstmals ein Tag aus dem aktuellen Monat auftauchen (in Spalte 1 bis 7, je nachdem auf welchen Wochentag der 1. des Monats fällt), dei Reihen 3, 4, 5 und ev. 6 würden die weiteren Tage des aktuellen Monats anzeigen, und ein Teil der 6. und die gesamte 7. Reihe die Tage des Folgemonats.
 

Asumanji

Mitglied
So wie du es beschrieben hast, zeigt dein JPanel mit den buttons und labeln nur die Daten für den aktuellen Monat. Das macht es zum einen schwierig zu programmieren, weil sich die Anzahl von Monat zu Monat ändert, und zum anderen finde ich es auch weniger übersichtlich als ein paar Tage vom vorangehenden und folgenden Monat mit anzuzeigen.

Ja, es wird nur der aktuelle Monat angezeigt.
Schwierig fand ich es nicht, die meisten Monate haben ja 31 Tage, also hab ich eine Variable "int mt = 31" deklariert. Dann hab ich den ausgewählten Monat geholt und per switch case gesagt welcher Monat 30 Tage und welcher 28 Tage hat. Für das Schaltjahr auch noch eine If-Anweisung geschrieben, die besagt nur Jahr % 4 == 0 und dann die Variable auf 29 gesetzt. Nun kann ich die Variable mt als Obergrenze für die Schleife nehmen. Funktioniert auch alles problemlos. Muss bloß die Variable mt in jedem Event wieder auf 31 setzen.

Ich glaube es wird schwieriger den letzten Monat mit einzubringen wie du es beschreibst, da der letzte Tag ja der 31., 30., 29. oder 28. sein kann und ich somit 2 Monate betrachten muss.
Beim Folgemonat wirds nicht so problematisch da jeder Monat mit dem 1. beginnt.
Vielleicht stell ich mir das auch grad komplizierter vor als es eigentlich ist.

Ich werd es mir auf jeden Fall mal ansehen und auch die Variante mit dem Visible = false ausprobieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Aufruf von mehreren Activities bringt die app zum Absturz Java Basics - Anfänger-Themen 5
B Absturz der VM bei Ausführung meines Programms Java Basics - Anfänger-Themen 3
T JNI Absturz - printf Java Basics - Anfänger-Themen 7
M Absturz bei Zugriff auf Objekt-Arrays Java Basics - Anfänger-Themen 4
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T sortierung der eingabe nach größe Java Basics - Anfänger-Themen 5
G Bei dynamischer Arrayliste nach jeder Auswahl Zahl entfernen Java Basics - Anfänger-Themen 3
ptcho Werte/Position nach dem Funktionsaufruf tauschen? Java Basics - Anfänger-Themen 1
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
W LocalDate toString und nach Split falsch "erkannt"? Java Basics - Anfänger-Themen 8
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
S Größte Zahl nach Eingabe der Zahl 0 ausgeben Java Basics - Anfänger-Themen 6
I Java Mail Timeout erst nach rund 5 Minuten? Java Basics - Anfänger-Themen 9
FireHorses Einen Command erst nach einer Chateingabe aktivieren Java Basics - Anfänger-Themen 1
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
Jambolo Karten sortieren nach Rang und Farbe Java Basics - Anfänger-Themen 5
Lion.King Subtraktion nach Eingabe im Terminal Java Basics - Anfänger-Themen 7
D Programmieren nach UML Java Basics - Anfänger-Themen 2
rosima26 Java nach letzter Ziffer sortieren Java Basics - Anfänger-Themen 19
H Kompliziertes Sortieren einer ArrayList mit Objekten(Sortieren nach X und Y) Java Basics - Anfänger-Themen 11
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
S Java Client-je nach Heap Size Größe startet Applikation oder nicht Java Basics - Anfänger-Themen 4
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
E Umlaute und Sonderzeichen werden nach der Build Project nicht richtig angezeigt Java Basics - Anfänger-Themen 2
M Bei nach oben scrollen soll Seite aktualisiert werden (Userscript mit Javascript) Java Basics - Anfänger-Themen 10
K log4j nach log4j2 überführen Java Basics - Anfänger-Themen 0
javapingu Jeglichen Inhalt einer Textdatei nach Zeile n löschen Java Basics - Anfänger-Themen 8
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
L Zahlungen nach Monat filtern Java Basics - Anfänger-Themen 2
J Jtable Eingabe nach Klick ausserhalb der Tabelle übernehmen Java Basics - Anfänger-Themen 6
I String nach Wort suchen Java Basics - Anfänger-Themen 6
C ArrayList sortieren nach bestimmten Buchstaben in den Wörtern Java Basics - Anfänger-Themen 13
javaluke Erste Schritte Array nach Datentyp sortieren Java Basics - Anfänger-Themen 16
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
idontknow707 Matrix nach z.B. Variable durchsuchen Java Basics - Anfänger-Themen 4
O 2D-Array nach einer Spalte sortieren Java Basics - Anfänger-Themen 22
I Liste gruppieren nach Monat? Java Basics - Anfänger-Themen 5
P Ein Objekt nach einem String durchsuchen? Java Basics - Anfänger-Themen 7
M Nach einer erstmaligen Eingabe, eine zweite Eingabe nur noch gegen bestätigung möglich Java Basics - Anfänger-Themen 2
D Input/Output fehlerhafter Algorithmus zum Ersetzen von Array-Werten nach logischem Schema Java Basics - Anfänger-Themen 1
C Meldung einer Klasse nach "oben" Java Basics - Anfänger-Themen 6
B Nach eingefügtem Code erkennt Compiler keine Instanzvar und meldet SyntaxError Java Basics - Anfänger-Themen 2
newcomerJava Nach doppelter Zahl eine Ausgabe Java Basics - Anfänger-Themen 10
M Anzahl Schleifendurchgänge nach x Sekunden anzeigen Java Basics - Anfänger-Themen 2
C Lotto 3, 4, 5, 6 Richtige nach x Ziehungen ermittelt.. Java Basics - Anfänger-Themen 7
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
F JMenuItem Kann nicht nach einem String benannt werden... Java Basics - Anfänger-Themen 11
R JDK installieren Durcheinander nach installation von SE 14.02 Java Basics - Anfänger-Themen 6
P Sortieren von Listen nach Attributen Java Basics - Anfänger-Themen 3
B DateTimeFormatter nach LocalDateTime, wenn dd.MM.yyyy oder dd.MM.yyyy mm:hh Java Basics - Anfänger-Themen 5
1 main-Methode erweitern, Nachfrage nach wiedeholung Java Basics - Anfänger-Themen 2
G unklares Verhalten nach Instanzierung neuer Klasse Java Basics - Anfänger-Themen 3
S Wohin kommt das „abstract“? Vor oder nach „public“/ „private“ /... Java Basics - Anfänger-Themen 3
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
N Operatoren Schreibtischtest der Reihen-Suche nach Aufschluss in die Basics Java Basics - Anfänger-Themen 1
B Umstieg von C# nach Java Java Basics - Anfänger-Themen 18
Ellachen55 Wie nach häufigste Werte im Array suchen? Java Basics - Anfänger-Themen 2
M Untersuchen ob ein Graph nach entfernen einer Kante immer noch zusammenhängend ist Java Basics - Anfänger-Themen 70
N Wörter und Zahlen nach speziellen Wörtern ausgeben Java Basics - Anfänger-Themen 11
M Werte ändern sich nicht mehr nach Reset Java Basics - Anfänger-Themen 14
B Nach dem kompilieren werden Bilder nicht mehr gefunden Java Basics - Anfänger-Themen 10
X Nach einem Bruch testen ob es eine ganze Zahl ist Java Basics - Anfänger-Themen 6
B String nach erstem Leerzeichen trennen Java Basics - Anfänger-Themen 7
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
CptK Best Practice Algorithmus nach jedem Schritt zum Visualisieren pausieren Java Basics - Anfänger-Themen 3
O zwei Arrays nach Werten durchsuchen und zusammenfügen Java Basics - Anfänger-Themen 3
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
C Erste Schritte Bilder nach Export anzeigen Java Basics - Anfänger-Themen 0
F Input/Output Files von A nach B kopieren Java Basics - Anfänger-Themen 11
B InputStream (PDF) nach Image (PNG / JPG) konvertieren? Java Basics - Anfänger-Themen 2
O ADT Graph nach größe Abfragen Java Basics - Anfänger-Themen 42
O compareTo nach mehreren Kriterien Java Basics - Anfänger-Themen 13
R Benutzereingaben als Array abspeichern nach Programmstart Java Basics - Anfänger-Themen 5
S Pane nach speziellen Child Objekten durchsuchen Java Basics - Anfänger-Themen 3
V Neue Ausgabe von toString nach Methodenaufruf Java Basics - Anfänger-Themen 9
L Arrayliste von hinten nach vorne ausgeben Java Basics - Anfänger-Themen 10
F Array nach Objektattribut durchsuchen Java Basics - Anfänger-Themen 6
M Rationale Zahl erkennen - Kurze Frage zum Restwert nach Division Java Basics - Anfänger-Themen 3
O String von vorne nach hinten an einem Zeichen Java Basics - Anfänger-Themen 10
Hanschyo Quicksort sortiert von groß nach klein Java Basics - Anfänger-Themen 3
S suche nach varible POSITION ... fuer das pixel-maennchen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben