2012-08-28 33 views
7

Hành vi mặc định của JTable đang thay đổi tiêu điểm sang ô tiếp theo và tôi muốn buộc nó chuyển trọng tâm sang thành phần tiếp theo (ví dụ: JTextField) trên phím TAB.
tôi overrided isCellEditable phương pháp DefaultTableModel luôn trả về false:Thay đổi tiêu điểm thành thành phần tiếp theo trong JTable bằng cách sử dụng TAB

public boolean isCellEditable(int rowIndex, int columnIndex) { 
    return false; 
} 

Nhưng nó vẫn không thay đổi tập trung vào phần tiếp theo!
Làm cách nào để tạo JTable thay đổi tiêu điểm thành thành phần tiếp theo thay vì ô tiếp theo?

+0

chúng ta đang nói về Focus 1) bên trong các ô của JTable betweens 2) di chuyển tiêu điểm từ JTable sang (ví dụ) JTextField và ngược lại – mKorbel

+0

@mKorbel: # 2, hành vi mặc định của JTable đang thay đổi tiêu điểm tới ô tiếp theo và tôi muốn ép nó chuyển trọng tâm sang thành phần tiếp theo (ví dụ: 'JTextField') trên phím TAB được nhấn. – RYN

Trả lời

5

Nếu bạn thực sự muốn điều này, bạn cần phải thay đổi hành vi mặc định của bản đồ hành động bảng.

ActionMap am = table.getActionMap(); 
am.put("selectPreviousColumnCell", new PreviousFocusHandler());  
am.put("selectNextColumnCell", new NextFocusHandler());  

Sau đó, bạn cần một vài hành động để xử lý các traversal

public class PreviousFocusHandler extends AbstractAction { 
    public void actionPerformed(ActionEvent evt) { 
     KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
     manager.focusPreviousComponent(); 
    } 
} 

public class NextFocusHandler extends AbstractAction { 
    public void actionPerformed(ActionEvent evt) { 
     KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
     manager.focusNextComponent(); 
    } 
} 

cách tiếp cận khác là để vô hiệu hóa tiềm ẩn Action ...

ActionMap am = table.getActionMap(); 
am.get("selectPreviousColumnCell").setEnabled(false); 
am.get("selectNextColumnCell").setEnabled(false); 

(chưa được thử nghiệm này)

Lợi ích của phương pháp này là có thể bật/tắt hành vi khi bạn cần nó mà không cần phải duy trì một tham chiếu đến cũ Actions

+0

không .. (15 ký tự) – kleopatra

+0

? KeyboardFocusManager? Đã đề cập đến Componet.transferFocusXXX(), nhưng có 4 tháng để ợ hơi: P – MadProgrammer

12

Phím shift// tab được sử dụng theo mặc định để truyền tiêu điểm giữa các thành phần. JTable yêu cầu một cách rõ ràng để xử lý các shift-/tab nội bộ (bằng cách cung cấp tập hợp các focusTraversalKeys mà không bao gồm những).

Tiếp theo nguyên tắc chung (nếu có của specilized api sẵn sàng cho một công việc, sử dụng thay vì cán của riêng bạn), giải pháp là để thiết lập phím traversal để lại chứa chúng:

Set<AWTKeyStroke> forward = new HashSet<AWTKeyStroke>(
     table.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS)); 
forward.add(KeyStroke.getKeyStroke("TAB")); 
table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forward); 
Set<AWTKeyStroke> backward = new HashSet<AWTKeyStroke>(
     table.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS)); 
backward.add(KeyStroke.getKeyStroke("shift TAB")); 
table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backward); 
+1

thú vị ... – mKorbel

+1

Vâng, tôi không biết về điều này. – DejanLekic

4

Để thiết lập lại để bindings bàn phím tiêu chuẩn (thường TAB và SHIFT + TAB), chỉ cần xác định null cho keystrokes tham số để Component.setFocusTraversalKeys:

table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null); 
table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null); 
Các vấn đề liên quan