java – 水平滚动和TextField错误

前端之家收集整理的这篇文章主要介绍了java – 水平滚动和TextField错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我创建了一个CustomTextField
当我键入超过TextField的宽度的文本时,它向左滚动
使用了Horizo​​nalFieldManager
但现在的问题是如果我用鼠标右键单击并滚动它
它的长度不足
但是不要停止我打字的最后一个字
这里有什么问题?
这是一个bug吗

我只需要它来达到最后一个字时禁用Horizo​​ntalScrolling
它应该能够在最后一个单词的开始和结束之间滚动

查看代码

  1. import net.rim.device.api.ui.Color;
  2. import net.rim.device.api.ui.Field;
  3. import net.rim.device.api.ui.FocusChangeListener;
  4. import net.rim.device.api.ui.Graphics;
  5. import net.rim.device.api.ui.Manager;
  6. import net.rim.device.api.ui.XYEdges;
  7. import net.rim.device.api.ui.XYRect;
  8. import net.rim.device.api.ui.component.BasicEditField;
  9. import net.rim.device.api.ui.container.HorizontalFieldManager;
  10. import net.rim.device.api.ui.container.VerticalFieldManager;
  11. import net.rim.device.api.ui.decor.Border;
  12. import net.rim.device.api.ui.decor.BorderFactory;
  13.  
  14.  
  15. public class CustomTextField extends VerticalFieldManager {
  16. private int textWidth=0;
  17. private int textHeight=0;
  18. private BasicEditField basicEditField;
  19. private HorizontalFieldManager hfm;
  20. //Border border;
  21.  
  22. public CustomTextField(int width,int height) {
  23. super();
  24. textWidth=width;
  25. textHeight=height;
  26. //border=BorderFactory.createSimpleBorder(new XYEdges(1,1,1));
  27.  
  28.  
  29. hfm=new HorizontalFieldManager(Manager.HORIZONTAL_SCROLL){
  30. protected void sublayout(int maxWidth,int maxHeight) {
  31. super.sublayout(maxWidth,maxHeight);
  32. setExtent(textWidth,textHeight);
  33. }
  34. };
  35. basicEditField=new BasicEditField("","",200,BasicEditField.NO_NEWLINE);
  36. //basicEditField.setBorder(border);
  37.  
  38. hfm.add(basicEditField);
  39. add(hfm);
  40. }
  41.  
  42.  
  43. protected void sublayout(int maxWidth,int maxHeight) {
  44. super.sublayout(textWidth,textHeight);
  45. setExtent(textWidth,textHeight);
  46.  
  47. }
  48.  
  49.  
  50. protected void paint(Graphics graphics) {
  51. super.paint(graphics);
  52. graphics.setColor(Color.BLACK);
  53. graphics.drawRect(0,textWidth,textHeight);
  54. }
  55.  
  56. }

我已经将其初始化为

  1. CustomTextField textField=new CustomTextField(200,20);
  2. add(textField);

对于Horizo​​ntalFieldManager,我觉得需要Scroll(正在滚动功能)…但尚未提出解决方
请帮忙

解决方法

@H_502_26@ 所以,在黑莓领域,范围是一个字段的实际视觉尺寸.但是,虚拟范围是可以使用的逻辑大小,其中一些可能不可见.对于要滚动的管理器,通常将虚拟扩展范围设置为大于该范围.

我使用这个概念来动态地改变您的Horizo​​ntalFieldManager的虚拟范围,这取决于当前需要多少空间才能适应BasicEditField中的文本.为此,我必须让Horizo​​ntalFieldManager通过实现FieldChangeListener监听BasicEditField的更改.然后,当每个字符输入到编辑字段时,水平字段管理器将重新计算现在在该字段中的文本量所需的宽度.然后将虚拟宽度重新设置为该宽度.

这使得水平字段管理器只允许滚动到输入的文本的末尾,而不是右边的方式,这是代码最初工作的方式.

所以,我不认为黑莓手机做错了什么…没有操作系统的bug.以前,虚拟范围没有设置.

我将您的Horizo​​ntalFieldManager拆分成一个新的私有类,因为当逻辑超过5行代码时,我不喜欢使用匿名类.所以,下面的解决方案有所不同.

