当前位置: 首页 > 面试题库 >

水平滚动和TextField错误

韦宏扬
2023-03-14
问题内容

我创建了一个CustomTextField,当我键入的文本超出使用Horizo​​nalFieldManager的TextField的宽度时,它会向左滚动,但是现在的问题是,如果我用鼠标右键单击并滚动它,它的长度将不足但不会停到我输入的最后一个字这里是什么问题?是虫子吗

我只需要在到达最后一个单词时禁用Horizo​​ntalScrolling就可以在单词中最后一个单词的开头和结尾之间滚动

签出代码

import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FocusChangeListener;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.XYEdges;
import net.rim.device.api.ui.XYRect;
import net.rim.device.api.ui.component.BasicEditField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.VerticalFieldManager;
import net.rim.device.api.ui.decor.Border;
import net.rim.device.api.ui.decor.BorderFactory;


public class CustomTextField extends VerticalFieldManager {
    private int textWidth=0;
    private int textHeight=0;
    private BasicEditField basicEditField;
    private HorizontalFieldManager hfm;
    //Border border;

    public CustomTextField(int width,int height) {
        super();
        textWidth=width;
        textHeight=height;
        //border=BorderFactory.createSimpleBorder(new XYEdges(1, 1, 1, 1));


        hfm=new HorizontalFieldManager(Manager.HORIZONTAL_SCROLL){
            protected void sublayout(int maxWidth, int maxHeight) {
                super.sublayout(maxWidth, maxHeight);
                setExtent(textWidth, textHeight);
            }
        };  
        basicEditField=new BasicEditField("","",200,BasicEditField.NO_NEWLINE);
        //basicEditField.setBorder(border);

        hfm.add(basicEditField);
        add(hfm);
    }


    protected void sublayout(int maxWidth, int maxHeight) {
        super.sublayout(textWidth, textHeight);
        setExtent(textWidth, textHeight);

    }


    protected void paint(Graphics graphics) {
        super.paint(graphics);
        graphics.setColor(Color.BLACK);
        graphics.drawRect(0,0, textWidth, textHeight);
    }

}

我已经将其初始化为

 CustomTextField textField=new CustomTextField(200, 20);
            add(textField);

我觉得Horizo​​ntalFieldManager需要滚动(是滚动功能)…但尚未解决,请提供帮助


问题答案:

因此,在BlackBerry字段中, 范围 是字段的实际 视觉 尺寸。但是, 虚拟范围 是它可以使用的 逻辑
大小,其中一些可能不可见。为此Managers,您通常需要将虚拟范围设置为大于范围。

我使用这个概念来动态地改变您的虚拟范围HorizontalFieldManager,根据当前需要多少空间来勉强适应文本的大小BasicEditField。为此,我必须通过实现HorizontalFieldManager来监听对的更改。然后,在将每个字符输入到编辑字段中时,水平字段管理器将重新计算该字段中现在需要多少宽度的文本。然后,将虚拟宽度重新设置为该宽度。BasicEditField``FieldChangeListener

这导致水平字段管理器仅允许滚动到输入文本的末尾,而不是向右滚动,这就是代码最初的工作方式。

因此,我认为BlackBerry没有做错任何事情……在操作系统中没有错误。以前,还没有设置虚拟范围。

我将您的Horizo​​ntalFieldManager拆分为一个新的私有类,因为当逻辑超过大约5行代码时,我不喜欢使用匿名类。因此,下面的解决方案看起来有些不同。

其他想法:

1)由于您尝试使用自定义paint()实现绘制边框,因此出现了一些绘图工件。但是,该错误最初存在于此,我将这个问题解释为与滚动问题有关。似乎您正在尝试使用Border对象,这可能是实现滚动字段边框的更好方法。

2)在我的新解决方案中,实际的CustomTextField类没有太多内容。它只是的容器(ManagerCustomHorizontalFieldManager。如果需要,您可能会摆脱该外层。但是,我知道有时候在发布代码时,您会删除一些细节,这些细节对于遇到麻烦的事情并不重要。因此,可能需要VerticalFieldManager包含一个HorizontalFieldManager包含一个BasicEditField容器。我会留给您…不过这只是可选的
清理

3)我在5.0 Storm2模拟器上对此进行了测试。

import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.component.BasicEditField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.VerticalFieldManager;
import net.rim.device.api.util.Arrays;

public class CustomTextField extends VerticalFieldManager {

   private int textWidth = 0;
   private int textHeight = 0;
   private CustomHorizontalFieldManager hfm;

   public CustomTextField(int width, int height) {
      super();

      textWidth = width;
      textHeight = height;

      hfm = new CustomHorizontalFieldManager();
      add(hfm);
   }

