Avatar billede dresen Nybegynder
11. juni 2003 - 16:10 Der er 3 kommentarer og
1 løsning

Skift focus mellem textarea og popupmenu

Hej...

Jeg har endnu et spørgsmål omkring textareas og popups.

Jeg har lavet en gui, som indeholder et textarea hvortil det er tilføjet en popupmenu. Ideen er, at man skal indtaste tekst, og hvis der så er noget tekst registreret (i et binært træ) der passer med det netop indtastede, skal man præsenteres for de forslag der måtte være, i popupmenuen.

Det skal siges at det er keyevents, som får popupmenuen til at fremkomme. Jeg har haft et ønske om at brugeren skal bruge musen mindst muligt, og vil derfor gerne give mulighed for at styringen i videst muligt omfang ligger hos keyboardet.

Hvis der i træet er registreret billig og bisse
|
-> så skal begge forslag fremkomme når jeg skriver 'bi', men kun billig når jeg skriver 'bil'

Ovenstående har jeg fået til at virke, men for at man ikke skal afvise popmenuen ved brug af 'esc' hver gang den fremkommer, og det gør den jo både når man skriver 'bi' og 'bil', har jeg ændret fokus til textarea, efter popmenuen er fremkommet, i stil med nedenstående :

popup.show( area, pos.x, (pos.y + 16) );

area.requestFocus();

Her kommer vi så til mit egentlige spørgsmål. Er det muligt at ændre fokus tilbage til popupmenuen, f.eks. ved at have en tast (f.eks. KeyEvent.VK_F2) som udførte noget i stil med:

popup.requestFocus();

Så man på den måde kunne, trykke F2, og komme ind i popup-menuen og så accepterer med 'Enter' eller 'Space', jf. Javas L&F (C:\Documents and Settings\Kristoffer\Skrivebord\Shortcuts\Dokumentation java 2\api\index.html)

Har forsøgt ovenstående men uden held.
Avatar billede jword Nybegynder
12. juni 2003 - 17:25 #1
Hey

Jeg har en standard-classe jeg plejer at bruge til at tilføje actions (med genvejstaster) til en komponent.

import javax.swing.*;
import java.awt.event.*;

/**
* Class for simple encapsulation of some statements.
*/
public abstract class GuiAction extends AbstractAction {
   
    private JComponent parent;
   
    protected String ACTION_COMMAND;
   
    public GuiAction(JComponent parent, String name) {
        this(parent, name, null, "", null);
       
    }   
   
    public GuiAction(JComponent parent, String name, KeyStroke key, String describKey) {
       
        this(parent, name, key, describKey, null);
       
    }
   
    /** Example: new GuiAction(this, "Save...", someKeyStroke, "ctrl + s");
    */   
   
    public GuiAction(JComponent parent, String name, KeyStroke key, String describKey, Icon icon) {
           
        super(name, icon);
               
        this.parent = parent;
           
       
        ActionMap actionMap;
       
        if(parent != null) actionMap = parent.getActionMap();
        else actionMap = new ActionMap();
           
        InputMap inputMap;
       
        if(parent != null)inputMap = parent.getInputMap();
        else inputMap = new InputMap();   
       
       
        if(key != null) inputMap.put(key, getValue(NAME));

        actionMap.put(getValue(NAME), this);
                       
        ACTION_COMMAND = Mailsomething.getUniqeID() + name;
                       
        putValue(ACTION_COMMAND_KEY, ACTION_COMMAND);
       
        if(key != null) putValue(ACCELERATOR_KEY, describKey);
           
    }
   
    public abstract void actionPerformed(ActionEvent e);
   
   
}


I dit tilfælde kan en Action så se således ud:

class SkiftFokusAction extends GuiAction {

public SkiftFokusAction() {
super(textarea, "Skift fokus...", KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0), "f2");
}

public void actionPerformed(ActionEvent e) {
    popup.requestFocus();
}

}


Stig
Avatar billede _carsten Nybegynder
12. juni 2003 - 20:50 #2
Jeg ved ikke om du har fået det til at virke, ellers er der en løsning her.

NB: Læs lige mine kommentarer, inden du propper det ind !


Følgende metode skal ligge i din JFrame:
              public  java.awt.KeyEventDispatcher createKeyEventDispatcher(){

Tilføj følgende i constructoren på din JFrame:    keyBoard();


    // Metoden som viser din Popup (har lavet den, da jeg
    // er klar over hvordan du styrer det, og så er det
    // sandsynligvis nemmere for dig at bygge det ind i din kode)
    private void visMinPopup(){
        popup.show(area, pos.x, (pos.y + 16) );
    }   
   
    public void keyBoard() {
        java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().
                    addKeyEventDispatcher(createKeyEventDispatcher());
    } 
   

    // Nedenstående skal bare ligge i selve din JFrame
    // så skulle det virke !
    public  java.awt.KeyEventDispatcher createKeyEventDispatcher(){ 
        return new java.awt.KeyEventDispatcher(){
            public  boolean dispatchKeyEvent(java.awt.event.KeyEvent e){

                if(e.KEY_PRESSED == java.awt.event.KeyEvent.KEY_PRESSED
                                                    && e.getID() == 401){
                    if(e.getKeyCode() == java.awt.event.KeyEvent.VK_F2){
                          visMinPopup();
                          popup.requestFocus();
                          return false;
                    }
                        return false;    
                }
                return false;

            }
        };
    }
Avatar billede _carsten Nybegynder
12. juni 2003 - 20:53 #3
Følgende metode skal ligge i din JFrame:
              public  java.awt.KeyEventDispatcher createKeyEventDispatcher(){

MED DET MENER JEG SÅDAN SET BARE, AT DEN METODE SER DU LIDT LÆNGERE NEDE,
OVENSTÅENDE TEKST SKAL IKKE MED  !!!!!!!!!!!!!!!!!!!!111
Avatar billede dresen Nybegynder
24. juni 2003 - 16:37 #4
Undskyld den lange ventetid - skulle til eksamen og alt stod derfor stille.

Er lidt udbrændt lige nu, så jeg håber jeg kan stille spørgsmål igen, hvis jeg ikke kan få det til at virke, når jeg får set ordenligt på det.

Takker mange gange for jeres svar!!
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester