Попытка сфокусироваться на JTextPane после двойного щелчка по элементу JList (Java) - PullRequest
3 голосов
/ 03 мая 2010

Проблема:

У меня есть следующий JList, который я добавляю в textPane и показываю его при перемещении каретки. Однако после двойного щелчка по элементу Jlist текст вставляется, но курсор не отображается на JTextPane.

Это следующий код:

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();

Любая идея о том, как "расфокусировать" выделение в Jlist или , чтобы курсор вставился в JTextPane после вставки текста ?

Я уточню подробнее, если это не достаточно ясно. Пожалуйста, помогите, спасибо!

Ответы [ 2 ]

4 голосов
/ 03 мая 2010

Посмотрите и поиграйтесь с методами фокусировки в JComponent

В частности grabFocus и requestFocusInWindow

Что происходит, например, если вы добавите textPane.grabFocus() после textPane.moveCaretPosition(pos);?

0 голосов
/ 03 мая 2010

Хотя это не относится к вашей проблеме, вы можете попробовать Список действий , который пытается обработать этот тип запроса в более общем виде.

Edit:

Вот мой простой SSCCE, который показывает, что invokeLater не требуется:

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 );
 }
}
...