2009-04-02 38 views
13

Tôi đang sử dụng TableViewer với nhà cung cấp nội dung, nhà cung cấp nhãn, ICellModifierTextCellEditors cho mỗi cột.Sử dụng Eclipse TableViewer, làm cách nào để điều hướng và chỉnh sửa các ô bằng các phím mũi tên?

Làm cách nào để thêm điều hướng phím mũi tên và chỉnh sửa ô khi người dùng chọn ô? Tôi muốn điều này là một hành vi tự nhiên nhất có thể.

Sau khi xem một số ví dụ trực tuyến, có vẻ như là một cách cũ (với TableCursor) và cách mới (TableCursor không kết hợp với CellEditors ??).

Hiện tại, TableViewer của tôi không có con trỏ sẽ chỉ cuộn trong cột đầu tiên. Bảng SWT cơ bản đang hiển thị con trỏ là rỗng.

Có ví dụ hay về TableViewer sử dụng CellEditors và điều hướng di động qua bàn phím không?

Cảm ơn!

Trả lời

3

Tôi không biết nếu có một tốt ví dụ. Tôi sử dụng một cụm mã tùy chỉnh để có được những gì tôi sẽ coi là hành vi bảng cơ bản cho ứng dụng của tôi hoạt động trên đầu trang của TableViewer. (Lưu ý rằng chúng tôi vẫn đang nhắm mục tiêu 3.2.2 vào thời điểm này, như vậy có lẽ mọi thứ trở nên tốt hơn hoặc có sự thay đổi khác.) Một số điểm nổi bật:

  • tôi làm setCellEditors() trên TableViewer tôi.
  • Trên mỗi điều khiển của CellEditor, tôi thiết lập những gì tôi cho là phù hợp TraverseListener. Ví dụ, đối với các tế bào văn bản:

    cellEditor = new TextCellEditor(table, SWT.SINGLE | getAlignment()); 
    cellEditor.getControl().addTraverseListener(new TraverseListener() { 
        public void keyTraversed(TraverseEvent e) { 
         switch (e.detail) { 
         case SWT.TRAVERSE_TAB_NEXT: 
          // edit next column 
          e.doit = true; 
          e.detail = SWT.TRAVERSE_NONE; 
          break; 
    
         case SWT.TRAVERSE_TAB_PREVIOUS: 
          // edit previous column 
          e.doit = true; 
          e.detail = SWT.TRAVERSE_NONE; 
          break; 
    
         case SWT.TRAVERSE_ARROW_NEXT: 
          // Differentiate arrow right from down (they both produce the same traversal @*$&#%^) 
          if (e.keyCode == SWT.ARROW_DOWN) { 
           // edit same column next row 
           e.doit = true; 
           e.detail = SWT.TRAVERSE_NONE; 
          } 
          break; 
    
         case SWT.TRAVERSE_ARROW_PREVIOUS: 
          // Differentiate arrow left from up (they both produce the same traversal @*$&#%^) 
          if (e.keyCode == SWT.ARROW_UP) { 
           // edit same column previous row 
           e.doit = true; 
           e.detail = SWT.TRAVERSE_NONE; 
          } 
          break; 
         } 
        } 
    }); 
    

(cho các tế bào bảng thả xuống, tôi bắt trái và mũi tên bên phải thay vì lên và xuống.)

  • Tôi cũng thêm một TraverseListener để kiểm soát của TableViewer có công việc là bắt đầu chỉnh sửa ô nếu ai đó truy cập "trả lại" trong khi toàn bộ hàng được chọn.

    // This really just gets the traverse events for the TABLE itself. If there is an active cell editor, this doesn't see anything. 
    tableViewer.getControl().addTraverseListener(new TraverseListener() { 
        public void keyTraversed(TraverseEvent e) { 
         if (e.detail == SWT.TRAVERSE_RETURN) { 
          // edit first column of selected row 
         } 
        } 
    }); 
    
  • Bây giờ, cách chính xác để kiểm soát các biên tập là một câu chuyện khác. Trong trường hợp của tôi, toàn bộ TableViewer (và một biểu diễn của mỗi cột trong đó) được bao bọc lỏng lẻo trong một đối tượng tùy chỉnh với các phương thức để làm những gì các chú thích nói trên. Việc triển khai các phương thức đó cuối cùng kết thúc bằng cách gọi tableViewer.editElement() và sau đó kiểm tra tableViewer.isCellEditorActive() để xem liệu ô có thực sự chỉnh sửa hay không (vì vậy chúng tôi có thể chuyển sang ô có thể chỉnh sửa tiếp theo nếu không).

  • Tôi cũng thấy hữu ích khi có thể "từ bỏ chỉnh sửa" theo chương trình (ví dụ: khi tab ra khỏi ô cuối cùng trong một hàng).Thật không may là cách duy nhất tôi có thể đưa ra để làm điều đó là một hack khủng khiếp xác định để làm việc với phiên bản đặc biệt của tôi bằng cách spelunking qua nguồn cho những điều mà sẽ tạo ra những "tác dụng phụ" mong muốn:

    private void relinquishEditing() { 
         // OMG this is the only way I could find to relinquish editing without aborting. 
         tableViewer.refresh("some element you don't have", false); 
        } 
    

Xin lỗi tôi không thể đưa ra một đoạn mã hoàn chỉnh hơn, nhưng thực sự, tôi phải phát hành một dự án nhỏ toàn bộ nội dung và tôi không sẵn sàng làm điều đó ngay bây giờ. Hy vọng rằng điều này là đủ của một "khởi động" để giúp bạn đi.

0

tôi nhận nó làm việc dựa trên JFace Snippet này, nhưng tôi đã phải sao chép một vài lớp học có liên quan cũng:

  • org.eclipse.jface.snippets.viewers.TableCursor
  • org.eclipse.jface .snippets.viewers.CursorCellHighlighter
  • org.eclipse.jface.snippets.viewers.AbstractCellCursor

và tôi không nhớ chính xác nơi tôi tìm thấy họ. Nó cũng là một org.eclipse.swt.custom.TableCursor, nhưng tôi không thể làm điều đó.

0

Có một cái nhìn tại Example of enabling Editor Activation on a Double Click.

Các công cụ giữa các dòng [110-128] thêm một ColumnViewerEditorActivationStrategy và TableViewerEditor. Trong trường hợp của tôi, tôi muốn một nhấp chuột duy nhất để bắt đầu chỉnh sửa vì vậy tôi đã thay đổi dòng 115 từ: ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION thành ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION. Sau khi thêm điều này vào TableViewer của tôi, phím tab sẽ chuyển từ trường này sang trường khác với trình chỉnh sửa được bật.

2

Đây là những gì đã từng làm việc cho tôi:

TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(tableViewer,new FocusCellOwnerDrawHighlighter(tableViewer)); 
ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tableViewer) { 
    protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) { 
     return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL 
      || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION         
      || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) 
      || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC; 
     } 
}; 

tôi có thể điều hướng theo mọi hướng với tab trong khi chỉnh sửa, và mũi tên xung quanh khi không chế độ chỉnh sửa.

Các vấn đề liên quan