Foco na caixa de texto de um JFileChooser

10 respostas
W

Alguém sabe como deixar o foco em um JFileChooser na caixa de texto que recebe o nome do arquivo?
Já tentei encontrar o JTextField da JFileChooser através de vários for’s pelo método getComponents() mas nada :frowning:
requestFocus(), grabFocus(), e nada.

Se alguém souber como me ajude por favor, agradeço desde já.

10 Respostas

W

ninguém ? to precisando disso quem souber ajuda por favor.

C

dá pra fazer isso através de reflexão

C

Na verdade nem sei se precisa de reflexão, a questão principal é usar recursividade pra entrar nos componentes que estao contidos em outros componentes.

W

já tentei isso mas não acho o tal do JTextField de jeito nenhum, acho JPanels, JComboBoxes mas nada dele.

C

Exatamente. O text field está dentro de um JPanel.

C

Minha solução para o seu problema:

/**
     * Finds the components that are instance of aclass contained in the Container c.
     * @param aclass   the class of the component to find.
     * @param c        the Container component where to search.
     * @param returnList  the list where found components will be added.
     */
    public static <T> void findComponents(final Class<T> aclass, final Container c, final List<T> returnList) {
        final Component[] components = c.getComponents();
        for (Component x : components) {
            // Tests if x is instance of aclass.
            if (aclass.isInstance(x)) {
                returnList.add((T)x);
            }
            // JComponents are containers.
            if (x instanceof Container) {
                findComponents(aclass, (Container) x, returnList);
            }
        }
    }
C

Exemplo de uso:

public static void main(String[] args) { JFileChooser fc = new JFileChooser(); List<JTextField> list = new LinkedList<JTextField>(); findComponents(JTextField.class, fc, list); list.get(0).setEditable(false); System.out.println(list); int opt = fc.showOpenDialog(null); System.out.println("selected option: "+opt); }

W

Cara realmente consegui, valeu mesmo!
Olha o que eu fiz:

final List<JTextField> list = new LinkedList<JTextField>();
        findComponents(JTextField.class, fileChooser, list);

        SwingUtilities.invokeLater(new Runnable() {
           public void run() {
               try {
                   Thread.sleep(100);
               } catch(Exception e) {}
               list.get(0).requestFocus();
           }
        });

        int option = fileChooser.showDialog(NotepadFrame.this, "Salvar");

Aparentemente mesmo com a referência do JTextField na lista retornada por aquele método que busta o JTextField, eu não consigo requisitar o foco do componente sem ele estar presente na tela, por isso precisava de uma forma de requisitar esse foco depois que o JFileChooser aparece, o único modo que pude pensar foi lançando uma thread da GUI que executaria por volta de 100 milissegundos depois.
Não sei se esta forma que fiz foi a mais adequada mais funcionou. =)

C

Você está chamando o JFileChooser a partir daonde?

Eu quando abro um JFileChooser já vejo o foco no JTextField.

Não acho uma boa idéia criar uma Thread para isso… Deve haver uma forma menos gambiarrosa.

W

O JFileChooser está como uma variável de instância do meu objeto.
Então também pensei isso é muita gambiarra, mas se você está falando que já aparece o foco direto no seu vou tentar aqui novamente!

Criado 27 de março de 2010
Ultima resposta 30 de mar. de 2010
Respostas 10
Participantes 2