   protected void sublayout(int maxWidth, int maxHeight) {
      super.sublayout(textWidth, textHeight);
      setExtent(textWidth, textHeight);
   }

   protected void paint(Graphics graphics) {
      // TODO: change me!
      super.paint(graphics);
      graphics.setColor(Color.BLACK);
      graphics.drawRect(0, 0, textWidth, textHeight);
   }

   private class CustomHorizontalFieldManager extends HorizontalFieldManager implements FieldChangeListener {

      private BasicEditField basicEditField;
      /** the maximum virtual width of the edit field, based on the max num of chars */
      private int maxVirtualWidth;

      public CustomHorizontalFieldManager() {
         super(Manager.HORIZONTAL_SCROLL);

         int maxNumChars = 200;
         basicEditField = new BasicEditField("", "", maxNumChars, BasicEditField.NO_NEWLINE);

         // determine how wide the field would need to be to hold 'maxNumChars', with the font
         //   in use ... just pick a long string of all W's, since that's usually the widest char
         char[] buffer = new char[maxNumChars];
         Arrays.fill(buffer, 'W');
         String spacer = new String(buffer);
         maxVirtualWidth = basicEditField.getFont().getAdvance(spacer);

         // we need to listen as the user types in this field, so we can dynamically alter its
         //   virtual width
         basicEditField.setChangeListener(this);

         add(basicEditField);
      }

      protected void sublayout(int maxWidth, int maxHeight) {
         super.sublayout(maxWidth, maxHeight);
         // extent is the visible size, virtual extent can be wider if we want scrolling
         setExtent(textWidth, textHeight);
         setVirtualExtent(maxVirtualWidth, textHeight);
      }

      public void fieldChanged(Field f, int context) {
         if (f == basicEditField) {
            // recalculate how much virtual width the edit field needs, based on the 
            //  current text content
            int newWidth = basicEditField.getFont().getAdvance(basicEditField.getText());
            setVirtualExtent(newWidth, textHeight);
         }
      }
   }

}


 类似资料:
  • 问题内容: 我正在尝试创建一系列只能水平滚动的照片。 它应该看起来像这样的 但是,只有通过指定包含照片的的宽度,才能实现上述目的(因此它们不会“自动换行”)。如果我不放宽- 看起来像这样; 使用CSS可以防止固定宽度的图像发生变化,该怎么办。 谢谢 问题答案: 您可以使用与。这样写:

  • 我正在使用GridView创建一个组件来创建像Excel这样的表。在这里,我最初创建了一个2x2网格,稍后当用户单击按钮时,会添加额外的行和列。 这是我添加新专栏的做法:- 这可以正常工作并添加额外的列。问题是当添加列时,以前的列会收缩以适应新列,从而使每次添加新列时列看起来更小。我想一次只在屏幕上显示2列,然后让用户水平向前滚动以查看更多列。现在网格只能垂直滚动。同样,我希望在添加新行时发生这种

  • 请看http://codepen.io/anon/pen/zGLZoR 我的“浮动div”跟随页面滚动-它在向下移动滚动条后立即执行此操作。如何仅在达到px(比如200px)滚动高度时启动浮动。因此,当您向下滚动200px时,可以看到浮动div,而不是直接看到。 编辑: 当滚动回到顶部时,div必须返回到原始位置-超过200px标记

  • 我正在咨询你,因为我正在处理一些关于VSCODE的困扰我的事情。 我们目前正在创建一个应用程序,它应该在本地运行,所以我们的代码中确实有很多base64行。可以想象,这些字符串相当大: 这对我(和我的同事)来说是个问题,因为我们对这种轻量级的“Visual Studio”式编辑器很感兴趣,但又无法避免出现断行,这使得导航某些脚本非常复杂。

  • 我正在制作一个应用程序,其中我使用和类来制作一个可滚动的水平卡片堆栈。我已经成功地实现了,但我的问题是刷卡向右的方向,我想刷卡向左的方向。 我对SO做了一些研究,发现了1和2 更新:我仍然在努力,几乎没有发现很多,因为它仍然很难改变滚动的方向在回收,所以任何人仍然想帮助我,是欢迎的。 我还发现方法传递滚动位置和direcion可能我错了,但beow code可能是解决方案 我的主要班级 这是我的s

  • 问题内容: 我有一个,当行太多时,会出现滚动条,但是当行太长时,该行会分成两行,而不是出现水平滚动条,如何使水平条出现而不是分成两行,我的添加如下: 问题答案: 正如我们自己的Rob Camick 在这里介绍的那样,您可以尝试使用类似… 这将停止行/自动换行