2016-10-09 2 views
1

MFormFormatter를 JFormattedTextField에 적용한 다음 해당 텍스트 필드를 JTable의 열로 설정하면 어디서나 나타납니다. . 그러나 셀에서 사용자가 클릭하는 위치에 관계없이 셀의 왼쪽 가장 자리에 캐럿을 표시하려고합니다. 나는 setCaretPositionMethod를 시도했지만 아무것도하지 않았다. 내 생각 엔 사용자가 클릭하는 곳으로 이동하도록 캐럿을 강제하는 일종의 테이블 수신기가있을 것입니다.이 수신기가 무엇인지 알았다면 기능을 무시할 수 있습니다.MaskFormatter가 적용된 후 왼쪽에 JTable 셀이 나타나게하는 방법

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

내가 구성 요소 이익 당신이 setCaretPosition(0) 메소드를 호출 할 수 초점을 맞출 때 올바르게 다음 형식의 텍스트 필드에 FocusListener를 추가 할 수 있습니다 기억하십시오.

그러나이 문은 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 -used-on? noredirect = 1 # comment67139496_39926784) – user217339

관련 문제