Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException

C

Cresse

Gast
Guten Tag, ich bräuchte mal Hilfe, ich bekomme eine Fehlermeldung, kann aber die Ursache nicht finden. Hier erst mal die komplette Fehlermeldung:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException
at javax.swing.LayoutComparator.compare(Unknown Source)
at javax.swing.LayoutComparator.compare(Unknown Source)
at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at javax.swing.SortingFocusTraversalPolicy.enumerateAndSortCycle(Unknown Source)
at javax.swing.SortingFocusTraversalPolicy.getFocusTraversalCycle(Unknown Source)
at javax.swing.SortingFocusTraversalPolicy.getFirstComponent(Unknown Source)
at javax.swing.LayoutFocusTraversalPolicy.getFirstComponent(Unknown Source)
at javax.swing.SortingFocusTraversalPolicy.getDefaultComponent(Unknown Source)
at java.awt.FocusTraversalPolicy.getInitialComponent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.SequencedEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Da verstehe ich nur, dass der Fehler etwas mit den ActionListener zu tun hat, aber ich habe dort meines Wissens keinen aktiviert, und auch meine ActionPerformed Methode wird nicht aufgerufen.
Da keine Zeilen dabei sind vermute ich, dass es zum Fehler in dieses Zeilen kommt:

Java:
	private void constructOrderviewPanel() 
	{
		BorderdLabel tempLabel = new BorderdLabel("      " + text.getText(15));
		orderPanel.add( tempLabel , "cell 0 0 , width 430!");
		for( int i = 0 ; i< orders.size() ; i++)
		{
			MyJButton temp = new MyJButton("Name: " + orders.get(i).getName() + "  Price: " + orders.get(i).getSum() , i);
			temp.addActionListener(this);
			orderPanel.add(temp, "cell 0 " + i+1 + " , width 430!");
		}
		
	}
	
	private void updateOrderviewPanel() 
	{
		Component[] allComponents = orderPanel.getComponents();
		for(int i=0; i<allComponents.length; i++)
		{
			if(allComponents[i].getClass().equals(MyJButton.class))
			{
				((MyJButton)allComponents[i]).removeActionListener(this);
			}
		}
		orderPanel.removeAll();
		constructOrderviewPanel();
		
	}

Im Programmablauf wird erst der Konstruktor dieser Klasse aufgerufen und die constructOrderviewPanel() Methode, dann ändere ich die Order und rufe die updateOrderviewPanel() Methode auf. Dann kommt es zur Fehlermeldung. Der meiner Meinung nach wichtige Teil des Konstructors:
Java:
orderPanel = new JPanel();
		orderPanel.setLayout(new MigLayout("width 450!"));
		orderScroll = new JScrollPane();
		constructOrderviewPanel();
		super.add(orderPanel , "width 450! , height 780! , cell 0 0");
		orderScroll.getViewport().add(orderPanel);
		orderScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		orderScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		super.add(orderScroll, "cell 1 0 , height 780!");

Vielen dank schonmal für eure Hilfe
 

Flown

Administrator
Mitarbeiter
Passiert das auch wenn du diese Zeile auskommentierst?

Java:
((MyJButton)allComponents[i]).removeActionListener(this);
 
C

Cresse

Gast
Leider ja, dass einzige was ein bisschen hilft, ist wenn ich 2 systems outs einfüge:

Java:
private void constructOrderviewPanel() 
	{
		System.out.println("1");
		BorderdLabel tempLabel = new BorderdLabel("      " + text.getText(15));
		System.out.println("1");
		orderPanel.add( tempLabel , "cell 0 0 , width 430!");
		for( int i = 0 ; i< orders.size() ; i++)
		{
			MyJButton temp = new MyJButton("Name: " + orders.get(i).getName() + "  Price: " + orders.get(i).getSum() , i);
			temp.addActionListener(this);
			orderPanel.add(temp, "cell 0 " + i+1 + " , width 430!");
		}
		
	}

dann kommt der Fehler nur noch in ca 40% der Fälle, aber das macht für mich einfach keinen Sinn wie das helfen soll. War von mir eigentlich nur gedacht um rauszufinden wo der Fehler passiert.
 

Flown

Administrator
Mitarbeiter
Versuch mal im constructOrderviewPanel ein neues Panel anzulegen, das zu befüllen und dann dem aktuellen orderPanel zuzuweisen und danach
Java:
orderPanel.validate()
 
S

SlaterB

Gast
funktioniert die Anzeige mit dem Scrollen usw?

