`
cary
  • 浏览: 85795 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

利用TEXT AND BUTTON 来改写SPINNER,实现setEditable(boolean editable)

    博客分类:
  • J2EE
阅读更多

package dsrcom.ecq.client.util;

 

/**
 * 将Spinner控件改写。
 * setEditable(false)即可设其为不可用,但字体为黑色的效果
 *
 * @author cary.kong
 * @2006-10-8
 * @上午11:19:56
 */

import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TypedListener;

public class SSpinner extends Composite {

  static final int BUTTON_WIDTH = 16;

  Text text;

  Button up, down;

  int minimum, maximum;

  public SSpinner(Composite parent, int style) {

    super(parent, style);

    text = new Text(this, style | SWT.SINGLE | SWT.BORDER);

    up = new Button(this, style | SWT.ARROW | SWT.UP);

    down = new Button(this, style | SWT.ARROW | SWT.DOWN);

    text.addListener(SWT.Verify, new Listener() {

      public void handleEvent(Event e) {

        verify(e);

      }

    });

    text.addListener(SWT.Traverse, new Listener() {

      public void handleEvent(Event e) {

        traverse(e);

      }

    });

    up.addListener(SWT.Selection, new Listener() {

      public void handleEvent(Event e) {

        up();

      }

    });

    down.addListener(SWT.Selection, new Listener() {

      public void handleEvent(Event e) {

        down();

      }

    });

    addListener(SWT.Resize, new Listener() {

      public void handleEvent(Event e) {

        resize();

      }

    });

    addListener(SWT.FocusIn, new Listener() {

      public void handleEvent(Event e) {

        focusIn();

      }

    });

    text.setFont(getFont());

    minimum = 0;

    maximum = 9;

    setSelection(minimum);

  }

  void verify(Event e) {

    try {

      Integer.parseInt(e.text);

    } catch (NumberFormatException ex) {

      e.doit = false;

    }

  }

  void traverse(Event e) {

    switch (e.detail) {

    case SWT.TRAVERSE_ARROW_PREVIOUS:

      if (e.keyCode == SWT.ARROW_UP) {

        e.doit = true;

        e.detail = SWT.NULL;

        up();

      }

      break;

    case SWT.TRAVERSE_ARROW_NEXT:

      if (e.keyCode == SWT.ARROW_DOWN) {

        e.doit = true;

        e.detail = SWT.NULL;

        down();

      }

      break;

    }

  }

  void up() {

    setSelection(getSelection() + 1);

    notifyListeners(SWT.Selection, new Event());

  }

  void down() {

    setSelection(getSelection() - 1);

    notifyListeners(SWT.Selection, new Event());

  }

  void focusIn() {

    text.setFocus();

  }

  public void setFont(Font font) {

    super.setFont(font);

    text.setFont(font);

  }

  public void setSelection(int selection) {

    if (selection < minimum) {

      selection = minimum;

    } else if (selection > maximum) {

      selection = maximum;

    }

    text.setText(String.valueOf(selection));

    text.selectAll();

    text.setFocus();

  }

  public int getSelection() {

    return Integer.parseInt(text.getText());

  }

  public void setMaximum(int maximum) {

    checkWidget();

    this.maximum = maximum;

    resize();

  }

  public int getMaximum() {

    return maximum;

  }

  public void setMinimum(int minimum) {

    this.minimum = minimum;

  }

  public int getMinimum() {

    return minimum;

  }

  void resize() {

    Point pt = computeSize(SWT.DEFAULT, SWT.DEFAULT);

    int textWidth = pt.x - BUTTON_WIDTH;

    int buttonHeight = pt.y / 2;

    text.setBounds(0, 0, textWidth, pt.y);

    up.setBounds(textWidth, 0, BUTTON_WIDTH, buttonHeight);

    down.setBounds(textWidth, pt.y - buttonHeight, BUTTON_WIDTH,
        buttonHeight);

  }

  public Point computeSize(int wHint, int hHint, boolean changed) {

    GC gc = new GC(text);

    Point textExtent = gc.textExtent(String.valueOf(maximum));

    gc.dispose();

    Point pt = text.computeSize(textExtent.x, textExtent.y);

    int width = pt.x + BUTTON_WIDTH;

    int height = pt.y;

    if (wHint != SWT.DEFAULT)
      width = wHint;

    if (hHint != SWT.DEFAULT)
      height = hHint;

    return new Point(width, height);

  }

  public void addSelectionListener(SelectionListener listener) {

    if (listener == null)
      throw new SWTError(SWT.ERROR_NULL_ARGUMENT);

    addListener(SWT.Selection, new TypedListener(listener));

  }
 
  public void setEditable(boolean editable)
  {
   up.setEnabled(editable);
   down.setEnabled(editable);
   text.setEditable(editable);
  }

}
 



分享到:
评论

相关推荐

    使用Spinner实现下拉列表

    本篇文章将详细介绍如何使用Spinner来实现下拉列表,以及如何自定义其样式。 首先,我们来了解Spinner的基本用法。在XML布局文件中,可以添加一个Spinner元素: ```xml &lt;Spinner android:id="@+id/spinner" ...

    android 用Button+dialog实现spinner

    这篇博客“android 用Button+dialog实现spinner”正是探讨了如何结合Button和Dialog来实现这样的功能。 首先,我们要了解Spinner的基本用法。Spinner通常通过Adapter(如ArrayAdapter或CursorAdapter)与数据集关联...

    spinner实现简单计算器

    在本教程中,我们将探讨如何利用Spinner实现一个简单的计算器,这是一项非常适合初学者练习的项目。 首先,我们需要了解Spinner的基本用法。在布局XML文件中,我们创建一个Spinner元素,并通过`android:id`属性为其...

    自定义Spinner实现初始项不参与列表显示(Spinner添加“请选择”)

    这可以通过在Spinner的布局中添加一个单独的TextView来实现。例如: ```xml &lt;Spinner android:id="@+id/my_spinner" android:layout_width="match_parent" android:layout_height="wrap_content" /&gt; android:...

    android spinner 实现联动代码

    在Android开发中,Spinner是一个非常常用的控件,它用于实现下拉列表的功能,可以供用户在有限的选项中选择一个。本篇文章将详细介绍如何在Android中实现Spinner的联动效果,即当用户在一个Spinner中选择一个选项后...

    android Spinner value值与text值

    本示例“android Spinner value值与text值”旨在教你如何在Spinner中同时获取选中项的显示文本(text)和对应的数据值(value)。在实际应用中,数据值通常用于程序逻辑处理,而显示文本则直接呈现给用户。 1. **...

    安卓 spinner 实现省市级联

    【安卓 Spinner 实现省市级联】是Android开发中常见的需求,用于在应用程序中创建一个下拉选择组件,展示省、市、区等地理层级的数据。Spinner控件在Android中广泛用于实现有限选项的选择,通常与Adapter配合使用,...

    spinner实现省市二级联动

    本示例主要讲解如何利用Spinner实现省市二级联动的功能,这是一个在许多应用中都需要用到的功能,如地址填写、定位服务等。下面将详细介绍这个过程。 首先,我们需要明白什么是二级联动。二级联动是指在一个选择框...

    Android 按钮实现Spinner效果

    android:text="显示Spinner" /&gt; ``` 然后,在按钮的点击事件中展示Spinner: ```java Button button = findViewById(R.id.button_show_spinner); button.setOnClickListener(new View.OnClickListener() { @...

    Android Spinner实现图片列表

    在给定的“Android Spinner实现图片列表”示例中,开发者通过自定义适配器和视图,成功地扩展了Spinner的功能,使其可以显示包含图片的列表。 1. **Spinner基本概念** Spinner是Android中的一个选择器组件,它可以...

    如何借助ArrayAdapter和Spinner实现下拉列表.zip

    本教程将详细解释如何利用ArrayAdapter和Spinner来创建一个功能完备的下拉列表。 一、Spinner简介 Spinner是Android SDK中的一个组件,类似于iOS中的PickerView。它的主要作用是在有限的选项中让用户做出单选决策,...

    android studio,demo,Spinner下拉菜单多选的实现

    在Android SDK原生组件中,Spinner并不直接支持多选,但我们可以利用Checkbox或RadioButton结合Adapter来模拟实现。 1. **创建布局文件**:在res/layout目录下创建一个新的XML布局文件,如`multi_select_item.xml`...

    如何借助SimpleAdapter和Spinner实现下拉列表.zip

    本教程将详细介绍如何利用SimpleAdapter和Spinner来实现这样的功能。 首先,我们需要了解Spinner的基本用法。Spinner是一个继承自AbsSpinner的视图,它在默认状态下显示一个单行文本,点击后会展开一个下拉列表。...

    Spinner二级联动下拉菜单

    Spinner在Android中是通过`Spinner`类来创建的,可以使用XML布局或代码动态添加。在XML布局中,我们通常会使用`&lt;Spinner&gt;`标签,并通过`android:entries`属性指定数据源,如数组资源或适配器。 2. **ArrayAdapter...

    Android自定义spinner下拉框实现的实现

    本篇文章将详细讲解如何自定义一个Android Spinner的下拉框实现,以提供更加个性化的用户体验。 首先,我们需要了解Spinner的基本用法。Spinner通常通过Adapter来绑定数据源,常见的有ArrayAdapter、...

    自定义Spinner--利用TextView以及Dialog组合

    本教程将深入探讨如何实现一个自定义的Spinner,该Spinner是通过结合TextView和Dialog来创建的,以提供更灵活和个性化的用户体验。 ### 自定义Spinner的基本原理 1. **TextView**:TextView是Android中的基本组件...

    spinner实现自定义修改字体颜色大小

    spinner默认显示的字体颜色为纯黑色,在一些情况下,我们想要改变这种颜色,但是却发现在spinner的属性里面并没有setTextColor类似这样的属性,也就是说我们无法简单的直接设置其内部字体的颜色。

    自定义Spinner(PopupWindow实现的弹出下拉框)

    然而,系统默认的Spinner样式可能不能满足所有设计需求,因此开发者常常需要自定义Spinner来实现更丰富的交互效果。本节我们将深入探讨如何使用PopupWindow实现一个自定义的Spinner,以获得类似网站下拉窗口的效果。...

    WPF Spinner实现

    **WPF Spinner实现** 在Windows Presentation Foundation (WPF)中,Spinner是一种常见的用户界面元素,通常用于数值选择或进度指示。它由两个箭头按钮组成,一个用于增加值,另一个用于减少值。在这个项目中,我们...

Global site tag (gtag.js) - Google Analytics