26. august 2005 - 16:07Der er
11 kommentarer og 1 løsning
Komponenter kan pludselig ikke editeres
Hej, jeg har en applet, hvorpå jeg har componenter af følgende typer: JTable i en JScrollPane JEditorPane JFormattedTextField
Somme tider kan jeg ikke markere eller ændre teksten i disse komponenter. Så minimerer, og maksimerer mit browservindue, og jeg kan igen editere teksten.
Jeg har prøvet at kalde Invalidate, Validate og Update men uden held. Måske har jeg heller ikke gjort det rigtigt.
Hvad gør jeg for at sikre mig at brugeren kan indtaste noget i komponenterne?
jeg har fundet ud af at der sker når jeg håndterer et musetast et sted, med metoden:
public void mouseClicked(MouseEvent event) { .... }
herinde bliver der forespurgt en masse data, og tegnet data. Forsøg har vist at hvis jeg kommenterer al koden i mouseClicked ud så virker min applet. hvis jeg kommenterer noget af koden ud, virker appleten somme tider. det er bestemt ikke konsekvent
Kunne det tænkes at der sker et eller andet hvis jeg er inde i mouseClicked for længe? måske lidt ligesom man ikke må være for længe i en interruptroutine???
Nedenfor ses min kode, men den er ret omfattende. Når der trykkes musen kaldes funktionen mouseClicked(...) Denne funktion laver en ParameterSelecter, som er en klasse der er en dialog. Når dialogen afsluttes hentes værdier ud af den i strengene buttonPressedReturn, parameterNameReturn, parameterIDReturn, osv.
mouseClicked() kalder requestData() requestData() kalder paramTransf.GetLogDataString(...) // henter data vi en socket requestData() kalder paramTransf.ParseLogData(logDataString, emptyParamArray); // parser data, og returnerer dem i et object.
/****************************************************************/ public void mouseClicked(MouseEvent event) { String buttonPressedReturn = new String(""); String parameterNameReturn = new String(""); String parameterIDReturn = new String(""); Float min_skaleringReturn = new Float(0); Float max_skaleringReturn = new Float(0); String ParameterTypeListIndexReturn;
int selectedRow = 0;// = table.rowAtPoint(event.getPoint()); try { // hvis der trykkes i kolonne 0 i tabellen if(table.columnAtPoint(event.getPoint()) == 0) { selectedRow = table.rowAtPoint(event.getPoint());
ParameterSelecter myPS = new ParameterSelecter(parameterTypeList); ParameterType paramType = (ParameterType)(parameterTypeList.get(myPS.ParameterTypeListIndex));
public void requestData() { int antalDataPunkter = 100;
// tidspunkter hentes fra editBoxe... Pattern p = Pattern.compile("\\d\\d\\d\\d/\\d\\d/\\d\\d-\\d\\d:\\d\\d|\\d\\d\\d\\d-\\d\\d-\\d\\dT\\d\\d:\\d\\d");
Matcher m = p.matcher(startTid); // ... og hvis ikke der er nogle, så indsættes default tidspunkter if(! m.find()) { startTid = new String("2005/06/29-07:17"); } m = p.matcher(stopTid); if(! m.find()) { stopTid = new String("2005/06/29-10:22"); }
int logType = 0;
// forige chart fjernes, og parametre slettes this.remove(mychart); Parameter.ClearAll();
// nyt parameterarray oprettes Parameter[] emptyParamArray; emptyParamArray = new Parameter[10];
// nyt tomt parameter array udfyldes med parameter-id'er således // at programmet senere ved hvilke parameter-værdier der skal indsættes for(int paramCnt = 0; paramCnt < 10; paramCnt++) { // hvis der står et ID i feltet if(data[paramCnt][0].length()!=0) { // Opret parameter, og indsæt værdier fra tabel heri. emptyParamArray[paramCnt] = new Parameter(); emptyParamArray[paramCnt].color = Parameter.colorSheme[paramCnt]; emptyParamArray[paramCnt].SetSkaling( Float.parseFloat(data[paramCnt][2].toString()), Float.parseFloat(data[paramCnt][3].toString())); emptyParamArray[paramCnt].SetNameAndID(data[paramCnt][0], data[paramCnt][1]); } else { emptyParamArray[paramCnt]=null; } } // datoformat: 2005/12/30-22:54
// beregn antal parametre som er valgt. // Hvis der er valgt en eller flere parametre, så hent data, ellers skriv fejlmeddelelse int numberOfParameters = 0; for(int cnt=0;cnt<emptyParamArray.length;cnt++) { if(emptyParamArray[cnt] != null) numberOfParameters ++; }
// hvis der er valgt parametre.. if(numberOfParameters != 0) {
if(myIP.length() == 0) { myIP = defaultIP; } // parameter data forespørges på server, og en streng returneres logDataString = paramTransf.GetLogDataString(myIP ,"se" // language , startTid // starttid , stopTid // stoptid , emptyParamArray // array med parametre som vi er interesserede i , type // "0"// typen , antalDataPunkter); // antallet af datapunkter
// strengen parses, og resultat returneres i parameter som er af typen Parameter[] ParsedParameters parameterObject = paramTransf.ParseLogData(logDataString, emptyParamArray); parameter = parameterObject.parameter;
// vis meddelelse fra log-server i statusfelt statusText = parameterObject.status; drawStatusField();
// vis dialog med meddelelse fra log-server if(parameterObject.dialog.length() > 0) { JOptionPane.showMessageDialog(new JFrame(),parameterObject.dialog,"Dialog",JOptionPane.INFORMATION_MESSAGE); }
mychart = new Chart(parameter,chartheight,chartwidth,numberOfHorisontalLines,0,backgroundColor, chartBackgroundColor); add(mychart);
} else { JOptionPane.showMessageDialog(new JFrame(),"...select at least one parameter by clicking the first column in the table.","No parameters selected...",JOptionPane.INFORMATION_MESSAGE); }
}
/*******************************************************************************************************/ static public ParsedParameters ParseLogData(String response, Parameter[] parameterArray) { ParsedParameters returnObject = new ParsedParameters(); // LogData := <!--LogData antalDP antalPID dialog status LogDataListe null --> // LogDataListe := {tid epoch valueP0 valueP1 ... valueP9}* // tid := nultermineret streng // epoch := nultermineret streng, bruges ikke // Value0-9 := nultermineret streng, skal konverteres til float // antalDP := nultermineret streng, // antalPID := nultermineret streng, bruges ikke // dialog := nultermineret streng, besked der udskrives i dialog // status := nultermineret streng, besked der udskrives i status-felt // null := 0x00
int parameterTidIndex=0; char seperator = 0x00; antalDP = new String(response.substring(ptr, response.indexOf(seperator, ptr))); ptr +=(antalDP.length()+1); antalPID = new String(response.substring(ptr, response.indexOf(seperator, ptr))); ptr +=(antalPID.length()+1); returnObject.dialog = new String(response.substring(ptr, response.indexOf(seperator, ptr))); ptr +=(returnObject.dialog.length()+1); returnObject.status = new String(response.substring(ptr, response.indexOf(seperator, ptr))); ptr +=(returnObject.status.length()+1);
// sætter antal tidspunkter for alle parameter-objecter. // denne metode instantieres også arrays i objekterne til at have antal-tidspunkter-størrelse int int_antalDP = Integer.parseInt(antalDP); for(int paramCnt = 0; paramCnt< 10; paramCnt++) { if(parameterArray[paramCnt] != null) { parameterArray[paramCnt].SetNumberOfVals(int_antalDP); } }
// Der parses tidspunkt for tidspunkt // parsing: LogDataListe := {tid epoch valueP0 valueP1 ... valueP9}*
/*Der modtages et antal værdier(antalDP) for et antal parametre(antalPID) i en streng. Værdierne i strengen er adskilt af en seperator. Der skannes frem til næste seperator. Først hentes der tid og epoch. Herefter hentes der et antal værdier(antalDP).
Parametrene med værdier skal placeres i parameterArray på de rigtige steder. Eksempelvis kan der være 3 parametre med tilhørende data i inputStrengen, hvor den første parameter skal indsættes på plads 3 i parameterArray, den næste på plads 4 og den sidste på plads 8.
Hver gang en værdi hentes placeres den det rigtige sted. */ try {
// skan alle tidspunkter igennem
int intDP = Integer.parseInt(antalDP); while(response.charAt(ptr) != seperator) { // hent tid og epoch, dog bruges kun tid tid = new String(response.substring(ptr, response.indexOf(seperator, ptr))); ptr +=(tid.length()+1); epoch = new String(response.substring(ptr, response.indexOf(seperator, ptr))); ptr +=(epoch.length()+1);
// tidspunkt indsættes... if(Parameter.timeStrings != null) { Parameter.timeStrings[parameterTidIndex]=tid; }
// Der hentes alle værdier ud af strengen
for(int inputParameterValueCnt=0; inputParameterValueCnt < Integer.parseInt(antalPID); inputParameterValueCnt++) { String value = new String(); int index; index = response.indexOf(seperator, ptr); value = response.substring(ptr, index);
ptr += (value.length()+1);
ptr = ptr; // hvis der er plads gemmes input værdien i parameterArray for(int paramCnt=0;paramCnt < 10;paramCnt++) { if(parameterArray[paramCnt]!= null) { if(parameterArray[paramCnt].parameterFloats[parameterTidIndex] == null) { if(parameterTidIndex == 0) { try // hvis epoch tiden er for stor eller null indsættes 0 som default { Parameter.epochStart = Integer.parseInt(epoch); } catch(Exception exc){Parameter.epochStart = 0;} } else if(parameterTidIndex == (intDP-1)) { try // hvis epoch tiden er for stor eller null indsættes 0 som default { Parameter.epochStop = Integer.parseInt(epoch); } catch(Exception exc){Parameter.epochStop = 0;} } if(value.compareTo("nan") == 0) { parameterArray[paramCnt].parameterFloats[parameterTidIndex] = new Float(0); } else { float tempfloat = Float.parseFloat(value); Float tempFloat = new Float(tempfloat); parameterArray[paramCnt].parameterFloats[parameterTidIndex] = tempFloat; } break; } } } }
mySocket = new Socket(myIP,80); mySocket.setSoTimeout(10000);
hostOut = new BufferedWriter(new OutputStreamWriter(mySocket.getOutputStream(),"UTF-8")); hostIn = new InputStreamReader(mySocket.getInputStream(),"UTF-8");
hostOut.write(request); hostOut.flush();
int numberOfBytesToReadAhead = 1000; char[] c = new char[numberOfBytesToReadAhead];
jeg har fundet ud af at det er ikke nødvendigt at minimere og maksimere, Det er også tilstrækkeligt at trykke på at andet vindue. Eller at åbne og lukke en menu i browseren.
Hvilke kald bliver foretaget ved åben luk menu i browser, samt ved at fokusere på et andet vindue, og gå tilbage igen?
jeg har uden held prøvet at kalde følgende: this.invalidate(); this.validate(); this.validateTree(); this.setFocusable(false); this.setFocusable(true);
Jeg tror faktisk at jeg har en fejl i den klasse der danner dialog, hvor input hentes fra bruger, før der efterspørges data over net. Den ser ud som følger:
List parameterTypeList; //String parameterID=""; int ParameterTypeListIndex=-1; String buttonPressed=""; public ParameterSelecter(List parameterTypeList) {
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.