> orderScroll.getViewport().add(orderPanel);
stört mich, sowas sollte man nicht unüberlegt machen,

es gibt genaue Methoden im fraglichen (edit: fragil wollte ich schreiben) JScrollPane-Konstrukt, entweder den View im Konstruktor übergeben oder setViewPortView() benutzten,

> super.add(orderPanel , "width 450! , height 780! , cell 0 0");
ist auch sinnlos, wenn das orderPanel doch in das JScrollPane kommt


aber beides nicht unbedingt gute Gründe für die Exceptions, oder doch?

------

was du noch machen könntest:
deine Methoden zum Umbau der GUI in
Java:
SwingUtilities.invokeLater( new Runnable() {
  public void run() {
     // Code, Methodenaufrufe
  }
});
setzen, dann werden sie vom AWT-Thread ausgeführt
und laufen nicht gleichzeitig zu Hintergrund-GUI-Aktionen, denen du einfach die Basis abschneidest

dazu würde die Abmilderung durch Verzögerung, etwa durch Ausgabe, passen

edit: doch nicht, wird ja alles eh von einem Listener, also bereits vom AWT-Thread gemacht,
du benutzt keinen separaten Thread, oder?
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
Ich tippe darauf, dass Du Änderungen an den GUI-Komponenten außerhalb des Event Dispatch Threads machst.
[EDIT]Also in etwa das woran auch SlaterB denkt.[/EDIT]

Füg mal in [c]constructOrderviewPanel()[/c] ein:
Java:
System.out.println(Thread.currentThread().getName());
Was bekommst Du ausgegeben?

Ebenius
 
C

Cresse

Gast
Versuch mal im constructOrderviewPanel ein neues Panel anzulegen, das zu befüllen und dann dem aktuellen orderPanel zuzuweisen und danach
Java:
orderPanel.validate()

Dann bleibt es bei mir in der View nachher leer. Aber vielelicht mache ich auch was falsch
 

Flown

Administrator
Mitarbeiter
Ja es ist immer schwer zu raten, wenn man den ganzen Code nicht kennt, aber die anderen haben glaub ich schönere Lösungen parat.
 
C

Cresse

Gast
funktioniert die Anzeige mit dem Scrollen usw?

> orderScroll.getViewport().add(orderPanel);
stört mich, sowas sollte man nicht unüberlegt machen,

es gibt genaue Methoden im fraglichen JScrollPane-Konstrukt, entweder den View im Konstruktor übergeben oder setViewPortView() benutzten,

> super.add(orderPanel , "width 450! , height 780! , cell 0 0");
ist auch sinnlos, wenn das orderPanel doch in das JScrollPane kommt


aber beides nicht unbedingt gute Gründe für die Exceptions, oder doch?

Habe ich bis jetzt immer so gemacht, auch in anderen Projekten und das hat so geklappt, also man konnte scrollen und so, fügt man das nur zum JScrollPane hinzu und dann reicht es die ScrollPane hinzuzufügen, dann sieht man bei mir das orderviewPanel nicht mehr


funktioniert die Anzeige mit dem Scrollen usw?



was du noch machen könntest:
deine Methoden zum Umbau der GUI in
Java:
SwingUtilities.invokeLater( new Runnable() {
  public void run() {
     // Code, Methodenaufrufe
  }
});
setzen, dann werden sie vom AWT-Thread ausgeführt
und laufen nicht gleichzeitig zu Hintergrund-GUI-Aktionen, denen du einfach die Basis abschneidest

dazu würde die Abmilderung durch Verzögerung, etwa durch Ausgabe, passen

edit: doch nicht, wird ja alles eh von einem Listener, also bereits vom AWT-Thread gemacht,
du benutzt keinen separaten Thread, oder?

benutze noch keinen seperaten Thread und wollte das für dieses projekt auch nicht machen, aber den aufruf zur aktualisierung mache ich noch aus der main methode, zum testen habe ich da eine manulle änderung gemacht, und dann sage ich er soll aktualisierren
 
C

Cresse

Gast
Ich tippe darauf, dass Du Änderungen an den GUI-Komponenten außerhalb des Event Dispatch Threads machst.
[EDIT]Also in etwa das woran auch SlaterB denkt.[/EDIT]

Füg mal in [c]constructOrderviewPanel()[/c] ein:
Java:
System.out.println(Thread.currentThread().getName());
Was bekommst Du ausgegeben?

Ebenius

Die Ausgabe ist beidesmal main.
 
C

Cresse

Gast
kannst du mal den ganzen Code posten oder hochladen, damit er ausführbar ist?

