Programmablauf widerholen

sc0p

Mitglied
Hallo Zusammen

Ich komme wohl nie aus den AnfängerThemen...

Es geht darum...:

dass ich ein riesen Programm abändern muss. Grundsäzlich läuft es momentan.
Das Programm dient dazu, IPPhones von Cisco remote zu steuern.
Beim start liest es ein XML File aus, um das GUI an zu zeigen.

so hat man einen Startbildschirm

Man wählt (erst) jetzt ein Modell, tippt die IP, Username und PW ein, und clickt Connect.

Neu:

Nun wählt er ein anderes von mir angepasstes XML file, und widerholt die Draw Funktion.
Ich dachte dies recht dafür:

Java:
else if (model == 3)   {	
				//Wenn das IPPhone-Model 7960 ist :
			
				strXMLfile = "7960.xml";
				drawPhone();
		
			}


Fehler:

Da das GUI im SekundenTakt refresht, erhalte ich jede Sekunde einen Fehler:

java.lang.ArrayIndexOutOfBoundsException: 50
bis
java.lang.ArrayIndexOutOfBoundsException: 472

also das ganze Programm...


Frage:

Kann man denn so überhaupt den Draw Prozess neu starten?
 

crackm

Mitglied
Es würde vielleicht helfen, wenn du die betreffende Methode postest(drawPhone) oder die betreffenden Zeilen, denn ArrayIndexOutOfBoundsException bezieht sich einfach auf ein array bei dem das Programm versucht auf ein index zuzugreifen, welcher größer ist als die Größe des Arrays.
 

sc0p

Mitglied
Hallo

Hilft das euch den wirklich, wenn ich ein 210 Zeilen langes Code-Stück poste?

Ich muss ja diesen Prozess einfach wiederholen können...
 
S

SlaterB

Gast
von 210 Zeilen wurde nicht gesprochen, zunächst wäre die Zeile des Fehlers interessant, falls bekannt,
sowie eine ungefähre Beschreibung, was denn da pro Sekunde 1x passiert,
inwiefern nach deinem Wissen Arrays beteiligt sind,

aber ok, die 210 Zeilen kannst eigentlich auch dazuposten, schadet ja nicht
 

sc0p

Mitglied
okai
Wie gesagt, der Fehler zieht sich durch das ganze Programm:
Der Fehler beginnt nach dem Klicken auf Connect, welches zum einen Connecten soll zum anderen das XML file wechseln.
Nun zieht sich aber dieser Fehler durch denn gesammten code, von Zeile 50 bis 472
Der Fehler wurde ja von crackm ganz gut beschrieben.

die Methode die das GUI zeichnet:

Code

