2013-04-20 56 views
5

Tôi nghĩ rằng thành phần JTable nên thực hiện tốt hơn công việc lọc các khóa sẽ bắt đầu chỉnh sửa. Ý tôi là, với việc thực hiện hiện tại, nếu bạn gõ DEL, Ctrl + Shift + DEL, F5, F7, ví dụ, trong một ô có thể chỉnh sửa, trình soạn thảo ô sẽ xuất hiện. Theo tôi, bắt đầu một trình soạn thảo ô với các phím như thế này là rất không trực quan đối với người dùng cuối.Bắt đầu chỉnh sửa trong ô JTable chỉ với các khóa hợp lý

Ngoài ra, còn có một vấn đề khác: JTable không biết về các ràng buộc khóa có thể khác được xác định trong biểu mẫu. Nếu bạn có một ràng buộc phím Ctrl + Shift + C được xác định cho một nút trên biểu mẫu của bạn, nếu bạn gõ tổ hợp phím này trong JTable của bạn, bảng sẽ bắt đầu chỉnh sửa và họ hành động ràng buộc phím nút của bạn sẽ được gọi tiếp theo. Tôi nghĩ rằng nên có một cách dễ dàng để ngăn chặn điều này thay vì vô hiệu hóa tất cả những ràng buộc khóa đã được xác định trong bản đồ ràng buộc khóa bảng của bạn.

Có một số thành phần của bên thứ ba đã được giải quyết, ít nhất một phần, một số vấn đề này, đặc biệt là bắt đầu chỉnh sửa bằng khóa hợp lý không? Tôi không muốn tự mình lọc hết.

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn bạn.

Marcos

CẬP NHẬT

Đối với thời điểm hiện tại tôi đang sử dụng đánh giá cao không hoàn hảo "giải pháp" này, ít nhất làm cho mọi thứ ít tồi tệ hơn cho thời điểm này. Cải tiến, ý kiến ​​và đề xuất được đánh giá cao.