kann ich sind aber ca 20 Klassen ,wenn auch teilweise nur kleine, weis nciht wie übersichtlich das dann noch ist, aber ich kann meine main methode und die klasse mit dem fehler posten:

Java:
package starting;

import java.util.ArrayList;

import product.*;
import language.TextNames;
import gui.PizzaFrame;
import gui.Restaurant;

public class Testing {

	private static TextNames text = new TextNames();

	public static void main(String[] args) 
	{
		// Restaurent Test mit Order
		Restaurant test;
		Pizza te = new Pizza(text);
		te.setName("SalamiPizza");
		te.setPrice(3.5f);
		te.setSize(15);
		Topping temp = new Topping();
		temp.setPrice(0.5f);
		temp.setName("Schinken");
		te.add(temp);
		Topping temp1 = new Topping();
		temp1.setPrice(0.5f);
		temp1.setName("Schinken3");
		te.add(temp1);
		Topping temp2 = new Topping();
		temp2.setPrice(0.5f);
		temp2.setName("Schinken2");
		te.add(temp2);
		Order t = new Order ();
		t.add(te);
		t.add(te);
		t.add(te);
		t.add(te);
		t.add(te);
		t.add(te);
		t.setName("asas");
		ArrayList<Order> q = new ArrayList<Order>();
		q.add(t);
		q.add(t);
		q.add(t);
		q.add(t);
		q.add(t);
		test = new Restaurant(text, q);
		

		Restaurant testq;
		Pizza teq = new Pizza(text);
		teq.setName("SalamiPizzqqqqqqqqqqqa");
		teq.setPrice(45.5f);
		teq.setSize(15);
		Topping tempq = new Topping();
		tempq.setPrice(4.5f);
		tempq.setName("Schinkenqqqqqqqqqqqqq");
		teq.add(tempq);
		Topping temp1q = new Topping();
		temp1q.setPrice(4.5f);
		temp1q.setName("Schinkenqqqqqqqqqqqqqq3");
		te.add(temp1q);
		Topping temp2q = new Topping();
		temp2q.setPrice(4.5f);
		temp2q.setName("Schinken2qqqqqqqqqqqqqq");
		teq.add(temp2q);
		Order tq = new Order ();
		tq.add(teq);
		tq.add(teq);
		tq.add(teq);
		tq.add(teq);
		tq.add(teq);
		tq.add(teq);
		tq.setName("asasqqqqqqqqqqqqqqqqqqqqq");

		
		q.add(tq);
		q.add(tq);
		q.add(tq);
		q.add(tq);
		q.add(tq);
		
		test.testUpdate();
	}

}

Java:
package gui;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import net.miginfocom.swing.MigLayout;

import product.Order;

import language.TextNames;

public class Restaurant extends PizzaFrame implements Observer, ActionListener {

	private TextNames text;
	private JPanel orderPanel, pizzasPanel, toppingsPanel;
	private JScrollPane orderScroll, pizzasScroll, toppingsScroll;
	private ArrayList<Order> orders = new ArrayList<Order>();

	
	public Restaurant ( TextNames text , ArrayList<Order> orders)
	{
		super(text , 1);
		this.orders = orders;
		this.text = text;
		construct();
		 
	}
	
	
	public Restaurant(TextNames text) 
	{
		super(text, 1);
		this.text = text;
		construct();
	}
	
	private void construct()
	{

		
		orderPanel = new JPanel();
		orderPanel.setLayout(new MigLayout("width 450!"));
		orderScroll = new JScrollPane();
		constructOrderviewPanel();
		super.add(orderPanel , "width 450! , height 780! , cell 0 0");
		orderScroll.getViewport().add(orderPanel);
		orderScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		orderScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		super.add(orderScroll, "cell 1 0 , height 780!");
		
		pizzasPanel = new JPanel();
		pizzasPanel.setLayout(new MigLayout("width 200!"));
		pizzasScroll = new JScrollPane();
		constructPizzasPanel();
		super.add(pizzasPanel, "width 200! , height 780! , cell 2 0");
		pizzasScroll.getViewport().add(pizzasPanel);
		pizzasScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		pizzasScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		super.add(pizzasScroll, "cell 3 0 , height 780!");
		
		toppingsPanel = new JPanel();
		toppingsPanel.setLayout(new MigLayout("width 200!"));
		toppingsScroll = new JScrollPane();
		constructToppingsPanel();
		super.add(toppingsPanel, "width 200! , height 780! , cell 4 0");
		toppingsScroll.getViewport().add(toppingsPanel);
		toppingsScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		toppingsScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		super.add(toppingsScroll, "cell 5 0 , height 780!");
		
		
		super.setSize(900, 900);
		super.setVisible(true);
		
		
		
	}
	