[JAVA=117]public void drawPhone() throws IllegalArgumentException {

try {
MediaTracker mt = new MediaTracker(this); //Konstruktor für einen neuen MediaTracker

URL strXMLurl = Screen.class.getResource("/"+strXMLfile); //URL mit dem Pfad zum XML-File
Document doc = new SAXBuilder().build(strXMLurl); //Initiiert die XML Funktion von SAX
Element root = doc.getRootElement(); //Besorgt alle Wurzelelemente aus dem XML-File
Iterator Level1 = root.getChildren().iterator(); //Bildet einen Iterator für alle Wurzelelemente


while (Level1.hasNext()) { //Geht alle WurzelElemente des XML-Files durch

Element strElement = (Element)Level1.next(); //Springt zum nächsten Element
String strLevel1 = strElement.getName(); //Besorgt den Namen des aktuelle angesteuerten Elements
Iterator Level2 = root.getChild(strLevel1).getChildren().iterator(); //Bildet einen Iterator für die 2 Ebene beim XML-File


while (Level2.hasNext()) { //Geht alle Level2 Elemente vom XML-File durch
Element strElement2 = (Element)Level2.next(); //Springt zum nächsten Element
String strLevel2 = strElement2.getName(); //Besorgt die Namen der Level2 Elemente

if (strLevel1 != "Main") {
Iterator Level3 = root.getChild(strLevel1).getChild(strLevel2).getChildren().iterator();//Bildet einen Iterator für die 3 Ebene beim XML-File

while (Level3.hasNext()) { //Geht alle Level3 Elemente vom XML-File durch
cntButton++; //Zählt die Anzahl Buttons bei jedem Durcgang um 1 hoch

Element strElement3 = (Element)Level3.next(); //Springt zum nächsten Element
Iterator Level4 = strElement3.getChildren().iterator(); //Bildet einen Iterator für die 4 Ebene beim XML-File
/*
* Definiert Bilderkoordinaten aus XML in Variabeln
* |
* |
* v
*/
int intLeft = Integer.parseInt(strElement3.getAttributeValue("left"));//X-Position innerhalb des Applets
int intTop = Integer.parseInt(strElement3.getAttributeValue("top"));//Y-Position innerhalb des Applets
int intWidth = Integer.parseInt(strElement3.getAttributeValue("width"));//Breite des Button
int intHeight = Integer.parseInt(strElement3.getAttributeValue("height"));//Höhe des Button

while (Level4.hasNext()) { //Geht die letzte Ebene des XML-File durch

Element entLevel4 = (Element) Level4.next(); //Springe zum nächsten Element
if ("Normal".equals(entLevel4.getAttribute("name").getValue())) { //Wenn Normal der Wert des Attributs "name" ist:
//Definition von Variablen für den späteren Bildausschneide Vorgang
this.imgLeft = entLevel4.getAttribute("left").getIntValue();
this.imgTop = entLevel4.getAttribute("top").getIntValue();
this.strFile = entLevel4.getAttribute("Filename").getValue();
}
if ("Hover".equals(entLevel4.getAttribute("name").getValue())) { //Wenn Normal der Wert des Attributs "name" ist:
//Definition von Variablen für den späteren Bildausschneide Vorgang
this.imgLeftH = entLevel4.getAttribute("left").getIntValue();//X-Position
this.imgTopH = entLevel4.getAttribute("top").getIntValue();//Y-Position
}
}
Color colPink = new Color(255,0,255); //Neue Farbe wird definiert

URL urlButtonN = Screen.class.getResource("/"+strFile.substring(2));//URL vom Button der im Normalzustand angezeigt werden soll
URL urlButtonH = Screen.class.getResource("/"+strFile.substring(2));//URL vom Button der Angezeigt werden soll wenn die Maus darüber ist
//Button:NORMAL
imgButton = ImageIO.read(urlButtonN); //Ladet ein Bild in den Buffer
this.imgProd = imgButton.getSource(); //Besorgt die Bilderquellen von imgButton
this.imgFilter = new TransparentFilter(colPink); //Konstruktor für einen Transparentfilter der die Frabe Pink ersetzen soll
this.imgButtonShow = createImage(new FilteredImageSource(this.imgProd, this.imgFilter));//Transparentfilter wird angewandt
this.imgButtonShow = createImage(new FilteredImageSource(this.imgButtonShow.getSource(), new CropImageFilter(imgLeft, imgTop, intWidth, intHeight)));//Bildsauschnittfilter wird angewandt

//Button:HOVER
imgButtonH = ImageIO.read(urlButtonH); //Ladet ein Bild in den Buffer
this.imgProdH = imgButtonH.getSource(); //Besorgt die Bilderquellen von imgButtonH
this.imgFilterH = new TransparentFilter(colPink); //Konstruktor vom Transparentfilter
this.imgButtonShowH = createImage(new FilteredImageSource(this.imgProdH, this.imgFilterH));//Transparentfilter wird angewandt
this.imgButtonShowH = createImage(new FilteredImageSource(this.imgButtonShowH.getSource(), new CropImageFilter(imgLeftH, imgTopH, intWidth, intHeight)));//Bildsauschnittfilter wird angewandt


arrImages[cntButton] = imgButtonShow; //Buttonarray wird aufgefüllt
mt.addImage(arrImages[cntButton], cntButton); //Fügt dem MediaTracker Grafiken hnizu

if (cntButton != 41 && cntButton != 35) { //41 = Runder Navigationsbutton
//35 = Überflüssige Taste
Icon icon = new ImageIcon(imgButtonShow); //Icon für den Normalzustand des Buttons wird erzeugt
Icon icon2 = new ImageIcon(imgButtonShowH); //Icon für den MouseOver-Zustand des Buttons wird erzeugt
butCommand[cntButton] = new JButton(icon); //Ein Button mit dem vorher erstellten Icon
butCommand[cntButton].setActionCommand(""+cntButton); //Setzt dem Button ein Kommando bei das beim Betätigen ermittelt werden kann
butCommand[cntButton].setRolloverIcon(icon2); //Setzt den Icon der im Falle des MouseOver angezeigt werden soll
butCommand[cntButton].setBorder(null); //Rahmen der Buttons wird auf 0px breite gesetzt
butCommand[cntButton].setBounds(intLeft, intTop+intSpace, intWidth, intHeight);//Positioniert den Button und legt die Grösse fest
butCommand[cntButton].setContentAreaFilled(false); //Macht den Hintergrund der Buttons Transparent
butCommand[cntButton].addActionListener(new ActionListener() { //Fügt den Buttons ein Abhörsystem bei, dass bei Knopfdruck aktiviert wird
public void actionPerformed(ActionEvent e) {
new command.Exec(e.getActionCommand()); //Ruft bei Knopfdruck eine Methode in der Klasse "Exec" auf
}
});

panel.add(butCommand[cntButton]); //Fügt den Button in die Applikation ein
}
else {
if (cntButton == 41) { //Spezialanfertigung für den runnden Navigationsbutton der die NUmmer 41 trägt

arrImgData[0] = intLeft;
arrImgData[1] = intTop;

//Erstellt denn Button für den NavigationsButton. Action: up
int posUP = intLeft+(intWidth/2-10);
JButton up = new JButton("");
up.setActionCommand(""+cntButton);
up.setContentAreaFilled(false);
up.setBounds(posUP-1, intTop+intSpace+5, 20, 20);
up.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new command.Exec(e.getActionCommand());
}
});
panel.add(up);
cntButton++;

//Erstellt denn Button für den NavigationsButton. Action: left
int posL = intTop+(intHeight/2-10);
JButton lft = new JButton("");
lft.setBounds(intLeft+5, posL+intSpace, 20, 20);
lft.setContentAreaFilled(false);
lft.setActionCommand(""+cntButton);
lft.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new command.Exec(e.getActionCommand());
}
});
panel.add(lft);
cntButton++;

//Erstellt denn Button für den NavigationsButton. Action: right
int posR = intTop+(intHeight/2-10);
JButton rgt = new JButton("");
rgt.setBounds(intLeft+(intWidth-25), posR+intSpace, 20, 20);
rgt.setContentAreaFilled(false);
rgt.setActionCommand(""+cntButton);
rgt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new command.Exec(e.getActionCommand());
}
});
panel.add(rgt);
cntButton++;

