Java Netbeans AWT-EventQueue-0, isInterrupted

Hallo.

Ich habe ein Problem mit Netbeans.
Ich habe ein Button der soll wenn man drauf klick eine andere Klasse(KeyConfig) öffnen und ein Spiel Starten.
Wenn ich die Klasse KeyConfig ausführe läuft das Spiel einwandfrei. Ich will ein Startbild machen.

Also wenn ich auf den Button klicke stürzt das Programm ab und ich bekomme folgende Fehlermeldung:

Exception in thread „AWT-EventQueue-0“ java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
at java.awt.EventQueue.invokeAndWait(EventQueue.java:1223)
at graphics.ScreenManager.setFullScreen(ScreenManager.java:124)
at test.GameCore.init(GameCore.java:112)
at tilegame.GameManager.init(GameManager.java:47)
at Menu.Menu.init(Menu.java:23)
at Menu.KeyConfig.init(KeyConfig.java:43)
at test.GameCore.run(GameCore.java:71)
at Menu.StartBild$1$1.run(StartBild.java:53)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Ich weiß das irgendwas mit dem isInterrupted() sein muss da ich mit debugg schon das Programm einzelnt durchgegangen bin und bei der Abfrage: if(isInterrupted() || !pumpOneEventForFilters(id))
ist isInterrupted unbekannt und !pumpOneEventForFilters(id) true

Ich habe keine ahnung was ich machen soll ich habe auch schon eine Interrupted Abfrage eingebaut.

System.out.println("IsInterrupted1: " + Thread.currentThread().isInterrupted()); // IsInterrupted: false
Thread.currentThread().interrupt(); // Setze Interrupted-Flag
System.out.println("IsInterrupted: " + Thread.currentThread().isInterrupted()); // IsInterrupted: true
System.out.println("Interrupted1: " + Thread.currentThread().interrupted()); // IsInterrupted: true
System.out.println("Interrupted: " + Thread.currentThread().interrupted()); // Interrupted: false
try {
Thread.sleep(500); // Verursacht Exception
System.out.println(„Hello World“); // Das sehen wir nicht
}
catch (InterruptedException ex) {
System.out.println(ex.getMessage());
// sleep interrupted
System.out.println("I-Flag: " + Thread.currentThread().isInterrupted()); // I-Flag: false
}
new KeyConfig().run();

Was muss ich tun damit der Interruped true ist oder das ich die KeyConfig Klasse ausführen kann??

Hallo,

grundsätzlich scheinst du kein Problem mit „netbeans“, sondern mit Thread-Mangement zu haben.
Imho kann man nicht auf den EDT (=das ist der Thread, der für das zeichnen der GUI und das Eventhanding zuständig ist, EventDispatcherThread) ein sleep(long l) aufrufen.
Eigentlich musst du nur für deinen KeyConfig einen Extra-Tread starten UND einen Thread startet man, indem man die run()-Methode aufruft, aber die ruft man nicht mit new KeyConfig().run(); sondern mit new KeyConfig().start(); auf.

Für weitere Hilfe gerne den Quellcode posten.

Hallo,

Fehlerzitat:

Cannot call invokeAndWait from the event dispatcher thread

Hm, probier mal mit invokelater statt invokeandwait.
Kann jetzt auf die Schnelle aber keine Garantie dafür bieten.

Ansonsten noch mal in die Threadgeschichten einlesen.
Torsten

Was muss ich tun damit der Interruped true ist oder das ich
die KeyConfig Klasse ausführen kann??

Hallo!

Damit bin ich leider überfragt.

Grüße

Wenn du abfragst if(isInterrupted()) gehe ich davon aus, dass dein interruptfähiges Objekt vom Himmel fällt oder wen fragst du damit ab?

Poste bitte deinen Code, ich kann so nicht erkennen, wo der Haken ist.

Hallo Jackii,

Was muss ich tun damit der Interruped true ist oder das ich
die KeyConfig Klasse ausführen kann??

Die frage ist so nicht gerade einfach zu beantworten. Wenn du deinen Quelltext vollständig postest, könnte ich dir wahrscheinlich eher helfen. Zunächst mal könntest du prüfen, ob du alles so gemacht hast, wie in der Javainsel beschrieben: http://openbook.galileodesign.de/javainsel5/javainse…

Ansonsten schaue ich mir gerne nochmal den Quelltext an.