	private void constructOrderviewPanel() 
	{
		System.out.println(Thread.currentThread().getName());
		System.out.println("1");
		BorderdLabel tempLabel = new BorderdLabel("      " + text.getText(15));
		System.out.println("1");
		orderPanel.add( tempLabel , "cell 0 0 , width 430!");
		for( int i = 0 ; i< orders.size() ; i++)
		{
			MyJButton temp = new MyJButton("Name: " + orders.get(i).getName() + "  Price: " + orders.get(i).getSum() , i);
			temp.addActionListener(this);
			orderPanel.add(temp, "cell 0 " + i+1 + " , width 430!");
		}
		
	}
	
	private void updateOrderviewPanel() 
	{
		Component[] allComponents = orderPanel.getComponents();
		for(int i=0; i<allComponents.length; i++)
		{
			if(allComponents[i].getClass().equals(MyJButton.class))
			{
				((MyJButton)allComponents[i]).removeActionListener(this);
			}
		}
		orderPanel.removeAll();
		constructOrderviewPanel();
		
	}
	
	

	public void testUpdate()
	{
		updateOrderviewPanel();
	}


	private void constructPizzasPanel() 
	{
		
	}
	private void updatePizzasPanel() 
	{
		// TODO Auto-generated method stub
		
	}

	
	private void constructToppingsPanel() 
	{
		
	}
	private void updateToppingsPanel() 
	{
		// TODO Auto-generated method stub
		
	}

	@Override
	public void actionPerformed(ActionEvent arg0) 
	{
		if(arg0.getSource().getClass().equals(MyJButton.class))
		{
			new ViewOrder(orders.get(((MyJButton)arg0.getSource()).getNummber()));
		}
		else
		{
			super.actionPerformed(arg0);
		}
		
	}

	@Override
	public void update(Observable arg0, Object arg1) {
		// TODO Auto-generated method stub
		
	}

}
 
S

SlaterB

Gast
die main ist ein separater Thread, also da besteht ein gewisses Problem,

die gepostete main ist aber ziemlich unübersichtlich, mehrere Restaurant-Variablen..,
ein sleep() oder sonstigen zeitlichen Ablauf scheint es nicht zu geben, wozu das update()?

stelle doch erst alle Daten zusammen, übergebe sie an die GUI, und dann erst das setVisible(true)

> Versteh leider nicht ganz, wie ich das einbauen und nacher aufrufen soll

z.B. da wo aktuell
> updateOrderviewPanel();
steht meinen Code hinkopieren und den Aufruf updateOrderviewPanel(); hinein,
aber wie gesagt eher fraglich warum das überhaupt ausgeführt wird
 
C

Cresse

Gast
Habe das gemacht, um die update methode zu überprüfen, ob die klappt, deswegen erstelle ich erst eine order mir paar pizzen und rufe damit meine gui auf. Nachher im programm soll die sich dann verändert haben und ich wollte wissen, ob die update methode dies dann richtig verarbeiten kann, also ob die so klappt wie sie da steht
 

Michael...

Top Contributor
Bei welcher (Anwender)aktion tritt denn der Fehler auf?
Ich würde mir mal grundsätzlich mal überlegen, ob das ganze Hinzufügen und wieder Entfernen von Komponenten wirklich notwendig ist. Sowas ist er unüblich und in den meisten Fällen überflüssig und deutet auf einen Fehler im Konzept hin.

Nur als Hinweis: Sowas wie
Code:
if(allComponents[i].getClass().equals(MyJButton.class))
macht man üblicherweise mit
Java:
if(allComponents[i] instanceof MyJButton)
 
C

Cresse

Gast
Das soll später eine Anwendung sein, die orders bekommt, von anderen PCs, also den usern (für pizzen) und wo man bereits zugestellte wieder löscht und jederzeit neue hinzukommen können
 
S

SlaterB

Gast
also es ist in jedem Fall ein Problem mit main, invokeLater() ist eine offiziele Lösung,
später von Buttons aus sollte es keine solchen Probleme geben, solange nicht wieder separate Threads, dann invokeLater()..
 
C

Cresse

Gast
Habe das jetzt ausprobiert, damit kommt die fehlermeldung aber trotzdem noch manchmal, der ausgegebene thread ist jetzt jedes mal AWT-...