//Erstellt denn Button für den NavigationsButton. Action: down
int posDown = intLeft+(intWidth/2-10);
JButton down = new JButton("");
down.setContentAreaFilled(false);
down.setBounds(posDown-1, intTop+intSpace+(intHeight-25), 20, 20);
down.setActionCommand(""+cntButton);
down.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new command.Exec(e.getActionCommand());
}
});
panel.add(down);
cntButton++;
}
}

}//end_while3

}//end_if
else {
/*
* Definition vom Background-Image
* |
* |
* v
*/
Element imgMain = root.getChild(strLevel1).getChild("Bitmap"); //Bezieht das Element Bitmap aus dem XML-File
String srcMain = imgMain.getAttributeValue("Filename"); //Bezieht das Attribut Filename aus dem Element "Bitmap"
URL urlMain = Screen.class.getResource("/"+srcMain.substring(2));//Setzt dir URL für das hintergrundbild
intMainLeft = Integer.parseInt(imgMain.getAttributeValue("left"));//X-Position
intMainTop = Integer.parseInt(imgMain.getAttributeValue("top"));//Y-Position
intMainWidth = Integer.parseInt(imgMain.getAttributeValue("width"));//Breite des Hintergrundbild
intMainHeight = Integer.parseInt(imgMain.getAttributeValue("height"));//Höhe des Hintergrundbild

Element imgDisplay = root.getChild(strLevel1).getChild("DisplayScreen");//Bezieht das Element DisplayScreen aus dem XML-File
disLeft = imgDisplay.getAttribute("left").getIntValue(); //Gibt die X-Koordinaten für das spätere Screenshotbild an
disTop = imgDisplay.getAttribute("top").getIntValue(); //Gibt die Y-Koordinaten für das spätere Screenshotbild an

bgImage = ImageIO.read(urlMain); //Lese Background BMP File in den ImageBuffer
Color colPink = new Color(255,0,255); //Neue Farbe wird definiert
this.imgFilter = new TransparentFilter(colPink); //Pink wir mit Transparenz ersetzt
ImageProducer bgPro = bgImage.getSource(); //Bild wird produziert
bgImage2 = createImage(new FilteredImageSource(bgPro, this.imgFilter));//Filter wird angewandt

mt.addImage(bgImage2 , 0);
resize(intMainWidth,intMainHeight+intSpace); //Appletgrösse ändern
setBackground(new Color(255,255,255)); //AppletHinterGrund auf Weiss setzen
}//end_else
}//end_while_2
}//end_while_1

