1

我尝试使用以下代码绘制单线水平线,但它不起作用。我没有得到什么问题。

HorizontalFieldManager horline = new HorizontalFieldManager()
{
    protected void paint(Graphics graphics) 
    {
        super.paint(graphics);
        graphics.setColor(Color.RED);
        graphics.drawLine(5, 21,10, 20);                      
    }
};
4

2 回答 2

2

这里至少有几个问题:

程度

字段(或经理)的范围基本上是屏幕上该字段的大小。此大小通常由Field对象在其layout()方法中设置,或者由Manager对象在其sublayout()方法中设置。问题是您HorizontalFieldManager没有覆盖这些方法来设置大小(通过调用setExtent()),并且看起来您没有向管理器添加任何字段。因此,我相信您的horline管理器对象的大小仅为 {0, 0}。在其范围之外绘制不会做任何事情。

经理与现场

管理器类是字段的容器。在这种情况下,您所拥有的只是一条线。我绝对不会为此使用 Manager(包括 Horizo​​ntalFieldManager),因为您没有将任何字段放入其中,并且添加 Manager 对象会产生开销。使用更轻量级的字段,或者甚至修改包含此代码的任何类的paint()or方法......你没有向我们展示,所以我不能肯定地说。paintBackground()

如果您想用 a 表示该行Field,那么这将起作用:

  Field line = new Field() {
     protected void layout(int width, int height) {
        setExtent(20, 21);            
     }
     protected void paint(Graphics g) {
        int oldColor = g.getColor();
        g.setColor(Color.RED);
        g.drawLine(5, 21,10, 20);          
        g.setColor(oldColor);
     }         
  };
  add(line);

请注意,我将范围设置为 width=20, height=21,因为这些是您传递给的最大坐标drawLine()。此外,因为您的 y 值是 20 和 21,所以这实际上不是一条真正的水平线。

添加()

这可能只是在您显示的代码中被忽略以保持问题简短,但是无论您使用经理还是字段,您都需要记住调用add()您的字段/经理对象。创建但未添加到屏幕的对象将永远不会显示。在您的情况下,该setExtent()问题也会导致此问题。


更新:

正如 Dinesh 在他的回答中所示,您也可以使用SeparatorField. 但是,我相信这只会给你纯粹的水平/垂直线。由于您的代码中的坐标,我不确定您是否需要能够绘制任何方向的线......如果您这样做,那么覆盖paint()是必要的。如果没有,请使用SeparatorField... 但希望您也从这个答案中学到了一些东西:)。

于 2013-10-09T07:27:45.533 回答
1

用这个

HorizontalFieldManager horline = new HorizontalFieldManager()
{
   protected void paint(Graphics graphics) 
   {
      super.paint(graphics);
      graphics.setColor(Color.RED);
   }
};
horline.add(new SeparatorField(SeparatorField.LINE_HORIZONTAL|SeparatorField.VISUAL_STATE_FOCUS));
于 2013-10-09T07:27:30.110 回答