Java:
private void constructOrderviewPanel() 
	{
		SwingUtilities.invokeLater( new Runnable() {
			  public void run() {
				  System.out.println(Thread.currentThread().getName());
					System.out.println("1");
					BorderdLabel tempLabel = new BorderdLabel("      " + text.getText(15));
					System.out.println("1");
					orderPanel.add( tempLabel , "cell 0 0 , width 430!");
				
			  }
			});
		
		for( int i = 0 ; i< orders.size() ; i++)
		{
			MyJButton temp = new MyJButton("Name: " + orders.get(i).getName() + "  Price: " + orders.get(i).getSum() , i);
			temp.addActionListener(this);
			orderPanel.add(temp, "cell 0 " + i+1 + " , width 430!");
		}
 
C

Cresse

Gast
also es ist in jedem Fall ein Problem mit main, invokeLater() ist eine offiziele Lösung,
später von Buttons aus sollte es keine solchen Probleme geben, solange nicht wieder separate Threads, dann invokeLater()..

Was genau heisst das invoke Later eingetlich? das gibt an welcher thread das bearbeiten soll? Wann wird das dann bearbeitet?
 
S

SlaterB

Gast
nun, wenn das Land überspült wird und jemand sagt bau einen Damm,
und du an der halbe Küste einen Damm baust und den Rest wie vorher beläßt,
dann kaufe dir lieber trotzdem noch Gummistiefel,

wie zuvor doch angesprochen einfach die ganze Methode bzw. die eine Zeile des Aufrufs
> updateOrderviewPanel();
hinein, was soll dieses Teil-Gewurschtel?

> Was genau heisst das invoke Later eingetlich? das gibt an welcher thread das bearbeiten soll? Wann wird das dann bearbeitet?

du hast den Suchbegriff und das Internet vor dir ;)
 
C

Cresse

Gast
Bei welcher (Anwender)aktion tritt denn der Fehler auf?
Ich würde mir mal grundsätzlich mal überlegen, ob das ganze Hinzufügen und wieder Entfernen von Komponenten wirklich notwendig ist. Sowas ist er unüblich und in den meisten Fällen überflüssig und deutet auf einen Fehler im Konzept hin.

Daher sollte ich mir eine ArrayListe anlegen wo ich alle Componenten seperat speichere, damit ich sagen kann welche gelöscht werden soll und welche nicht?

Wie kann ich dann im MigLayout sagen, das alle elemten unter einem gewissen element eine zeile nach oben geschoben werden sollen, so dass dort keine lücke mehr ist?
 
S

SlaterB

Gast
ich kann speziell hierbei nicht ganz folgen, falls du nicht gerade temp vor dem invokeLater() deklarierst und
> temp.addActionListener(this);
dann darin,
aber allgemein ist die Welt kein Ponyhof, Probleme sind da und müssen gelöst werden,
deswegen auf invokeLater() zu verzichten habe ich kaum als Lösung zugelassen ( :D )

falls hier im Forum, dann bitte mehr Code und weitere Informationen, was immer du hast, etwa die Fehlermeldung
 

Flown

Administrator
Mitarbeiter
Funktioniert bei mir einwandfrei:

Java:
	private void updateOrderviewPanel() 
	{
		final Component[] allComponents = orderPanel.getComponents();
		for(int i=0; i<allComponents.length; i++)
		{
			if(allComponents[i] instanceof MyJButton)
			{
				final MyJButton temp = (MyJButton) allComponents[i];
				SwingUtilities.invokeLater(new Runnable() {
					
					@Override
					public void run() {
						// TODO Auto-generated method stub
						temp.removeActionListener(Restaurant.this);
						
					}
				});
			}
		}
		orderPanel.removeAll();
		constructOrderviewPanel();
		
	}
 
S

SlaterB

Gast
doch nicht solche Vorschläge machen ;)
die ganze Aktion updateOrderviewPanel() in ein invokeLater() und gut ist
 
C

Cresse

Gast
Jetzt habe ich das invoke later glaube ich an der richtigen Stell, die Fehlermeldung ist weg:

Java:
	public void testUpdate()
	{
		 SwingUtilities.invokeLater( new Runnable() {
             public void run() {updateOrderviewPanel();}});
		//updateOrderviewPanel();
	}

Jetzt macht er aber das update nicht mehr, ich habe das Gefühl, das er das erste mal das construct macht, und dann zum invokeLater kommt und dann einfriert, weil danach klappen dann die actionlistener auf der Oberfläche nicht mehr und die neuen Elemente kommen nicht hinzu
 
C

Cresse