Viele Grüße

tincian

Hallo Jackii892,

wie bindest Du denn das Starten des Spiels – `new KeyConfig().run();’, wenn ich Dich richtig verstehe – an das Button-Klick-event? Der Stacktrace zufolge müßte das in GameCore.java, Zeile 112 sein.

Und was machst Du genau im Konstruktor von KeyConfig, bzw. in der run() Methode? Da scheint ja etwas zu passieren, was nicht im EDT (das ist der Thread, der sich automatisch um die GUI Events kümmert) laufen darf.

Mit der Abfrage currentThread().isInterrupted() ob der Thread unterbrochen wurde wirst Du vermutlich nicht weit kommen, weil die Unterbrechung erst mit der EDT-Verletzung auftritt.

Weitere Ferndiagnose ohne genauere Details fällt mir leider schwer…

Schöne Grüße,

Manfred

Hallo Jackii.

Swing und Threads sind so 'ne Sache. Versuch mal, ob dir folgender Blog-Eintrag weiter hilft: http://tech.chitgoks.com/2009/12/08/cannot-call-invo…

Thomas

Und? Schon was gefunden?
Noch ein kleiner Tipp: Falls du Swing verwendest, solltest du wissen das Swing nicht threadsicher ist.
Also zugreifen auf Swingkompónenten von unterschiedlichen Threads kann durchaus heitere Nebenwirkungen haben.

Und allgemein zur Fehlersuche.
Versuche das Programm kleiner und kleiner zu machen (z.B. durch auskommentieren). Irgendwann wird der Fehler verschwinden oder anders auftreten.
Wenn das nicht hilft, versuchen ein kleines „Ersatzprogramm“, in dem der Fehler auftritt, zu coden.
Dann kann man vielleicht da nachvollziehen wo es hakt.

Die Fehlermeldung ist ja schon nett. Aber mit den Codeschnipseln von dir kann ich nicht wirklich hilfreich sein.
Also ein kleines compilierbares Beispiel, in welchem der Fehler auftritt…

Torsten

Hi.
Dies ist mein Quellcode vom StartBild:

package Menu;

import graphics.HighScore;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

/**
*
* @author Jacqueline
* @date 30.01.2012
* Problem:
* -KeyConfig Klasse wird nicht richtig ausgefuehrt
*
*/
public class StartBild {

public static void main(String[] args) {
//ImagePanel panel = new ImagePanel(new ImageIcon(PfadUndDateiname).getImage());
ImagePanel panel = new ImagePanel(new ImageIcon(„images/hinter.jpg“).getImage());
final JFrame frame = new JFrame();
JButton startBut = new JButton(„Starte Javio“);
JButton highBut = new JButton(„Highscoreliste“);
JButton endeBut = new JButton(„Javio beenden“);

//alle ActinListener
startBut.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
// new KeyConfig().run();
// System.out.println(„Start Javio“);

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// System.out.println("IsInterrupted1: " + Thread.currentThread().isInterrupted()); // IsInterrupted: false
// Thread.currentThread().interrupt(); // Setze Interrupted-Flag
// System.out.println("IsInterrupted: " + Thread.currentThread().isInterrupted()); // IsInterrupted: true
// System.out.println("Interrupted1: " + Thread.currentThread().interrupted()); // IsInterrupted: true
// System.out.println("Interrupted: " + Thread.currentThread().interrupted()); // Interrupted: false
// try {
// Thread.sleep(500); // Verursacht Exception
// System.out.println(„Hello World“); // Das sehen wir nicht
// }
// catch (InterruptedException ex) {
// System.out.println(ex.getMessage()); // sleep interrupted
// System.out.println("I-Flag: " + Thread.currentThread().isInterrupted()); // I-Flag: false
// }

frame.setVisible(false);
//frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
frame.dispose();
System.out.println(„Start Javio“);
new KeyConfig().start();
}
});

// javax.swing.JOptionPane.showMessageDialog(null,
// „Javio wird ausgefuert“,
// „Info“,
// javax.swing.JOptionPane.INFORMATION_MESSAGE);
}
});

highBut.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
// try {
// HighScore hscore = new HighScore(); //Highscore starten
// } catch (Exception ex) {
// Logger.getLogger(StartBild.class.getName()).log(Level.SEVERE, null, ex);
// }
System.out.println(„Start Highscore“);
}
});

endeBut.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
System.exit( 0 ); //Programm schliessen
}
});

panel.setLayout(new java.awt.GridBagLayout());

panel.add(startBut, new java.awt.GridBagConstraints());
panel.add(highBut, new java.awt.GridBagConstraints());
panel.add(endeBut, new java.awt.GridBagConstraints());

frame.getContentPane().add(panel);

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

class ImagePanel extends JPanel {

private Image img;

public ImagePanel(String img) {
this(new ImageIcon(img).getImage());
}

public ImagePanel(Image img) {
this.img = img;
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
setLayout(null);
}

@Override
public void paintComponent(Graphics g) {
g.drawImage(img, 0, 0, null);
}

}

In der KeyConfig.java habe ich eine Methode start() die die KeyConfig aufruft.

Hi.
Dies ist mein Quellcode vom StartBild:

package Menu;

import graphics.HighScore;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

/**
*
* @author Jacqueline
* @date 30.01.2012
* Problem:
* -KeyConfig Klasse wird nicht richtig ausgefuehrt
*
*/
public class StartBild {

public static void main(String[] args) {
//ImagePanel panel = new ImagePanel(new ImageIcon(PfadUndDateiname).getImage());
ImagePanel panel = new ImagePanel(new ImageIcon(„images/hinter.jpg“).getImage());
final JFrame frame = new JFrame();
JButton startBut = new JButton(„Starte Javio“);
JButton highBut = new JButton(„Highscoreliste“);
JButton endeBut = new JButton(„Javio beenden“);

//alle ActinListener
startBut.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
// new KeyConfig().run();
// System.out.println(„Start Javio“);

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// System.out.println("IsInterrupted1: " + Thread.currentThread().isInterrupted()); // IsInterrupted: false
// Thread.currentThread().interrupt(); // Setze Interrupted-Flag
// System.out.println("IsInterrupted: " + Thread.currentThread().isInterrupted()); // IsInterrupted: true
// System.out.println("Interrupted1: " + Thread.currentThread().interrupted()); // IsInterrupted: true
// System.out.println("Interrupted: " + Thread.currentThread().interrupted()); // Interrupted: false
// try {
// Thread.sleep(500); // Verursacht Exception
// System.out.println(„Hello World“); // Das sehen wir nicht
// }
// catch (InterruptedException ex) {
// System.out.println(ex.getMessage()); // sleep interrupted
// System.out.println("I-Flag: " + Thread.currentThread().isInterrupted()); // I-Flag: false
// }

frame.setVisible(false);
//frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
frame.dispose();
System.out.println(„Start Javio“);
new KeyConfig().start();
}
});

// javax.swing.JOptionPane.showMessageDialog(null,
// „Javio wird ausgefuert“,
// „Info“,
// javax.swing.JOptionPane.INFORMATION_MESSAGE);
}
});

highBut.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
// try {
// HighScore hscore = new HighScore(); //Highscore starten
// } catch (Exception ex) {
// Logger.getLogger(StartBild.class.getName()).log(Level.SEVERE, null, ex);
// }
System.out.println(„Start Highscore“);
}
});

endeBut.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
System.exit( 0 ); //Programm schliessen
}
});

panel.setLayout(new java.awt.GridBagLayout());

panel.add(startBut, new java.awt.GridBagConstraints());
panel.add(highBut, new java.awt.GridBagConstraints());
panel.add(endeBut, new java.awt.GridBagConstraints());

frame.getContentPane().add(panel);

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

class ImagePanel extends JPanel {

private Image img;

public ImagePanel(String img) {
this(new ImageIcon(img).getImage());
}

public ImagePanel(Image img) {
this.img = img;
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
setLayout(null);
}

@Override
public void paintComponent(Graphics g) {
g.drawImage(img, 0, 0, null);
}

}

In der KeyConfig.java habe ich eine Methode start() die die KeyConfig aufruft.

Hallo,

mit invokeLater funktioniert dein Code ja. Das Problem an invokeAndWait dürfte sein, dass du versuchst, auf dich selbst zu warten. Heißt, du blockierst deinen eigenen Thread und wartest darauf.

in der Api:
http://docs.oracle.com/javase/6/docs/api/javax/swing…

kannst du das gut sehen. Beachte, wann welcher Thread verwendet wird.

Leider kann ich dir derzeit aus Zeimangel nicht weiterhelfen.
Viele Grüße
Michael