Šta je novo?

JTextField, Listener

Nuclear

Slavan
Učlanjen(a)
14.11.2006
Poruke
949
Poena
320
поздрав свима. пошто немам идеје како да решим следећи проблем, реших да вам се обратим.

имам одређени JTextField (мада сам размишљао и о JTextArea). додао сам му KeyListener, који реагује на сваки укуцан карактер.

е сад, имам вектор стрингова. циљ ми је да направим ефекат, да када ја укуцам нпр слово а, програм претражи тај вектор, и у тај текстфилд испише прву вредност из вектора која почиње тим карактером. то сам донекле успео, међутим проблем ми прави чињеница да се прво извршава листенер, а затим се исписује карактер који сам унео па ми је резултат:

(рецимо да имам стринг АБА, а укуцам А)
АБАА

то слово је на крају вишак. постоји ли могућност да заобиђем овај проблем?
 
Ubaci u textfield vrednost stringa bez poslednjeg char-a? 🙂

Kod:
String val; // ta vrednost koji su pokupio iz niza
String str;

len = val.length();;
str = val.substring(0, len-1);
textfield.SetText(str);

Nemam pojma JAVU, tako da se ograđujem od sintaksnih grešaka. 🙂
 
Poslednja izmena:
размишљао сам о томе, али опет би то додавало последњи карактер (тј онај који ја укуцам на тастатури).

имам у коду:

field.addKeyListener(this);

твој пример би радио само у том конкретном (или кад је укуцан карактер једнак последњем), међутим мени треба да се обрне редослед акције 🙂

а класа ми implements KeyListener, тако да шта год урадим, додаће ми слово које сам укуцао на крају.
не знам да ли постоји други начин за ово?

можда сам лоше објаснио, дакле оно што ја куцам на тастатури да иде прво, а после текст који је пронађен.
 
Poslednja izmena:
Verovatno se listener izvrsi pre upisivanja karaktera da bi ti mogao da kontrolises unos. Listener ima keyTyped(KeyEvent), keyPressed(KeyEvent), keyReleased(KeyEvent). Na koji si reagovao i kako?
 
ево оставићу овде најбитније:

public void keyTyped(KeyEvent ke)
{
char c=ke.getKeyChar();
//... pretraga vektora za stringom...//

field.setText(pronadjenString);
}

имам ту још неке провере али небитне за поенту. keypressed, keyreleased нисам користио, пошто ми је keyTyped деловао као најупотребљивији.
 
Poslednja izmena:
ево оставићу овде најбитније:

public void keyTyped(KeyEvent ke)
{
char c=ke.getKeyChar();
//... pretraga vektora za stringom...//

field.setText(pronadjenString);
}

имам ту још неке провере али небитне за поенту. keytyped, keyreleased нисам користио, пошто ми је keyTyped деловао као најупотребљивији.

probaj da prebacis na keyreleased.
 
привремено сам решио проблем одсецањем првог слова у нађеном стрингу, и затим постављања Caret-a (курсора), на нулту позицију... накарадно је, надам се да ћу наћи боље решење.
 
KeyReleased radi posao. Evo sad sam probao. Zaista cudno, i ja bih intuitivno radio sa keyTyped...

Kod:
 private void wordFieldKeyReleased(java.awt.event.KeyEvent evt) {
        String s = wordField.getText();
        for (int i = 0; i < prevStrings.size(); ++i) {
            if (checkStrings(prevStrings.get(i), s)) {
                wordField.setText(prevStrings.get(i));
                wordField.select(s.length(), prevStrings.get(i).length());
                return;
            }
        }
    }

Radi i select dodatog dela stringa, tako da izgleda bas profi 🙂
prevStrings je vektor koji sadrzi predhodne stringove.
 
Poslednja izmena:
nije cudno sta vise logicno je. listener na key pressed, radi na pritisak dugmeta, a textbox ce odstampati teks tek kada se pusti dugme.
 
A zasto onda kada samo drzis neki taster on stampa karaktere iako ni jednom nisi pustio taster ?
Meni je i dalje logicno da se znak pojavljuje kada pritisnes taster, ali to nije ni malo bitno posto svi moramo da radimo onako kako su ovi iz sun-a zamislili 🙂
 
Ja pricam za javu u ovom konkretnom slucaju. Kada stisne taster, triger ce listener, odradice sta treba, i tek onda dolazi na red stampanje karaktera.
 
KeyReleased radi posao. Evo sad sam probao. Zaista cudno, i ja bih intuitivno radio sa keyTyped...

Kod:
 private void wordFieldKeyReleased(java.awt.event.KeyEvent evt) {
        String s = wordField.getText();
        for (int i = 0; i < prevStrings.size(); ++i) {
            if (checkStrings(prevStrings.get(i), s)) {
                wordField.setText(prevStrings.get(i));
                wordField.select(s.length(), prevStrings.get(i).length());
                return;
            }
        }
    }


Radi i select dodatog dela stringa, tako da izgleda bas profi 🙂
prevStrings je vektor koji sadrzi predhodne stringove.

одличан код, мало сам га прилагодио својим потребама, али сам се одушевио сам овим select 🙂
пуно хвала, мислим да ће ми ово помоћи!
 
Dosta bolje rešenje ti je da napraviš document filter.

Kod:
TvojFilter extends DocumentFilter

U klasi TvojFilter overrideuješ potrebne metode (insertString, replace - pogledaj JavaDoc, biće ti jasno)...

Zatim, JTextField-u dodeliš TvojFilter...

Kod:
((AbstractDocument) tvojField.getDocument()).setDocumentFilter(new TvojFilter());

U overrideovanim metodama ćeš smestiti logiku koja će se aktivirati kada se menja sadržaj field-a... Rešenje je bolje jer se koristi "predviđeni" mehanizam za menjanje dokumenta, tj. modela u okviru MVC.
 
Nazad
Vrh Dno