Gast
Vielen dank euch allen für eure Hilfe, vielleicht mache ich auch etwas grundsätzlich falsch, ich werde versuchen das Problem zu umgehen, in dem ich alles einmal erzeuge und nachher einfach nur noch die Änderungen durchführe, dass ist dann wahrscheinlich sehr viel leistungsschonender und kommt dann hoffentlich auch ohne diesen Fehler aus. Wenn ich es soweit habe, das es läuft werde ich den funktionierenden code hier nochmal posten, oder wenn es nicht klappt noch ein paar Fragen stellen.

Hatte mir überlegt, dass ich meine Klasse order so erweitere, das sie ein action event auslöst, wenn sie geändert wird. Die entsprechende action führe ich dann auch in der gui durch. Damit sollte dieses Problem dann behoben sein, oder?
 
S

SlaterB

Gast
> weil danach klappen dann die actionlistener auf der Oberfläche nicht mehr und die neuen Elemente kommen nicht hinzu

es wäre ein genereller Fehler, von Nichtfunktionalität B nach Korrektur A auf Verzicht von A zu schließen,
passe da auf,

je mehr Fehler man korrigiert, desto mehr andere bisher nicht drankommende oder in bestimmten Situationen nicht relevante kommen ans Tageslicht

-----

nach jeder nachträglichen GUI-Änderung, wobei sowas besser überhaupt nicht zu empfehlen ist, gehört z.B.
validate();
repaint();
am JFrame-Objekt aufgerufen,
schreibe das ans Ende z.B. von constructOrderviewPanel()

dann werden die neuen Komponenten angezeigt, im Moment noch die alten, die keine Listener mehr haben (spekuliert)

-----

> ich werde versuchen das Problem zu umgehen, in dem ich alles einmal erzeuge und nachher einfach nur noch die Änderungen durchführe, dass ist dann wahrscheinlich sehr viel leistungsschonender und kommt dann hoffentlich auch ohne diesen Fehler aus

absolut, aber neue andere Probleme sind wohl auch nicht ganz zu vermeiden
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
Eine Standard-Anwendung die AWT/Swing spielt baut sich am besten so auf:

Java:
/** Creates the GUI. Call on EDT, only! */
@SuppressWarnings("nls")
static void createAndShowGui() {
  // Hier die ganze GUI initialisieren
}

/** @param args ignored */
public static void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable() {

    public void run() {
      createAndShowGui();
    }
  });
}

Ebenius
 
C

Cresse

Gast
nach jeder nachträglichen GUI-Änderung, wobei sowas besser überhaupt nicht zu empfehlen ist, gehört z.B.
validate();
repaint();
am JFrame-Objekt aufgerufen,
schreibe das ans Ende z.B. von constructOrderviewPanel()

dann werden die neuen Komponenten angezeigt, im Moment noch die alten, die keine Listener mehr haben (spekuliert)


Super, so klappt es ohne Probleme, vielen Dank für die Hilfe. Würde es trotzdem Sinn machen, das nochmal neu zu schreiben, ohne immer das ganze Panel neu aufzubauen?



Noch eine Frage zu validate und repaint: Wenn ich mehrere JPanel ineinander stecke, muss ich dann bei allen jeweils validate und repaint aufrufen oder generell nur beim JFrame in dem die Panel sind?
 
S

SlaterB

Gast
> Wenn ich mehrere JPanel ineinander stecke, muss ich dann bei allen jeweils validate und repaint aufrufen oder generell nur beim JFrame in dem die Panel sind?

ich bin notorisch schlecht im Merken offizieller Lösungen, falls es sie überhaupt gibt (eben vergessen oder nie gelesen)
und probiere eher alles aus, tendiere zu letzterem da bisher ausreichend

> Also am besten jede Änderung die man an der GUI vornimmt immer vom AWT Thread ausführen lassen?

genau, aber nicht gerade alle einzeln

> wenn neue elemente hinzukommen und alte gelöscht werden muss man doch den neuen stand wieder anzeigen, oder?

es geht ja wenn nötig, nur in der Regel unnötig,
und Dinge wie CardLayout gibts auch noch

Komponenten sind schwerfällig, während der Fahrt wechselt man auch nicht unbedingt ein Rad am Auto,
sondern sorgt von Anfang an dafür dass möglichst alle Fälle abgedeckt sind
 
Zuletzt bearbeitet von einem Moderator:
C

Cresse

Gast
Vielen Dank allen die mir bei der Lösung dieses Problems geholfen haben, habe viel gelernt und muss jetzt erst mal noch ein paar Sachen nachlesen und verstehen (und natürlich probieren).

