Hallo zusammen,
ich bekomme in meinem Programm einen Fehler, hab aber keine Ahnung wie ich den abstellen kann.
Ich habe eine grobe Vermutung wo der auftritt, aber nicht die geringste Idee warum.
Ich hoffe ihr könnt mir dabei helfen.
Zuvor eine Erklärung was ich mache:
Ich verwende einen Desktop Manager und stelle auf diesem mehrere JInternalFrame dar.
Ich habe mir einen FensterManager geschrieben, der die JInternalFrame verwaltet und in einer Liste hält.
Ziel ist es, beim Beenden jedes interne Fenster einzeln zu schließen und ggf. noch einige Operationen auszuführen.
Dies funktioniert soweit auch sehr gut.
Jetzt erst einmal ein paar Klassen, damit Ihr sehr wie das ganze funktioniert:
Jedes Fenster wiederum erbt von InternesBasisFenster. Die ganze Sache funktioniert soweit auch sehr gut. Jetzt aber zu meinem Problem:
Eines der Fenster muss einen Timer haben, der bei Ablauf das Fenster schließt.
Ich habe das also so gebaut:
Der Timer wird korrekt eingefügt, läuft ab und ruft auch die close() Methode auf. Diese wiederum sorgt dafür,
dass der FensterManager das Fenster schließt. Dann jedoch gibt es in 95% aller Fälle einen Fehler:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: No such child: 3
at java.awt.Container.getComponent(Container.java:281)
at javax.swing.JComponent.rectangleIsObscured(JComponent.java:4319)
at javax.swing.JComponent.paint(JComponent.java:1020)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:564)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5104)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)
at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
at javax.swing.JComponent._paintImmediately(JComponent.java:5052)
at javax.swing.JComponent.paintImmediately(JComponent.java:4862)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:723)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Mein Problem ist, dass ich keine Ahnung habe wo das ganze auftritt. Ich habe an verschiedenen Positionen bereits mittels try-catch probiert den Fehler zu finden oder auch diverse Ausgaben auf die Console ausgegeben, aber ich finde einfach die Ursache nicht.
Es scheint so, dass der FensterManager irgendwie dafür verantwortlich ist. Der Index wird aber korrekt abgerufen und herunter gezählt.
Ich habe einfach keinen Schimmer mehr was ich da noch machen kann oder wie ich das abstelle. Vorallem, weil in der Fehlerliste keine einzige meiner eigenen Klassen auftaucht.
Wenn ich das Fenster ganz nebenbei normal schließe, bevor der Timer zuschlägt, dann funktioniert alles normal und der Timer wird auch abgebrochen (dazu ist das logoff.cancel() im exit gedacht).
Aber wenn der Timer zuschlägt gibt es besagten Fehler.
Hat irgendwer von Euch eine Idee?
ich bekomme in meinem Programm einen Fehler, hab aber keine Ahnung wie ich den abstellen kann.
Ich habe eine grobe Vermutung wo der auftritt, aber nicht die geringste Idee warum.
Ich hoffe ihr könnt mir dabei helfen.
Zuvor eine Erklärung was ich mache:
Ich verwende einen Desktop Manager und stelle auf diesem mehrere JInternalFrame dar.
Ich habe mir einen FensterManager geschrieben, der die JInternalFrame verwaltet und in einer Liste hält.
Ziel ist es, beim Beenden jedes interne Fenster einzeln zu schließen und ggf. noch einige Operationen auszuführen.
Dies funktioniert soweit auch sehr gut.
Jetzt erst einmal ein paar Klassen, damit Ihr sehr wie das ganze funktioniert:
Java:
public class InternesBasisFenster
extends JInternalFrame
implements InternalFrameListener
{
private static final long serialVersionUID = 1L;
protected Sitzung session;
protected InternesBasisFenster(String titel, Sitzung session)
{
super(titel);
this.session = session;
addInternalFrameListener(this);
setClosable(true);
}
public void exit()
{
}
public final void close()
{
session.closeWindow(this);
}
public final void internalFrameClosing(InternalFrameEvent event)
{
session.closeWindow(this);
}
public final void internalFrameDeactivated(InternalFrameEvent event) {}
public final void internalFrameActivated(InternalFrameEvent event) {}
public final void internalFrameDeiconified(InternalFrameEvent event) {}
public final void internalFrameIconified(InternalFrameEvent event) {}
public final void internalFrameClosed(InternalFrameEvent event) {}
public final void internalFrameOpened(InternalFrameEvent event) {}
}
Java:
public final class Sitzung
{
//Klasse ist gekürzt
private BasisFenster basisfenster; // Das Basisfenster ist ein JFrame, in dem alle anderen Fenster angezeigt werden
private FensterManager manager;
private java.util.Timer zeitgeber;
protected Sitzung(BasisFenster basisfenster)
{
this.basisfenster = basisfenster;
manager = new FensterManager(this, basisfenster.getDesktop());
zeitgeber = new java.util.Timer("Zeitgeber", true);
}
public final void closeWindow(InternesBasisFenster fenster)
{
manager.schliesseFenster(fenster);
}
public final void schedule(TimerTask task, int zeit)
{
zeitgeber.schedule(task, zeit);
}
}
Java:
final class FensterManager
{
private Sitzung session;
private JDesktopPane desktop;
private LinkedList<InternesBasisFenster> fensterliste;
protected FensterManager(Sitzung session, JDesktopPane desktop)
{
this.session = session;
this.desktop = desktop;
fensterliste = new LinkedList<InternesBasisFenster>();
}
protected final void logout()
{
InternesBasisFenster fenster;
while(fensterliste.isEmpty() == false)
{
fenster = fensterliste.remove(0);
fenster.exit();
fenster.dispose();
}
}
protected final void zeigeFenster(InternesBasisFenster fenster, int posx, int posy)
{
fenster.setLocation(posx, posy);
desktop.add(fenster);
fenster.setVisible(true);
fensterliste.add(fenster);
}
public final void schliesseFenster(InternesBasisFenster fenster)
{
int index = fensterliste.indexOf(fenster);
if(index == -1)
{
// An dieser Stelle wird normal ein fehler ausgelöst. Fehlermanagement hier fürs Beispiel egal.
return;
}
fenster.exit();
fensterliste.remove(index);
fenster.dispose();
}
}
Jedes Fenster wiederum erbt von InternesBasisFenster. Die ganze Sache funktioniert soweit auch sehr gut. Jetzt aber zu meinem Problem:
Eines der Fenster muss einen Timer haben, der bei Ablauf das Fenster schließt.
Ich habe das also so gebaut:
Java:
public final class HL1
extends AP608FFBasisFenster
{
// Klasse reduziert
private static final long serialVersionUID = 1L;
private AusloggTimer logoff;
public HL1(Sitzung session)
{
super("Testfenster", session);
setSize(560, 395);
logoff = new AusloggTimer(this);
session.schedule(logoff, 20 * 1000);
}
public final void exit()
{
logoff.cancel();
}
}
Java:
public final class AusloggTimer
extends TimerTask
{
private InternesBasisFenster fenster;
public AusloggTimer(InternesBasisFenster fenster)
{
this.fenster = fenster;
}
public void run()
{
fenster.close();
}
}
Der Timer wird korrekt eingefügt, läuft ab und ruft auch die close() Methode auf. Diese wiederum sorgt dafür,
dass der FensterManager das Fenster schließt. Dann jedoch gibt es in 95% aller Fälle einen Fehler:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: No such child: 3
at java.awt.Container.getComponent(Container.java:281)
at javax.swing.JComponent.rectangleIsObscured(JComponent.java:4319)
at javax.swing.JComponent.paint(JComponent.java:1020)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:564)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5104)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)
at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
at javax.swing.JComponent._paintImmediately(JComponent.java:5052)
at javax.swing.JComponent.paintImmediately(JComponent.java:4862)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:723)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Mein Problem ist, dass ich keine Ahnung habe wo das ganze auftritt. Ich habe an verschiedenen Positionen bereits mittels try-catch probiert den Fehler zu finden oder auch diverse Ausgaben auf die Console ausgegeben, aber ich finde einfach die Ursache nicht.
Es scheint so, dass der FensterManager irgendwie dafür verantwortlich ist. Der Index wird aber korrekt abgerufen und herunter gezählt.
Ich habe einfach keinen Schimmer mehr was ich da noch machen kann oder wie ich das abstelle. Vorallem, weil in der Fehlerliste keine einzige meiner eigenen Klassen auftaucht.
Wenn ich das Fenster ganz nebenbei normal schließe, bevor der Timer zuschlägt, dann funktioniert alles normal und der Timer wird auch abgebrochen (dazu ist das logoff.cancel() im exit gedacht).
Aber wenn der Timer zuschlägt gibt es besagten Fehler.
Hat irgendwer von Euch eine Idee?