2013-09-26 2 views
2

Я пытаюсь реализовать JTable, который должен соблюдать следующие правила: клеткиJTextField.selectAll() работает странно

  1. только в 3'rd колонке может быть отредактирована.
  2. При двойном нажатии любой ячейки в строке X начинается 3-й столбец строки X.
  3. Всякий раз, когда вы начинаете редактировать ячейку, будет выбран текст внутри нее.

У меня есть FileTable, который расширяет JTable. В его конструктору У меня есть эти строки:

getColumnModel().getColumn(2).setCellEditor(new FileTableCellEditor()); 

addMouseListener(new MouseAdapter(){ 
     public void mouseClicked(MouseEvent e){ 
      if (e.getClickCount() == 2){ 
       int row = rowAtPoint(e.getPoint()); 
       editCellAt(row, 2); 
      } 
     } 
    }); 

Мой FileTableCell редактор выглядит следующим образом:

public class FileTableCellEditor extends DefaultCellEditor { 

public FileTableCellEditor() { 
    super(new JTextField()); 
} 

@Override 
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
    final JTextField ec = (JTextField) editorComponent;  
    String textValue = (String)value;  
    ec.setText(textValue);  
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      ec.selectAll(); 
     } 
    });  

    return editorComponent; 
} 
} 

Моя проблема, когда я дважды щелкните на ячейке, которая не из колонки 3'rd, The текст, отредактированный на 3-м столбцах, не выделяется как выделенный текст.

picture http://www.nispahit.com/stack/tableNotHighlight.png

Это очень странно для меня, потому что я знаю, что текст является выбран. Когда я пишу что-то, он удаляет текст, который был в этой ячейке раньше. Это просто не то, что выбрано. Как ни странно, когда я дважды щелкаю по ячейке 3-й колонки, она делает выделите выделение.

picture http://www.nispahit.com/stack/tableHighlight.png

Может кто-нибудь налить свет?

Спасибо!

+0

Для лучшей помощи попробуйте опубликовать [SSCCE] (http://www.sscce.org) – nachokk

+0

Второй момент не ясен, хотя, как вы читаете больше (до момента, когда код действительно), только тогда вы осознаете , что на самом деле должно произойти в точке номер 2 :-) +1 для красиво отредактированного вопроса. –

+0

Так что, кажется, имеет значение, выбрана ли ячейка - попробуйте выбрать ячейку перед началом редактирования. – Holger

ответ

2

Ваш JTextField не выделяет выбор, потому что он не сфокусирован. Просто добавьте ec.requestFocus(); сразу после ec.selectAll();. Затем он работает так, как ожидалось.

Объяснение: Когда вы нажимаете на редактируемый столбец, Swing начнет редактирование ячеек (независимо от вашего прослушивателя с двойным щелчком) и перенаправляет инициирующее событие на компонент. Таким образом, JTextField получает щелчок и запрашивает фокус. Когда вы нажимаете на другой столбец, только ваш MouseListener инициирует редактирование ячейки, и событие не будет перенаправлено. (Пересылка события никоим образом не поможет, так как щелчок находится за пределами текстового поля.) Таким образом, вы должны запросить фокус вручную.

+0

Работал отлично! Спасибо! – user1028741

Смежные вопросы