2016-10-09 1 views
1

После применения MaskFormatter на JFormattedTextField, затем, установив это текстовое поле в столбец в JTable, карет начал появляться везде, где я нажимаю , Однако я хочу, чтобы каретка отображалась в левой части ячейки, независимо от того, где в ячейке пользователь нажимает. Я попробовал setCaretPositionMethod, но ничего не сделал. Я предполагаю, что есть какой-то прослушиватель таблицы, который заставляет каретку перемещаться туда, где пользователь нажимает, если бы я знал, что это за слушатель, я мог бы переопределить эту функцию.Как заставить Caret в JTable-ячейке появиться слева после того, как к нему был применен MaskFormatter

SSCCE:

public class TableExample extends JFrame { 
    public TableExample() { 
     add(makeTable()); 
    } 

    private JTable makeTable() { 
     Object[][] tableData = {{"","a","b",""}, {"","c","d",""}}; 
     String[] columns = {"column1", "column2", "column3", "dobColumn"}; 
     JTable table = new JTable(tableData, columns); 

     ////DOB column formats to dd/mm/yy 
     TableColumn dobColumn = table.getColumnModel().getColumn(3); 
     DateFormat df = new SimpleDateFormat("dd/mm/yy"); 
     JFormattedTextField tf = new JFormattedTextField(df); 
     tf.setColumns(8); 
     try { 
      MaskFormatter dobMask = new MaskFormatter("##/##/##"); 
      dobMask.setPlaceholderCharacter('0'); 
      dobMask.install(tf); 
     } catch (ParseException ex) { 
      Logger.getLogger(TableExample.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     ////Does nothing 
     tf.setCaretPoisition(0); 

     dobColumn.setCellEditor(new DefaultCellEditor(tf)); 

     return table; 
    } 

    public static void main(String[] args) { 
     JFrame frame = new TableExample(); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 
} 

ответ

3

Если я правильно помню, вы можете добавить FocusListener в отформатированный текстовое поле, а затем, когда компонент фокус вы можете вызвать метод setCaretPosition(0).

Однако этот оператор должен быть обернут в SwingUtilities.invokeLater(...), чтобы убедиться, что код выполнен после позиционирования по умолчанию в форматированном текстовом поле.

Другой вариант - переопределить метод JTable isCellEditable(...). Однако этот подход повлияет на весь редактор в таблице.

Вот пример кода, который показывает, как «выбрать» текст, когда редактор вызывается:

public boolean editCellAt(int row, int column, EventObject e) 
{ 
    boolean result = super.editCellAt(row, column, e); 
    final Component editor = getEditorComponent(); 

    if (editor != null && editor instanceof JTextComponent) 
    { 
     ((JTextComponent)editor).selectAll(); 

     if (e == null) 
     { 
      ((JTextComponent)editor).selectAll(); 
     } 
     else if (e instanceof MouseEvent) 
     { 
      SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        ((JTextComponent)editor).selectAll(); 
       } 
      }); 
     } 

    } 

    return result; 
} 
+0

Спасибо, добавив фокус слушателя сделал именно то, что я хотел. Также по какой-то причине применение маски к столбцу в JTable будет применяться только к первой ячейке, которую я нажимаю в столбце. После этого маска уничтожается, я исправил эту проблему, воссоздав маску и прослушиватель фокуса внутри метода tableChanged(). Я задал вопрос о проблеме [здесь] (http://stackoverflow.com/questions/39926784/applying-a-maskformatter-to-a-column-in-my-jtable-but-the-mask-is-only -подержанные-на? noredirect = 1 # comment67139496_39926784) – user217339

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