PDA

View Full Version : [Q] Keymap, KeyStroke trong JTextComponent



Liwh
13-11-2002, 09:58
Khi mình đọc Tutorial của Sun thì thấy có nói JTextComponent có 1 default keymap. Và có ghi như sau:
You can enhance or modify the default keymap in the following ways:
* Add a custom keymap to the text component with JTextComponent's addKeymap method.
* Add key bindings to the default keymap with Keymap's addActionForKeyStroke method. The default keymap is shared among text components, so use this with caution.
* Remove key bindings from the default keymap with Keymap's removeKeyStrokeBinding method. The default keymap is shared among text components, so again, use this with caution.
Theo như mình hiểu thì khi remove Keymap đi rồi thì khi nhấn Up, Down, Right, Left (hay bất kì phím nào trừ character) sẽ không được. Nhưng hình như mình hiểu sai, tự vì khi remove đi rồi thì vẫn còn có thể di chuyển caret bằng các phím mũi tên, Home, End ...
Còn khi bắt các KeyEvent thì lại gặp vấn đề khác, vì có rất nhiều key để bắt, do đó cách này không có hiệu quả (39 keys). Nên tạo một cái keymap mới là cách tốt, nhưng mình lại không remove được cái JTextComponent.DEFAULT_KEYMAP mới tức. User có thể di chcuyển caret tùm lum.
Như vậy các bạn có cách nào disable các phím (ngoại trừ các character để mình gõ, nên không setEnable(false) được). Hay ở đâu có source, bài viết nào tương tự thì chỉ giùm mình với.
Cám ơn

quangvu
18-11-2002, 16:49
Có phải bạn định Trong JTextComponent chỉ cho gỏ các kí tự ,còn các phí đặc biệt thì bị cấm.

Liwh
18-11-2002, 19:02
Yeah!
Và các phím em muốn thì sẽ gõ được

quangvu
19-11-2002, 09:05
Cái này thì cần gì các Bean "hạng nặng" ,chỉ cần vài thủ thuật nhỏ là song ngay :)
Tại phương thức Change hoặc KeyUp ,lấy dử liệu của Text đó xem có kí tự bị chặn hay không.Nếu phải thì ta cho dử liệu trong Text đó băng dử liệu trước đó.
*Ví dụ
1.Ta cấm gỏ kí tự "d" trong Text1
2.Text1 hiện có dử liệu là Text1 : "abc" ,chuổi str1 = Text1.getText() = "abc"
3.Khi MoveUp Text1 : "abcd" ,str2 = "abcd"
4.Dùng str2.indexOf(0,"d") trả về trị > 0 tức tồn tại kí tự d trong chuổi
5.Ta lập tức đặt lại Text1 : str1 .Tức Text1.setText(str1) .Khi đó Text1 trở về "abc".
----> Kí tự "d" bị chặng.
** Đây là thủ thuật dùng Phần tử cầm canh str1 và str2
Chúc thành công .

Liwh
19-11-2002, 12:51
Anh Quang Vu lại không hiểu ý em rồi. Ý em là các phím, tổ hợp phím đặc biệt cơ. Thí dụ nhấn up arrow cái con trỏ nó nhảy lên dòng trên, Home nó nhảy về đầu .... Em muốn disable mấy cái đó đó. Em có viết ở trên là mấy cái DEFAULT_KEYMAP đó.
Thân

quangvu
19-11-2002, 15:48
Cũng thế thui ,chỉ có phức tạp hơn một chút .
+ Nếu không muốn nó nhãy về đầu (HOME)hay về cuối (END)thì bắt về khoảng cách .Trong Text có cho ta lấy vị trí con trỏ ,nếu thấy một phím được nhấn mà con trỏ nhảy quá 2 vị trí thì set lại vị trí củ cho nó
+ Nói tóm lại là dùng thủ thuật chứ các Bean không Support đến mức đó đâu .Hoặc có thì cũng hơi khó tìm.
* Nên thiết kế một Bean riên chuyên trị các trường hợp đó.

Chúc thành công.

Allbegins
25-11-2002, 02:02
Allbegins góp ý:

-Liwh có đề cập nếu sử dụng KeyEvent thì phải chia ra 39 trường hợp .... Allbegins thấy đây là cách đáng làm.

-Hơn nữa những phím tắt Ctrl-C,Ctrl-V, Ctrl-Up, Home... là những công cụ cần thiết giúp cho User edit nhanh hơn... không nên disable tụi nó mà tôi nghiệp cho User! Hơn thế nữa, Liwh hãy cung cấp cho User các Ctrl-Key khác để giúp họ thao tác nhanh trong khi Edit.