try { mt.waitForAll(); } //Wartet bis alle Bilder in den Arbeitsspeicher geladen wurden
catch (InterruptedException e) { }
drawButtons(); //Ruft Methode drawButtons in der gleichen Klasse auf
panel.repaint();
}//end_try

//FEHLERAUSGABEN:
catch (IOException e) {
System.err.println(e);
}

catch (Exception e) {
System.err.println(e);
}
}
[/code]



Von dieser Zeile 117 soll er noch einmal beginnen -> zurückspringen...
 
S

SlaterB

Gast
die Fehler wurde von crackm überhaupt nicht beschrieben sondern vielmehr erfragt!
und 'Nun zieht sich aber dieser Fehler durch denn gesammten code' hilft dabei gar nicht weiter

was eine ArrayIndexOutOfBoundsException ist ist gewiss allen bekannt, aber WO tritt sie auf?
es muss doch im StackTrace exakt eine Zeile bekannt sein

es könnte z.B. Zeile 199
> butCommand[cntButton] = new JButton(icon);
sein,
das ließe sich dadurch erklären, dass cntButton am Anfang als 0 deklariert ist, im Laufe eines Durchgangs auf 50 oder so erhöht wird
und im nächsten Durchgang nicht wieder auf 0 zurückgesetzt wird,
statt 0-49 werden dann die Indexe 50-99 angesprochen was bei einem Array der Länge 50.., nun ja, die Folgen sind bekannt
 

sc0p

Mitglied
er Tritt auf jeder Zeile auf, wenn ich diesen screenshot richtig interpretiere
1isir7n1iid3.jpg
 
S

SlaterB

Gast
nein, jede Ausgabe steht für eine eigene Exception und die Zahl ist keine Zeilenangabe sonder der Index, mit dem auf ein Array zugegriffen wurde,

verwende für Exceptions
e.printStackTrace();
dann erfährst du die Zeile im Code
 

sc0p

Mitglied
Achso, entschuldige

Mit deiner Variante steht dann pro Index

java.lang.ArrayIndexOutOfBoundsException: 50 (von 50 an)
at gui.Screen.drawPhone(Screen.java:192)
at gui.Screen.getDisplay(Screen.java:438)
at gui.Screen.run(Screen.java:353)
at java.lang.Thread.run(Unknown Source)



ok, aber ist denn das überhaupt richtig, wenn man mit drawPhone(); versucht den Prozess zu wiederholen?

EDIT: Scheinbar nicht da es auf der Zeile 438 steht ...
 
S

SlaterB

Gast
was stellst du dir für merkwürdige Fragen,
Exceptions kann man normalerweise auf den Grund gehen und analyisieren,

warum sollte deshalb drawPhone(); grundsätzlich falsch sein, bzw. warum fragst du dich das jetzt und nicht schon von Anfang an?
was hat sich verändert?

-------------

das einzig sinnvolle, was du seit ca 35 Posts machen sollst, hast du aber auch diesmal wieder gekonnt ignoriert:
finde heraus, in welcher Zeile der Fehler stattfindet, Screen.java:192, was steht in dieser Zeile?!

edit:
ok, Zeile 192 scheint es auch genau im gepostenen Code zu sein, also
> arrImages[cntButton] = imgButtonShow;
ich bin nach wie vor der Ansicht, dass es an cntButton liegt, hast du gelesen was ich oben dazu geschrieben habe?
 
