2010-05-03 12 views
3

Problème:Essayer de se concentrer sur JTextPane après sur l'élément JList doubleclicking (Java)

je l'JList suivante que j'ajouter à la textPane, et le montrer sur le caret en mouvement. Cependant, après un double-clic sur l'élément Jlist, le texte est inséré, mais le curseur n'apparaît pas dans le JTextPane.

Voici le code suivant:

listForSuggestion = new JList(str.toArray()); 
     listForSuggestion.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     listForSuggestion.setSelectedIndex(0); 
     listForSuggestion.setVisibleRowCount(visibleRowCount); 
     listScrollPane = new JScrollPane(listForSuggestion); 
     MouseListener mouseListener = new MouseAdapter() { 

      @Override 
      public void mouseClicked(MouseEvent mouseEvent) { 
       JList theList = (JList) mouseEvent.getSource(); 
       if (mouseEvent.getClickCount() == 2) { 
        int index = theList.locationToIndex(mouseEvent.getPoint()); 
        if (index >= 0) { 
         Object o = theList.getModel().getElementAt(index); 
         //System.out.println("Double-clicked on: " + o.toString()); 
         //Set the double clicked text to appear on textPane 
         String completion = o.toString(); 
         int num= textPane.getCaretPosition(); 
         textPane.select(num, num); 
         textPane.replaceSelection(completion); 
         textPane.setCaretPosition(num + completion.length()); 
         int pos = textPane.getSelectionEnd(); 
         textPane.select(pos, pos); 
         textPane.replaceSelection(""); 
         textPane.setCaretPosition(pos); 
         textPane.moveCaretPosition(pos); 
        } 
       } 
       theList.clearSelection(); 

Toute idée sur la façon de « de mise au point » la sélection sur la JList ou faire le caret apparaissent sur le JTextPane après l'insertion de texte?

Je vais élaborer plus si ce n'est pas assez clair. S'il vous plaît, aidez, merci!

Répondre

3

Jetez un oeil et jouer avec le focus-méthodes JComponent

Plus précisément grabFocus et requestFocusInWindow

Que se passe-par exemple, si vous ajoutez textPane.grabFocus() après textPane.moveCaretPosition(pos);?

+0

@aioobe: Hmm. D'abord essayer cela a fonctionné. Ensuite, je double à nouveau la liste, et après le texte apparaît sur le panneau de texte, pas plus de Caret. Pourquoi est-ce si bizarre? –

+0

J'ai remarqué qu'après avoir double-cliqué sur la deuxième fois, la mise au point se fait sur le 'JToolBar' (un des boutons). Que devrais-je faire? –

+2

Essayez d'inclure le grabfocus dans un SwingUtilities.invokeLater. – aioobe

0

Bien que n'étant pas lié à votre problème, vous voudrez peut-être consulter le List Action, qui tente de gérer ce type de demande d'une manière plus générale.

Edit:

Voici mon simple, SSCCE qui montre invokeLater n'est pas nécessaire:

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

public class ListActionTest 
{ 
public static void main(String[] args) 
    throws Exception 
{ 
    final JTextField textField = new JTextField(); 

    Action displayAction = new AbstractAction() 
    { 
    public void actionPerformed(ActionEvent e) 
    { 
    JList list = (JList)e.getSource(); 
    System.out.println(list.getSelectedValue()); 
    textField.setText(list.getSelectedValue().toString()); 
    textField.requestFocusInWindow(); 
    } 
    }; 

    String[] data = { "zero", "one", "two", "three", "four", "five" }; 
    JList list = new JList(data); 

    ListAction la = new ListAction(list, displayAction); 

    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(new JScrollPane(list)); 
    frame.add(textField, BorderLayout.SOUTH); 
    frame.setSize(400, 100); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 
} 
+0

@camickr: Merci pour le lien. Très apprécié. Edit: ... et wow, c'est plutôt bien. –

+0

Hmm cela marche-t-il de pair avec un autre InputMap comme j'en ai un qui est utilisé pour UndoAction et RedoAction (tiré de l'exemple de Sun)? Si vous n'ajoutez pas la même clé et l'action à la fois, ça devrait aller bien non? –

+0

Tant que KeyStroke est différent, cela devrait fonctionner. Cependant, dans ce cas, cela ne devrait même pas être un problème, car cela ajoute une liaison à JList et je devine que votre Undo/Redo est lié au volet texte, donc ce sont deux cartes d'entrée complètement différentes. Chaque composant a sa propre carte d'entrée. – camickr