其他想法:

1)由于您尝试使用自定义paint()实现绘制边框,因此存在绘图工件.但是,那个bug最初在那里,我把这个问题解释成是滚动问题.看起来您正在尝试使用Border对象,这可能是实现滚动字段边框的更好方式.

2)使用我的新解决方案,实际的CustomTextField类没有太多的内容.它只是CustomHorizo​​ntalFieldManager的容器(Manager).如果你想要的话,你可能会摆脱外层.但是,我知道有时你发布代码时,会删除对您遇到麻烦的事情不重要的细节.所以,也许需要一个VerticalFieldManager包含一个Horizo​​ntalFieldManager,它包含一个BasicEditField.我会把它留给你,但它只会是可选的清理.

3)我在5.0 Storm2模拟器上测试了这个.

  1. import net.rim.device.api.ui.Color;
  2. import net.rim.device.api.ui.Field;
  3. import net.rim.device.api.ui.FieldChangeListener;
  4. import net.rim.device.api.ui.Graphics;
  5. import net.rim.device.api.ui.Manager;
  6. import net.rim.device.api.ui.component.BasicEditField;
  7. import net.rim.device.api.ui.container.HorizontalFieldManager;
  8. import net.rim.device.api.ui.container.VerticalFieldManager;
  9. import net.rim.device.api.util.Arrays;
  10.  
  11. public class CustomTextField extends VerticalFieldManager {
  12.  
  13. private int textWidth = 0;
  14. private int textHeight = 0;
  15. private CustomHorizontalFieldManager hfm;
  16.  
  17. public CustomTextField(int width,int height) {
  18. super();
  19.  
  20. textWidth = width;
  21. textHeight = height;
  22.  
  23. hfm = new CustomHorizontalFieldManager();
  24. add(hfm);
  25. }
  26.  
  27. protected void sublayout(int maxWidth,int maxHeight) {
  28. super.sublayout(textWidth,textHeight);
  29. setExtent(textWidth,textHeight);
  30. }
  31.  
  32. protected void paint(Graphics graphics) {
  33. // TODO: change me!
  34. super.paint(graphics);
  35. graphics.setColor(Color.BLACK);
  36. graphics.drawRect(0,textHeight);
  37. }
  38.  
  39. private class CustomHorizontalFieldManager extends HorizontalFieldManager implements FieldChangeListener {
  40.  
  41. private BasicEditField basicEditField;
  42. /** the maximum virtual width of the edit field,based on the max num of chars */
  43. private int maxVirtualWidth;
  44.  
  45. public CustomHorizontalFieldManager() {
  46. super(Manager.HORIZONTAL_SCROLL);
  47.  
  48. int maxNumChars = 200;
  49. basicEditField = new BasicEditField("",maxNumChars,BasicEditField.NO_NEWLINE);
  50.  
  51. // determine how wide the field would need to be to hold 'maxNumChars',with the font
  52. // in use ... just pick a long string of all W's,since that's usually the widest char
  53. char[] buffer = new char[maxNumChars];
  54. Arrays.fill(buffer,'W');
  55. String spacer = new String(buffer);
  56. maxVirtualWidth = basicEditField.getFont().getAdvance(spacer);
  57.  
  58. // we need to listen as the user types in this field,so we can dynamically alter its
  59. // virtual width
  60. basicEditField.setChangeListener(this);
  61.  
  62. add(basicEditField);
  63. }
  64.  
  65. protected void sublayout(int maxWidth,int maxHeight) {
  66. super.sublayout(maxWidth,maxHeight);
  67. // extent is the visible size,virtual extent can be wider if we want scrolling
  68. setExtent(textWidth,textHeight);
  69. setVirtualExtent(maxVirtualWidth,textHeight);
  70. }
  71.  
  72. public void fieldChanged(Field f,int context) {
  73. if (f == basicEditField) {
  74. // recalculate how much virtual width the edit field needs,based on the
  75. // current text content
  76. int newWidth = basicEditField.getFont().getAdvance(basicEditField.getText());
  77. setVirtualExtent(newWidth,textHeight);
  78. }
  79. }
  80. }
  81.  
  82. }

猜你在找的Java相关文章