Avatar billede martinhrj Nybegynder
20. januar 2003 - 12:48 Der er 7 kommentarer og
1 løsning

FocusTraversalPolicy()

Jeg har altid brugt setNextFocusableComponent, når jeg skulle bestemme rækkefølgen på komponenternes fokus... men det må jeg jo ikke mere. Den er depricated pr. 1.4.

Nu forsøger jeg mig så med FocusTraversalPolicy... Jeg har lavet en klasse MyFocusTraversalPolicy, der implementerer FocusTraversalPolicy. Og så har jeg sat følgende linie ind i min GUI!

myTextfield.setFocusTraversalPolicy(new MyFocusTraversalPolicy());

I alle metoderne i MyFocusTraversalPolicy, har jeg indsat System.out.print's, men det virker ikke som om den bliver kaldt!

Mangler jeg at gøre noget?

På forhånd tak for hjælpen!
Avatar billede _carsten Nybegynder
20. januar 2003 - 17:30 #1
Da jeg i mine JTextfelter ofte lytter til tastetryk`(i nedenstående tilfælde
ENTER), er her én, af de modeller som jeg blandt andet anvender.

Ved ikke om du kan bruge det ?

Carsten



public class Test extends javax.swing.JFrame {
   
    public Test() {
        initComponents();
    }
   
    private void initComponents() {
        jTextField1 = new javax.swing.JTextField();
        jTextField1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                movetoField = jTextField3;
                fromField = jTextField1;
                moveto(evt);
            }
        });

        jTextField2 = new javax.swing.JTextField();
        jTextField2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                movetoField = jTextField1;
                fromField = jTextField12
                moveto(evt);
            }
        });

        jTextField3 = new javax.swing.JTextField();
        jTextField3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                movetoField = jTextField2;
                fromField = jTextField3;
                moveto(evt);
            }
        });

        getContentPane().setLayout(new java.awt.FlowLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jTextField1.setText("jTextField1");
        getContentPane().add(jTextField1);

        jTextField2.setText("jTextField2");
        getContentPane().add(jTextField2);

        jTextField3.setText("jTextField3");
        getContentPane().add(jTextField3);

        pack();
    }

    private void moveto(java.awt.event.ActionEvent evt) {
        if(java.awt.event.KeyEvent.VK_ENTER == 10){
            movetoField.requestFocus();
            movetoField.setBackground(new java.awt.Color(255,255,255));
            fromField.setBackground(new java.awt.Color(0,204,255));

        }
    }

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   

    public static void main(String args[]) {
        new Test().show();
    }
 

    private javax.swing.JTextField jTextField3;
    private javax.swing.JTextField jTextField2;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField movetoField;
    private javax.swing.JTextField fromField;
}
Avatar billede martinhrj Nybegynder
20. januar 2003 - 17:39 #2
Meget god idé. Men det er desværre ikke lige det, mit problem er. Jeg vil gerne kunne bestemme, hvilket textfield der får fokus når jeg trykker på tab. Det er for at undgå, at man bliver ledt rundt på alle buttons osv. når man bare vil videre til næste textfield. Og det er endnu ikke lykkedes mig at lytte på tab-knappen :(
Avatar billede _carsten Nybegynder
20. januar 2003 - 18:13 #3
Pudsigt, har selv samme problem - ser frem til løsningen på TAB problemet.

Carsten
Avatar billede _carsten Nybegynder
20. januar 2003 - 18:27 #4
Prøv lige den her, bryder TAB-rækkefølgen.
Når du står i 'area' flyttes til 'field1'

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

public class Test extends JFrame {

private JTextArea area;
private JTextField field, field1;
private Container contentPane;

public Test() {

setSize(300,300);

contentPane = getContentPane();

area = new JTextArea();
area.setLineWrap(true);


area.getInputMap().put(KeyStroke.getKeyStroke("TAB"), "none");
area.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent event) {
if( event.getKeyCode() == KeyEvent.VK_TAB )
field1.requestFocus();
}

});
contentPane.add(new JScrollPane(area), BorderLayout.CENTER);

field = new JTextField();
field1 = new JTextField();
contentPane.add(field, BorderLayout.SOUTH);
contentPane.add(field1, BorderLayout.NORTH);

}
}

class Test1 {

public static void main(String[] args) {

Test area = new Test();
area.show();
}
}
Avatar billede martinhrj Nybegynder
20. januar 2003 - 18:33 #5
Tja... det er lidt en snyder... Den holder ikke, hvis man vil tilbage i tab-rækkefølgen, og trykker Shift-Tab. Så ryger man også videre til field1. Så den duer desværre heller ikke :( Men bare kom med flere idéer hvis du får dem!
Avatar billede _carsten Nybegynder
21. januar 2003 - 22:39 #6
Prøv lige den her, det lugter måske lidt mere af det du søger !!

Carsten.

public class TabTest extends javax.swing.JFrame {
    public TabTest() {
        initComponents();
        keyBoard();
    }
   

    private void initComponents() {
        jTextField1 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jTextField2 = new javax.swing.JTextField();
        jButton2 = new javax.swing.JButton();
        jTextField3 = new javax.swing.JTextField();

        getContentPane().setLayout(new java.awt.FlowLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jTextField1.setText("jTextField1");
        getContentPane().add(jTextField1);

        jButton1.setText("jButton1");
        getContentPane().add(jButton1);

        jTextField2.setText("jTextField2");
        getContentPane().add(jTextField2);

        jButton2.setText("jButton2");
        getContentPane().add(jButton2);

        jTextField3.setText("jTextField3");
        getContentPane().add(jTextField3);

        pack();
    }
   

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
 
   
    public void keyBoard() {
        java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
        createKeyEventDispatcher());
        this.setBounds(100,100,400,300);
    } 
   
    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.getModifiers() == java.awt.event.KeyEvent.SHIFT_MASK &&
                        e.getKeyCode() == java.awt.event.KeyEvent.VK_TAB){
                           
                          System.out.println("SHIFT og TAB");
                         
                          // Kunne gøres smartere, det er test !
                          if (jTextField1.hasFocus())
                              jTextField3.grabFocus();
                          else if(jTextField2.hasFocus())
                              jTextField1.grabFocus();
                          else if(jTextField3.hasFocus())
                              jTextField2.grabFocus();
                          else
                              transferFocus();
                          return true;
                    }
                    else if(e.getKeyCode() == java.awt.event.KeyEvent.VK_TAB){
                     
                        System.out.println("Kun TAB");
                       
                        if (jTextField1.hasFocus())
                            jTextField2.requestFocus();
                        else if(jTextField2.hasFocus())
                            jTextField3.requestFocus();
                        else if(jTextField3.hasFocus())
                            jTextField1.requestFocus();
                        else
                            transferFocus();
                        return true;    
                    }
                }
            return false;
        }
        };
    }

   
    public static void main(String args[]) {
        new TabTest().show();
    }
   
   
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton1;
    private javax.swing.JTextField jTextField3;
    private javax.swing.JTextField jTextField2;
    private javax.swing.JTextField jTextField1;
}
Avatar billede martinhrj Nybegynder
22. januar 2003 - 09:51 #7
Tja... det begynder at lugte derhenad! Og hvis det virker, ser det da ud til at det kan bruges... Meeeen... kan det virkelig passe, at det ikke er muligt, at få focusTraversalPolicy til at virke! Hvis det skal gøres... så syntes jeg nu at det skal gøres ordentligt! Og klassen er jo lavet til det samme!

Men du får point for den kreative tankegang :) Så må vi jo håbe at jeg finder ud af det andet, på et andet tidspunkt ;)

Tak for hjælpen!
Avatar billede _carsten Nybegynder
22. januar 2003 - 11:31 #8
Helt enig, selvfølgelig kan focusTraversalPolicy komme til at virke og også løse opgaven, det kræver kun, man ved hvordan den fungerer.

Jeg lytter med, i håbet på du finder løsningen med focusTraversalPolicy !

PS. Erstat lige 'transferFocus()' med 'getFocusOwner().transferFocus()'
    så virker det bedre.
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