SlaterB, nochmal vielen Dank, besonders für die coolen vergleiche.
 

Flown

Administrator
Mitarbeiter
doch nicht solche Vorschläge machen ;)
die ganze Aktion updateOrderviewPanel() in ein invokeLater() und gut ist

Stimmt :oops:

Also du benötigst das validate nur weil du removeAll verwendest:

Auszug aus der API

public void removeAll()

Removes all the components from this container. This method also notifies the layout manager to remove the components from this container's layout via the removeLayoutComponent method.

This method changes layout-related information, and therefore, invalidates the component hierarchy. If the container has already been displayed, the hierarchy must be validated thereafter in order to reflect the changes.
 
S

SlaterB

Gast
> Also du benötigst das validate nur weil du removeAll verwendest:

steht bei add() auch ;)

Note: If a component has been added to a container that has been displayed, validate must be called on that container to display the new component. If multiple components are being added, you can improve efficiency by calling validate only once, after all the components have been added.
 

bERt0r

Top Contributor
Stell dir mal vor, du wärst verantwortlich für eine analoge Anzeigetafel bei einem Fussballspiel (mit Kreide). Das heißt, wenn ein Tor fällt, bekommst du ein "Toooor" Event und jetzt musst du den Anzeigestand "updaten". Wenn du so vorgehst wie in deiner "updateOrderviewPanel" Methode, schnappst du dir jedes mal die Tafel, wirfst sie in dem Müll und holst dann eine neue Tafel raus die du dann mit dem aktuellen Spielstand beschreibst. Das ist doch äußerst umständlich. Noch schlimmer, wenn im Spiel ein Tor fällt während du deine Tafel holst kriegst du es nicht mit, weil es nicht auf dich wartet - es läuft "in einem anderen Thread".

Wenn du deinen Buttons einfach mit setText neue Bezeichnungen gegeben hättest wäre es zwar auch schön gewesen das im Event Dispatch Thread zu machen, deinen Fehler hättest du aber sicher nicht bekommen. Warum du den Buttons den Actionlistener wegnimmst, wenn du sie danach eh löscht, versteh ich auch nicht.
 
C

Cresse

Gast
Ich wollte vermeiden, das da jede Menge Actionlistener irgendwo noch dran sind, eigentlich um Fehler zu vermeiden, funktioniert das genausogut, wenn ich einfach ein remove all verwende?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
Lony AbstractTableModel Exception in thread "AWT-EventQueue- AWT, Swing, JavaFX & SWT 3
A Exception in thread "AWT-EventQueue-0" java.lang.N AWT, Swing, JavaFX & SWT 4
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
M Exception Meldung aus Thread an jTextField1 übergeben AWT, Swing, JavaFX & SWT 6
H Exception: java.lang.ClassCastException AWT, Swing, JavaFX & SWT 2
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
W Nullpointer Exception beim übertragen von Daten von Scene zu Scene AWT, Swing, JavaFX & SWT 6
beli3ver JavaFX Anwendung startet nicht, kann den Fehler nicht finden (Exception in Application start method) AWT, Swing, JavaFX & SWT 1
Z JavaFX Exception in Application start method AWT, Swing, JavaFX & SWT 2
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
R AWT no such child Exception AWT, Swing, JavaFX & SWT 7
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
W JavaFX Warum kriege ich eine Exception? AWT, Swing, JavaFX & SWT 23
L JavaFX JavaFX stürtzt durch einen Server#connect Exception AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
L Java FX Exception beim start AWT, Swing, JavaFX & SWT 2
J ObservableList wirft exception beim zweiten füllen. AWT, Swing, JavaFX & SWT 4
S java.fxml.load.exception und keine automatische Aktualliseriung der Mainausgabe AWT, Swing, JavaFX & SWT 5
VfL_Freak AWT Exception in der Eventqueue AWT, Swing, JavaFX & SWT 8
A Swing Null Pointer Exception obwohl Objekt initialisiert AWT, Swing, JavaFX & SWT 21
H JavaFX Ein View vorschalten Exception AWT, Swing, JavaFX & SWT 7
S NullPointer Exception beim Laden von Bildern AWT, Swing, JavaFX & SWT 11
Q "AWT-EventQueue-0" Exception Problem AWT, Swing, JavaFX & SWT 4
M 3D-Grafik Mac Java 3D in Eclipse Exception AWT, Swing, JavaFX & SWT 0
I Opencv Imgproc.floodfill exception AWT, Swing, JavaFX & SWT 1
T Gui Exception AWT, Swing, JavaFX & SWT 2
X Auf Fensterklasse zugreifen (Nullpointer Exception) AWT, Swing, JavaFX & SWT 2
M Threads - nicht erklärbare Exception AWT, Swing, JavaFX & SWT 6
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
J Einträge aus Table löschen ohne Exception AWT, Swing, JavaFX & SWT 6
V Swing Nullpointer Exception bei JFormattedTextField AWT, Swing, JavaFX & SWT 4
N Swing Exception: Comparison method violates its general contract! AWT, Swing, JavaFX & SWT 13
S Exception bei BufferStrategy AWT, Swing, JavaFX & SWT 8
H Swing Exception's und MVC AWT, Swing, JavaFX & SWT 35
R Swing Mit Swing eine throws Exception Methode öffnen AWT, Swing, JavaFX & SWT 3
K AWT DataBuffer in DataBufferInt Exception AWT, Swing, JavaFX & SWT 2
S Swing AWT-Exception bei JTable mit JComboBox beim Löschen der letzten Zeile AWT, Swing, JavaFX & SWT 3
O Immer Exception in AWT-EventQueue-0 AWT, Swing, JavaFX & SWT 5
F Swing Seltsame Exception AWT, Swing, JavaFX & SWT 5
R Swing Files auflisten (JButton, JList, Exception) AWT, Swing, JavaFX & SWT 4
V LookAndFeel Nullpoint Exception AWT, Swing, JavaFX & SWT 2
Airwolf89 Swing Exception beim Füllen einer Tabelle AWT, Swing, JavaFX & SWT 10
hdi SWT Zwei mal Shell öffnen = Exception AWT, Swing, JavaFX & SWT 6
O Probleme beim Zeichnen und AWT-Event-Queue-0 Exception AWT, Swing, JavaFX & SWT 5
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Bild zeichnen lassen aus array, null pointer Exception AWT, Swing, JavaFX & SWT 2
B JTable ValueChanged verursacht Exception AWT, Swing, JavaFX & SWT 3
Daniel_L JTable, (Auto-)RowSorter und NullPointer-Exception AWT, Swing, JavaFX & SWT 6
M Exception in eine JTextArea anzeigen AWT, Swing, JavaFX & SWT 7
T Exception: Adding a window to a container AWT, Swing, JavaFX & SWT 14
G Kann mir jemand diese Exception erklaeren? AWT, Swing, JavaFX & SWT 8
T AWT Exception AWT, Swing, JavaFX & SWT 5
A Exception beim LineWrapping AWT, Swing, JavaFX & SWT 16
P Für mich unverständliche Exception AWT, Swing, JavaFX & SWT 3
N JList - Nullpointer Exception AWT, Swing, JavaFX & SWT 4
T Warum schmeißt das eine Exception? AWT, Swing, JavaFX & SWT 6
I EventDispatchThread Exception AWT, Swing, JavaFX & SWT 5
M Problem: "ArrayIndexOutOfBounds Exception" AWT, Swing, JavaFX & SWT 11
C Out of Bounds Exception, Array of JTextField AWT, Swing, JavaFX & SWT 6
B JTable Vector Exception bei eigenem CellEditor AWT, Swing, JavaFX & SWT 3
D Seltsame AWT-Exception AWT, Swing, JavaFX & SWT 2
M Button und Exception mit NetBeans AWT, Swing, JavaFX & SWT 3
P paint null pointer exception AWT, Swing, JavaFX & SWT 3
A Null pointer exception beim Neuzeichnen AWT, Swing, JavaFX & SWT 4
R DataVector bei TableModel - Class Cast Exception AWT, Swing, JavaFX & SWT 9
G Drag & Drop bzw. Data Transfer - Exception nach Drag AWT, Swing, JavaFX & SWT 1
K Exception mit "Unknown Source" AWT, Swing, JavaFX & SWT 5
Z jar-File mit SWT - Exception AWT, Swing, JavaFX & SWT 4
F Habe Problem mit dem Abfangen einer Exception AWT, Swing, JavaFX & SWT 10
V Null Pointer Exception bei JTextField setText AWT, Swing, JavaFX & SWT 25
T Programm funkt. nicht - Exception AWT, Swing, JavaFX & SWT 7
G Exception in JList oder JTextArea AWT, Swing, JavaFX & SWT 9
M java headless exception AWT, Swing, JavaFX & SWT 5
O Exception abfangen AWT, Swing, JavaFX & SWT 19
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
C Thread verwalten AWT, Swing, JavaFX & SWT 2
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben