Astăzi lucram cu un widget Text (org.eclipse.swt.widgets.Text) și am avut nevoie să setez manual poziția caret-ului după un apel al metodei setText().
Am descoperit în Javadoc metoda getCaretPosition(), care returnează un int, însă API-ul nu oferă și o metodă setCaretPosition().
Căutând pe Internet soluții la problema mea, am găsit post-uri despre cum se poate muta caret-ul la sfârșitul textului, folosind metoda setSelection(int start):
textWidget.setSelection(textWidget.getText().length());
unde textWidget este o instanță a clasei Text.
Pentru mai multe detalii, vezi post-ul de pe StackOverflow.
De asemenea, API-ul ofera o variantă overloaded a metodei setSelection(int start), sub forma setSelection(int start, int end), indecșii start și end corespunzând poziției caret-ului.
Astfel, am scris următoarea soluție:
int caretPosition = textWidget.getCaretPosition();
textWidget.setText( newValue );
textWidget.setSelection( caretPosition, caretPosition );
Prin acest truc am setat poziția caret-ului la valoarea anterioară apelului metodei setText(), stabilind o selecție vidă.
Încă nu mi-e clar dacă simplul fapt că am fost nevoit să resetez manual poziția caret-ului indică un design defectuos sau nu, dar sper să revin cu un răspuns.
Friday, November 14, 2014
Tuesday, October 21, 2014
Ștergerea elementelor unei liste în timpul iterării
Începând cu Java
1.5, avem la dispoziție forma for-each
a clasicului ciclu for. Aceasta ne
ajută să iterăm rapid o colecție, astfel:
for (String
element : list) {
System.out.println(element);
}
unde variabila
list a fost declarată și inițializată astfel:
List<String> list = new ArrayList<>() { {
add("Luni");
add("Marti");
add("Miercuri");
add("Party");
add("Joi");
add("Vineri");
}
};
ACTUALIZARE: Se pare că varianta aceasta de adăugare a elementelor e un anti-pattern, deci nu e bine să o folosim. Detalii aici:
http://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/
O problemă
devenită deja clasică este ștergerea de elemente în timpul iterării. Dacă în
interiorul ciclului for scriem ceva
de genul:
for (String
element : list) {
if (element.equals("Party")) {
list.remove(element);
}
}
se aruncă la runtime o excepție java.util.ConcurrentModificationException.
Nu putem folosi
forma for-each a ciclului for pentru a șterge elemente în timpul
iterării, dar avem la dispoziție interfața java.util.Iterator, care expune
metoda remove(). Aceasta se dovedește
a fi exact ce avem nevoie:
for
(Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
if (iterator.next().equals("Party")) {
iterator.remove();
}
}
Metoda remove() șterge ultimul element returnat
de metoda next(), declarată în interfața Iterator.
Totuși, trebuie să ținem cont de faptul că această operație este opțională, după
cum se menționează în Javadoc. În concluzie, atunci când folosim iteratori
putem atât să iterăm colecția, cât și să ștergem elementele acesteia.
Monday, October 20, 2014
Adăugarea rapidă a unor elemente într-o listă nouă
Am întâlnit unele situații în care am avut nevoie rapid de o listă
(java.util.List) căreia să-i adaug, la fel de rapid, câteva elemente. Primul
lucru ce îmi venea în minte era să creez o astfel de listă, căreia să-i adaug
apoi, rând pe rând elemente, apelând metoda add() astfel:
List<String> list = new ArrayList<>();
list.add("Luni");
list.add("Marti");
list.add("Miercuri");
list.add("Joi");
list.add("Vineri");
O modalitate destul
de enervantă și ineficientă, nu?
La un moment dat
însă, am găsit o variantă ceva mai elegantă, care se folosește de clase
interne, anonime:
List<String> list = new ArrayList<>() { {
add("Luni");
add("Marti");
add("Miercuri");
add("Joi");
add("Vineri");
}
};
ACTUALIZARE: Se pare că varianta aceasta e un anti-pattern, deci nu e bine să o folosim. Detalii aici:
http://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/
ACTUALIZARE: Se pare că varianta aceasta e un anti-pattern, deci nu e bine să o folosim. Detalii aici:
http://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/
În plus, un coleg
de muncă mi-a atras atenția că există o variantă și mai rapidă:
List<String> list = Arrays.asList( "Luni", "Marti", "Miercuri",
"Joi", "Vineri");
Acest ultim
exemplu este discutat pe StackOverflow, la următoarea adresă:
Răspunsul
acceptat menționează, de asemenea, și faptul că această modalitate nu permite
adăugarea de noi elemente acelei liste, întrucât este ”fixed-size”, după cum
spune și documentația:
Friday, March 7, 2014
Decizii
Deschizi încet o ușă,
Ea scârțâie ușor.
Pe mân-ai o mănușă.
Urmezi un coridor.
Ridici și-aprinzi o torță,
Poteca se desparte.
Picioarele n-au forță,
Cu gândul ești departe.
În piept simți un răsunet,
O voce cum te cheamă.
Ai vrea să-i poți răspunde,
Ai vrea, dar 'ți-este teamă.
Ea scârțâie ușor.
Pe mân-ai o mănușă.
Urmezi un coridor.
Ridici și-aprinzi o torță,
Poteca se desparte.
Picioarele n-au forță,
Cu gândul ești departe.
În piept simți un răsunet,
O voce cum te cheamă.
Ai vrea să-i poți răspunde,
Ai vrea, dar 'ți-este teamă.
Thursday, March 6, 2014
Dincolo de perdea
Dincolo de perdea un țipăt se-aude,
Dincolo de perdea sunt lucruri mărunte.
Dincolo de perdea sunt ferestrele ude,
Dincolo de perdea vrei apa să se zvânte.
Dincolo de perdea ai gânduri profunde,
Dincolo de perdea rugina pătrunde.
Dincolo de perdea lumina surâde,
Dincolo de perdea, nu te mai ascunde.
Dincolo de perdea sunt lucruri mărunte.
Dincolo de perdea sunt ferestrele ude,
Dincolo de perdea vrei apa să se zvânte.
Dincolo de perdea ai gânduri profunde,
Dincolo de perdea rugina pătrunde.
Dincolo de perdea lumina surâde,
Dincolo de perdea, nu te mai ascunde.
Subscribe to:
Posts (Atom)