Zuletzt bearbeitet von einem Moderator:

sc0p

Mitglied
Nun ich dachte, da ich schon einen grossen Teil des Codes gepostet habe, könntest du wenigsten auf zeile 192 selbst nachschauen :3

[JAVA=192] arrImages[cntButton] = imgButtonShow; //Buttonarray wird aufgefüllt[/code]

[JAVA=438]drawPhone();[/code]

[JAVA=353]this.getDisplay(); //Ruft Methode getDisplay() auf[/code]

Das sind die fehlerhaften Zeilen


Ich frage mich schon die ganze Zeit ob Grundsätchlich mit dem einfach schreiben von drawPhone(); man überhaupt "zurückspringen" kann
 
S

SlaterB

Gast
tja, normalerweise ist der Code hier eben anders nummeriert ;)

aber hatte ich dann auch gesehen, siehe edit im letzten Posting

> Ich frage mich schon die ganze Zeit ob Grundsätchlich mit dem einfach schreiben von drawPhone(); man überhaupt "zurückspringen" kann

so ganz grundsätzlich kann man in Java überhaupt nicht springen und außerdem wird alles mit Methoden-Aufrufen gemacht
 

sc0p

Mitglied
ja, du hast bestimmt recht (als ob ich mir eine andere Möglichkeit vorstellen könnte)

d.h. mein "springen" ist ein Aufrufen & wenn ich die Arrays "leere" dann gehts besser :3
 
S

SlaterB

Gast
Arrays leeren ist allgemein eine brauchbare Idee vor Wiederholung,
vielleicht aber nicht nötig wenn sie sowieso komplett befüllt werden sollten,

ich sprach davon eine Variable auf 0 zu setzen, woraus man aber auch ein Grundschema erkennen kann: alles zurück auf Anfang,
auch andere Variablen, und eben z.B. auch Arrays die vorher leer waren, ja
 

sc0p

Mitglied
hm...
ne, auf "null" setzen stimmt ja nicht

Java:
arrImages[cntButton] = null;

die braucht den wert 50
oder?

Original
Java:
static Image[]			arrImages 	= new Image[50];
 
S

SlaterB

Gast
> die braucht den wert 50

ist mir nicht verständlich, wer ist 'die'? warum braucht irgendjemand irgendwas, wofür?
ein Index-Zugriff von 50 auf das Array führt zu einer ArrayIndexOutOfBoundsException, wie ich die ganze Zeit für deine Ausführungsfehler schon vermute
 

sc0p

Mitglied
nunja,
befriedigt von den unglaublichen Wundertaten, wie es sonst nur höchste Meister in diesem Genre beherschen, gehe ich jetzt nach Hause, ohne sichtliche oder irgend auf eine Weise nachvollziehbarer Erfolge. :smoke:
 

sc0p

Mitglied
achso ne, kein wert 50ig
"es" siehe unter dran, sollte eifach wieder auf standart zurückgesetzt werden.

probiere morgen weiter



Java:
static Image[]          arrImages   = new Image[50];


cya & thx
 

Ziegenpeter

Aktives Mitglied
Ok, ich versuch's auch nochmal!
Das Problem ist wohl, dass die Variable cntButton nicht wieder auf 0 (nicht null) gesetzt wird. Wenn dies vor dem aufruf geschieht sollte es gehen. Es war nicht gemeint, dass du den Wert an Stelle cntButton null setzt!
 

sc0p

Mitglied
Super Ziegenpeter

> Es war nicht gemeint, dass du den Wert an Stelle cntButton null setzt!

So funktionierts schon mal ohne Fehler wenn ich genau den cntButton wert auf 0 (<- Zahl Null) setzte)
Nur zeichnets jetzt halt die neuen Knöpfe mit den neuen Koordinaten über die alten ...

Muss ich wohl zuerst Abfragen, welches man haben möchte bevor irgendwas gezeichnet wird??
 

sc0p

Mitglied
jo, so funktioniert mal das Layout

Die Cisco-spezifischen Fehler die ich jetzt noch habe, muss ich wohl wo anderes raus finden

Aber vielen dank für die unterstützung! :toll:
 

Ähnliche Java Themen

Neue Themen


Oben