@Override 
    public boolean isCellEditable(EventObject e) 
    { 
     if (e instanceof MouseEvent) 
     { 
      return ((MouseEvent) e).getClickCount() >= 
       _delegate.getMouseClickCountToStartEditing(); 
     } 
     else if (e instanceof KeyEvent) 
     { 
      KeyEvent event = (KeyEvent) e; 

      int key = event.getKeyCode(); 
      if ((key >= KeyEvent.VK_F1 && key <= KeyEvent.VK_F12) && 
       KeyStroke.getKeyStrokeForEvent(event) != _startEditingKey) 
      { 
       return false; 
      } 

      int ctrlAlt = KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK; 
      if ((event.getModifiersEx() & ctrlAlt) == ctrlAlt) 
      { 
       return true; 
      } 

      if ((event.getModifiersEx() & ctrlAlt) != 0) 
      { 
       return false; 
      } 

      return true; 
     } 
     else 
     { 
      // Is this else really needed? Are there other events types 
      // other than mouse and key events? 
      return true; 
     } 
    } 

    // _startEditingKey is obtained with this method 
    private KeyStroke getStartEditingKey() 
    { 
     InputMap bindings = TheTable.this.getInputMap(
      JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
     for (KeyStroke key : bindings.allKeys()) 
     { 
      Object binding = bindings.get(key); 
      if ("startEditing".equals(binding)) 
      { 
       return KeyStroke.getKeyStroke(
        key.getKeyCode(), key.getModifiers(), true); 
      } 
     } 
     return null; 
    } 
+0

Vui lòng chỉnh sửa câu hỏi của bạn để bao gồm [sscce] (http://sscce.org/) hiển thị vấn đề cụ thể bạn đang gặp phải. – trashgod

+0

Xin lỗi. Tôi nghĩ rằng một sscce là vô dụng trong trường hợp này. Vấn đề đã được mô tả rõ ràng bởi văn bản của tôi. – Marcos

Trả lời

1

Bạn có thể ràng buộc một phím bất kỳ mong muốn hành động của bảng startEditing, như herehere. Bạn có thể tắt các phím không mong muốn, như được hiển thị here. Một số sắc thái bổ sung được hiển thị here và bài viết trích dẫn here bởi @camickr.

+0

Vấn đề, như tôi đã nói, là danh sách các phím không mong muốn để vô hiệu hóa là rất lớn. Tôi đang nghĩ đến việc tạo ra một JTextField giả vô hình chứa đầy 5 ký tự và gửi sự kiện quan trọng trong phương thức _editCellAt_ (overriden) đến nó. Nếu văn bản trường giả thay đổi, đó là một khóa hợp lệ, có thể chỉnh sửa. Nếu nó không thay đổi, nó không phải là một khóa hợp lệ, vì vậy tôi trả về _false_ từ phương thức _editCellAt_. Bạn nghĩ sao? – Marcos

+0

@Marcos có gì sai với F2 được triển khai trong API JTable, nếu không thay đổi đó – mKorbel

+0

@mKorbel Tôi không phàn nàn về khóa F2. Tôi chỉ phàn nàn về các phím khác. Phím F2 sẽ tiếp tục được phép bắt đầu chỉnh sửa. – Marcos

4

Bạn có thể thực hiện một trình soạn thảo tùy chỉnh mà báo cáo không phải là có thể chỉnh sửa nếu keyEvent có bổ bạn muốn bỏ qua:

DefaultCellEditor editor = new DefaultCellEditor(new JTextField()) { 

    @Override 
    public boolean isCellEditable(EventObject e) { 
     if (e instanceof KeyEvent) { 
      return startWithKeyEvent((KeyEvent) e); 
     } 
     return super.isCellEditable(e); 
    } 

    private boolean startWithKeyEvent(KeyEvent e) { 
     // check modifiers as needed, this here is just a quick example ;-) 
     if ((e.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) != 0) { 
      return false; 
     }  
     // check for a list of function key strokes 
     if (excludes.contains(KeyStroke.getKeyStrokeForEvent(e)) { 
      return false; 
     } 
     return true; 
    } 

}; 
JTable table = new JTable(new AncientSwingTeam()); 
table.setDefaultEditor(Object.class, editor); 

Edit: cho một lọc đáng tin cậy hơn mà có thể xử lý các kết hợp ctrl-alt một cách chính xác, bạn có thể có một cái nhìn về DefaultEditorKit.DefaultKeyTypedAction: trong khi cơ bản ủy nhiệm cho một phương thức ẩn trong SunToolkit và xử lý keyTyped (so với keyPressed cần thiết để lọc các sự kiện là các ứng cử viên có thể in cho một ký tự có thể in hợp lệ sau khi bắt đầu chỉnh sửa) cung cấp cho bạn một ý tưởng làm thế nào để làm điều đó (nguồn của suntoolkit có lẽ hầu hết có sẵn trong openjdk, không tìm kiếm thứ ,, mặc dù)

+0

May mắn là tôi sử dụng các trình soạn thảo ô tùy chỉnh cho tất cả các cột trong bảng của tôi. Nhưng tôi nghĩ rằng tôi không cần phải dùng đến họ để giải quyết vấn đề này. Tôi nghĩ rằng tôi có thể làm tốt hơn với phương thức _editCellAt_ được ghi đè (nhớ rằng tôi cũng có thể truy cập vào sự kiện _KeyEvent_). Nhưng kiểm tra để xem những tổ hợp phím nào sẽ vượt qua là lỗi dễ bị bởi một lập trình viên. Đó là những gì tôi đang cố gắng tránh. Xem câu trả lời của tôi cho @trashgod bên dưới. Tôi sẽ thử thay thế đó và xem nó có hoạt động không. Cảm ơn bạn đã trả lời. – Marcos

+0

tốt, trình soạn thảo api được _designed_ quyết định có hay không một sự kiện tùy ý nên bắt đầu chỉnh sửa: vì vậy đó chắc chắn là nơi để làm điều đó (* not * trong bảng, editCellAt chỉ nên truy vấn trình chỉnh sửa) Và không, tôi không ' t thấy nhiều vấn đề liên quan đến tổ hợp phím: bạn sẽ phải kiểm tra các công cụ sửa đổi không nên kích hoạt bất kỳ thứ gì cộng với một tập hợp các phím chức năng dễ dàng chuyển vào trình chỉnh sửa dưới dạng danh sách các phím bấm có thể được kiểm tra theo số – kleopatra

+0

Ok, tôi đồng ý bạn đúng về trình soạn thảo api. Mã của tôi cũng có thể ở đó mà không có bất kỳ vấn đề gì. Nhưng với các tổ hợp phím thì không dễ như thế này. Ví dụ, trong bàn phím của tôi, nếu tôi gõ Ctrl + Alt + a tôi sẽ nhận được một ký tự 'á'. Vì vậy, vấn đề không chỉ là để lọc một số tổ hợp phím điều khiển. Tôi phải biết cái nào sẽ tạo ra một nhân vật hợp lệ. Vấn đề này là khó khăn và tôi không thấy bất kỳ cách dễ dàng nào để loại bỏ nó. – Marcos

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