您的位置:首页 > 编程语言 > Java开发

49.java编程思想——创建窗口和程序片 文本 复选框 单选框 下拉列表

2016-04-30 20:21 525 查看
49.java编程思想——创建窗口和程序片 文本 复选框 单选框 下拉列表
“文本字段”是允许用户输入和编辑文字的一种线性区域。文本字段从文本组件那里继承了让我们选择文字、让我们像得到字符串一样得到选择的文字,得到或设置文字,设置文本字段是否可编辑以及连同我们从在线参考书中找到的相关方法。

1     代码1

import java.awt.*;

import java.applet.*;

public
class
TextField1 extends Applet {

    Button b1 =
new Button("Get Text"),
b2 = new Button("Set Text");

    TextField t =
new TextField("Starting text", 30);

    String s =
new String();

    public
void
init() {

        add(b1);

        add(b2);

        add(t);

    }

    public
boolean
action(Event
evt,Object arg){

        if (evt.target.equals(b1)) {

            getAppletContext().showStatus(t.getText());

            s =
t.getSelectedText();

            if (s.length() == 0)

                s =
t.getText();

            t.setEditable(true);

        } else
if
(evt.target.equals(b2)) {

            t.setText("Inserted by Button 2: "+
s);

            t.setEditable(false);

        }

        // Let the base class handle it:

        else

            return
super
.action(evt,
arg)
;

        return
true
; // We'vehandled it here

    }

} /// :~

有几种方法均可构建一个文本字段;其中之一是提供一个初始字符串,并设置字符域的大小。

按下按钮1 是得到我们用鼠标选择的文字就是得到字段内所有的文字并转换成字符串S。它也允许字段被编辑。按下按钮2 放一条信息和字符串s 到Text fields,并且阻止字段被编辑(尽管我们能够一直选择文字)。文字的可编辑性是通过setEditable() 的真假值来控制的。

2     文本区域

“文本区域”很像文字字段,只是它拥有更多的行以及一些引人注目的更多的功能。另外你能在给定位置对一个文本字段追加、插入或者修改文字。这看起来对文本字段有用的功能相当不错,所以设法发现它设计的特性会产生一些困惑。我们可以认为如果我们处处需要“文本区域”的功能,那么可以简单地使用一个线型文字区域在我们将另外使用文本字段的地方。在Java 1.0 版中,当它们不是固定的时候我们也得到了一个文本区域的垂直和水平方向的滚动条。在Java 1.1 版中,对高级构建器的修改允许我们选择哪个滚动条是当前的。下面的例子演示的仅仅是在Java1.0
版的状况下滚动条一直打开。在下一章里我们将看到一个证明Java1.1 版中的文字区域的例程。

3     代码2

import java.awt.*;

import java.applet.*;

public
class
TextArea1 extends Applet {

    Button b1 =
new Button("Text Area 1");

    Button b2 =
new Button("Text Area 2");

    Button b3 =
new Button("Replace Text");

    Button b4 =
new Button("Insert Text");

    TextArea t1 =
new TextArea("t1", 1, 30);

    TextArea t2 =
new TextArea("t2", 4, 30);

 

    public
void
init() {

        add(b1);

        add(t1);

        add(b2);

        add(t2);

        add(b3);

        add(b4);

    }

 

    public
boolean
action(Event
evt,Object arg){

        if (evt.target.equals(b1))

            getAppletContext().showStatus(t1.getText());

        else
if
(evt.target.equals(b2)) {

            t2.setText("Inserted by Button 2");

            t2.appendText(": "+
t1.getText())
;

            getAppletContext().showStatus(t2.getText());

        } else
if
(evt.target.equals(b3)) {

            String s =
"Replacement ";

            t2.replaceText(s, 3, 3 +
s.length())
;

        } else
if
(evt.target.equals(b4))

            t2.insertText(" Inserted ",10);

        // Let the base class handle it:

        else

            return
super
.action(evt,
arg)
;

        return
true
; // We'vehandled it here

    }

} /// :~

程序中有几个不同的“文本区域”构建器,这其中的一个在此处显示了一个初始字符串和行号和列号。不同的按钮显示得到、追加、修改和插入文字。

4     标签

标签准确地运作:安放一个标签到窗体上。这对没有标签的TextFields 和Text areas 来说非常的重要,如果我们简单地想安放文字的信息在窗体上也能同样的使用。我们能像本章中第一个例程中演示的那样,使用drawString()里边的paint()在确定的位置去安置一个文字。当我们使用的标签允许我们通过布局管理加入其它的文字组件。

使用构建器我们能创建一条包括初始化文字的标签(这是我们典型的作法),一个标签包括一行CENTER(中间)、LEFT(左)和RIGHT(右)(静态的结果取整定义在类标签里)。如果我们忘记了可以用getText()和getalignment()读取值,我们同样可以用setText()和setAlignment()来改变和调整。

4.1     代码3

import java.awt.*;

import java.applet.*;

public
class
Label1 extends Applet {

    TextField t1 =
new TextField("t1", 10);

    Label labl1 =
new Label("TextField t1");

    Label labl2 =
new Label(" ");

    Label labl3 =
new Label(" ", Label.RIGHT);

    Button b1 =
new Button("Test 1");

    Button b2 =
new Button("Test 2");

    public
void
init() {

        add(labl1);

        add(t1);

        add(b1);

        add(labl2);

        add(b2);

        add(labl3);

    }

 

    public
boolean
action(Event
evt,Object arg){

        if (evt.target.equals(b1))

            labl2.setText("Text set into Label");

        else
if
(evt.target.equals(b2)) {

            if (labl3.getText().trim().length() == 0)

                labl3.setText("labl3");

            if (labl3.getAlignment() == Label.LEFT)

                labl3.setAlignment(Label.CENTER);

            else
if
(labl3.getAlignment() == Label.CENTER)

                labl3.setAlignment(Label.RIGHT);

            else
if
(labl3.getAlignment() == Label.RIGHT)

                labl3.setAlignment(Label.LEFT);

        } else

            return
super
.action(evt,
arg)
;

        return
true
;

    }

} /// :~

首先是标签的最典型的用途:标记一个文本字段或文本区域。在例程的第二部分,当我们按下“test 1”按钮通过setText()将一串空的空格插入到的字段里。因为空的空格数不等于同样的字符数(在一个等比例间隔的字库里),当插入文字到标签里时我们会看到文字将被省略掉。在例子的第三部分保留的空的空格在我们第一次按下“test 2”会发现标签是空的(trim()删除了每个字符串结尾部分的空格)并且在开头的左列插入了一个短的标签。在工作的其余时间中我们按下按钮进行调整,因此就能看到效果。

我们可能会认为我们可以创建一个空的标签,然后用setText()安放文字在里面。然而我们不能在一个空标签内加入文字-这大概是因为空标签没有宽度-所以创建一个没有文字的空标签是没有用处的。在上面的例子里,“blank”标签里充满空的空格,所以它足够容纳后面加入的文字。

同样的,setAlignment()在我们用构建器创建的典型的文字标签上没有作用。这个标签的宽度就是文字的宽度,所以不能对它进行任何的调整。但是,如果我们启动一个长标签,然后把它变成短的,我们就可以看到调整的效果。

这些导致事件连同它们最小化的尺寸被挤压的状况被程序片使用的默认布局管理器所发现。

5     复选框

复选框提供一个制造单一选择开关的方法;它包括一个小框和一个标签。典型的复选框有一个小的“X”(或者它设置的其它类型)或是空的,这依靠项目是否被选择来决定的。

我们会使用构建器正常地创建一个复选框,使用它的标签来充当它的自变量。如果我们在创建复选框后想读出或改变它,我们能够获取和设置它的状态,同样也能获取和设置它的标签。注意,复选框的大写是与其它的控制相矛盾的。

无论何时一个复选框都可以设置和清除一个事件指令,我们可以捕捉同样的方法做一个按钮。在下面的例子里使用一个文字区域枚举所有被选中的复选框:

5.1     代码4

import java.awt.*;

import java.applet.*;

public
class
CheckBox1 extends Applet {

    TextArea t =
new TextArea(6, 20);

    Checkbox cb1 =
new Checkbox("Check Box 1");

    Checkbox cb2 =
new Checkbox("Check Box 2");

    Checkbox cb3 =
new Checkbox("Check Box 3");

    public
void
init() {

        add(t);

        add(cb1);

        add(cb2);

        add(cb3);

    }

    public
boolean
action(Event
evt,Object arg){

        if (evt.target.equals(cb1))

            trace("1",
cb1.getState());

        else
if
(evt.target.equals(cb2))

            trace("2",
cb2.getState());

        else
if
(evt.target.equals(cb3))

            trace("3",
cb3.getState());

        else

            return
super
.action(evt,
arg)
;

        return
true
;

    }

    void trace(String
b,booleanstate){

        if (state)

            t.appendText("Box "+
b+ " Set\n")
;

        else

            t.appendText("Box "+
b+ " Cleared\n")
;

    }

} /// :~

trace()方法将选中的复选框名和当前状态用appendText()发送到文字区域中去,所以我们看到一个累积的被选中的复选框和它们的状态的列表。

6     单选钮

单选钮在GUI 程序设计中的概念来自于老式的电子管汽车收音机的机械按钮:当我们按下一个按钮时,其它的按钮就会弹起。因此它允许我们强制从众多选择中作出单一选择。

AWT 没有单独的描述单选钮的类;取而代之的是复用复选框。然而将复选框放在单选钮组中(并且修改它的外形使它看起来不同于一般的复选框)我们必须使用一个特殊的构建器象一个自变量一样的作用在checkboxGroup 对象上。(我们同样能在创建复选框后调用setCheckboxGroup()方法。)

一个复选框组没有构建器的自变量;它存在的唯一理由就是聚集一些复选框到单选钮组里。一个复选框对象必须在我们试图显示单选钮组之前将它的状态设置成true,否则在运行时我们就会得到一个异常。如果我们设置超过一个的单选钮为true,只有最后的一个能被设置成真。

6.1     代码5

import java.awt.*;

import java.applet.*;

public
class
RadioButton1 extends Applet {

    TextField t =
new TextField("Radio button 2", 30);

    CheckboxGroup g =
new CheckboxGroup();

    Checkbox cb1 =
new Checkbox("one",
g, false),
cb2 = new Checkbox("two",
g, true),

            cb3 =
new Checkbox("three",
g, false);

 

    public
void
init() {

        t.setEditable(false);

        add(t);

        add(cb1);

        add(cb2);

        add(cb3);

    }

 

    public
boolean
action(Event
evt,Object arg){

        if (evt.target.equals(cb1))

            t.setText("Radio button 1");

        else
if
(evt.target.equals(cb2))

            t.setText("Radio button 2");

        else
if
(evt.target.equals(cb3))

            t.setText("Radio button 3");

        else

            return
super
.action(evt,
arg)
;

        return
true
;

    }

} /// :~

显示的状态是一个文字字段在被使用。这个字段被设置为不可编辑的,因为它只是用来显示数据而不是收集。这演示了一个使用标签的可取之道。注意字段内的文字是由最早选择的单选钮“Radio button 2”初始化的。

我们可以在窗体中拥有相当多的复选框组。

7     下拉列表

下拉列表像一个单选钮组,它是强制用户从一组可实现的选择中选择一个对象的方法。而且,它是一个实现这点的相当简洁的方法,也最易改变选择而不至使用户感到吃力(我们可以动态地改变单选钮,但那种方法显然不方便)。Java 的选择框不像Windows 中的组合框可以让我从列表中选择或输入自己的选择。在一个选择框中你只能从列表中选择仅仅一个项目。在下面的例子里,选择框从一个确定输入的数字开始,然后当按下一个按钮时,新输入的数字增加到框里。

8     代码6

import java.awt.*;

import java.applet.*;

public
class
Choice1 extends Applet {

    String[] description = {
"Ebullient", "Obtuse","Recalcitrant",
"Brilliant", "Somnescent",
"Timorous", "Florid",

            "Putrescent" };

    TextField t =
new TextField(30);

    Choice c =
new Choice();

    Button b =
new Button("Add items");

    int
count= 0;

    public
void
init() {

        t.setEditable(false);

        for (int
i = 0; i < 4;
i++)

            c.addItem(description[count++]);

        add(t);

        add(c);

        add(b);

    }

    public
boolean
action(Event
evt,Object arg){

        if (evt.target.equals(c))

            t.setText("index: " +
c.getSelectedIndex() +
" " + (String) arg);

        else
if
(evt.target.equals(b)) {

            if (count <
description.length)

                c.addItem(description[count++]);

        } else

            return
super
.action(evt,
arg)
;

        return
true
;

    }

} /// :~

文本字字段中显示的“selected index,"也就是当前选择的项目的序列号,在事件中选择的字符串就像action()的第二个自变量的字串符描述的一样好。

运行这个程序片时,请注意对Choice 框大小的判断:在windows 里,这个大小是在我们拉下列表时确定的。

这意味着如果我们拉下列表,然后增加更多的项目到列表中,这项目将在那,但这个下拉列表不再接受。然而,如果我们在第一次拉下下拉列表前将所的项目装入下拉列表,它的大小就会合适。当然,用户在使用时希望看到整个的列表,所以会在下拉列表的状态里对增加项目到选择框里加以特殊的限定。

9     列表框

列表框与选择框有完全的不同,而不仅仅是当我们在激活选择框时的显示不同,列表框固定在屏幕的指定位置不会改变。另外,一个列表框允许多个选择:如果我们单击在超过一个的项目上,未选择的则表现为高亮度,我们可以选择象我们想要的一样的多。如果我们想察看项目列表,我们可以调用getSelectedItem()来产生一个被选择的项目列表。要想从一个组里删除一个项目,我们必须再一次的单击它。列表框,当然这里有一个问题就是它默认的动作是双击而不是单击。单击从组中增加或删除项目,双击调用action()。解决这个问题的方法是象下面的程序假设的一样重新培训我们的用户。

9.1     代码7

import java.awt.*;

import java.applet.*;

public
class
List1 extends Applet {

    String[] flavors = {
"Chocolate", "Strawberry","Vanilla Fudge Swirl",
"Mint Chip", "Mocha Almond Fudge",

            "Rum Raisin",
"Praline Cream","Mud Pie" };

    // Show 6items, allow multiple selection:

    List lst =
new List(6, true);

    TextArea t =
new TextArea(flavors.length, 30);

    Button b =
new Button("test");

    int
count= 0;

    public
void
init() {

        t.setEditable(false);

        for (int
i = 0; i < 4;
i++)

            lst.addItem(flavors[count++]);

        add(t);

        add(lst);

        add(b);

    }

    public
boolean
action(Event
evt,Object arg){

        if (evt.target.equals(lst)) {

            t.setText("");

            String[]
items = lst.getSelectedItems();

            for (int
i = 0; i <
items.length;
i++)

                t.appendText(items[i] +
"\n")
;

        } else
if
(evt.target.equals(b)) {

            if (count <
flavors.length)

                lst.addItem(flavors[count++], 0);

        } else

            return
super
.action(evt,
arg)
;

        return
true
;

    }

} /// :~

按下按钮时,按钮增加项目到列表的顶部(因为addItem()的第二个自变量为零)。增加项目到列表框比到选择框更加的合理,因为用户期望去滚动一个列表框(因为这个原因,它有内建的滚动条)但用户并不愿意像在前面的例子里不得不去计算怎样才能滚动到要要的那个项目。

然而,调用action()的唯一方法就是通过双击。如果我们想监视用户在我们的列表中的所作所为(尤其是单击),我们必须提供一个可供选择的方法。

9.2     h a n d l e E v e n t ( )

已使用了action(),现有另一种方法handleEvent()可对每一事件进行尝试。当一个事件

发生时,它总是针对单独事件或发生在单独的事件对象上。该对象的handleEvent()方法是自动调用的,并且是被handleEvent() 创建并传递到handleEvent()里。默认的handleEvent()(handleEvent()定义在组件里,基础类的所有控件都在AWT 里)将像我们以前一样调用action()或其它同样的方法去指明鼠标的活动、键盘活动或者指明移动的焦点。我们将会在本章的后面部分看到。如果其它的方法-特别是action()-不能满足我们的需要怎么办呢?至于列表框,例如,如果我想捕捉鼠标单击,但action()只响应双击怎么办呢?这个解答是过载handleEvent(),毕竟它是从程序片中得到的,因此可以过载任何非确定的方法。当我们为程序片过载handleEvent()时,我们会得到所有的事件在它们发送出去之前,所以我们不能假设“这里有我的按钮可做的事件,所以我们可以假设按钮被按下了”从它被action()设为真值。在handleEvent()
中按钮拥有焦点且某人对它进行分配都是可能的。不论它合理与否,我们可测试这些事件并遵照handleEvent()来进行操作。为了修改列表样本,使它会响应鼠标的单击,在action()中按钮测试将被过载,但代码会处理的列表将像下面的例子被移进handleEvent()中去:

9.3     代码8

import java.awt.*;

import java.applet.*;

public
class
List2 extends Applet {

    String[] flavors = {
"Chocolate", "Strawberry","Vanilla Fudge Swirl",
"Mint Chip", "Mocha Almond Fudge",

            "Rum Raisin",
"Praline Cream","Mud Pie" };

    // Show 6items, allow multiple selection:

    List lst =
new List(6, true);

    TextArea t =
new TextArea(flavors.length, 30);

    Button b =
new Button("test");

    int
count= 0;

 

    public
void
init() {

        t.setEditable(false);

        for (int
i = 0; i < 4;
i++)

            lst.addItem(flavors[count++]);

        add(t);

        add(lst);

        add(b);

    }

 

    public
boolean
handleEvent(Event
evt){

        if (evt.id== Event.LIST_SELECT ||
evt.id == Event.LIST_DESELECT){

            if (evt.target.equals(lst)) {

                t.setText("");

                String[]
items = lst.getSelectedItems();

                for (int
i = 0; i <
items.length;
i++)

                    t.appendText(items[i] +
"\n")
;

            } else

                return
super
.handleEvent(evt);

        } else

            return
super
.handleEvent(evt);

        return
true
;

    }

 

    public
boolean
action(Event
evt,Object arg){

        if (evt.target.equals(b)) {

            if (count <
flavors.length)

                lst.addItem(flavors[count++], 0);

        } else

            return
super
.action(evt,
arg)
;

        return
true
;

    }

} /// :~

这个例子同前面的例子相同除了增加了handleEvent()外简直一模一样。在程序中做了试验来验证是否列表框的选择和非选择存在。现在请记住,handleEvent()被程序片所过载,所以它能在窗体中任何存在,并且被其它的列表当成事件来处理。因此我们同样必须通过试验来观察目标。(虽然在这个例子中,程序片中只有一个列表框所以我们能假设所有的列表框事件必须服务于列表框。这是一个不好的习惯,一旦其它的列表框加入,它就会变成程序中的一个缺陷。)如果列表框匹配一个我们感兴趣的列表框,像前面的一样的代码将按上面的策略来运行。注意handleEvent()的窗体与action()的相同:如果我们处理一个单独的事件,将返回真值,但如果我们对其它的一些事件不感兴趣,通过handleEvent()我们必须返回super.handleEvent()值。这便是程序的核心,如果我们不那样做,其它的任何一个事件处理代码也不会被调用。例如,试注解在上面的代码中返回super.handleEvent(evt)
的值。我们将发现action() 没有被调用,当然那不是我们想得到的。对action() 和handlEvent()而言,最重要的是跟着上面例子中的格式,并且当我们自己不处理事件时一直返回基础类的方法版本信息。(在例子中我们将返回真值)。(幸运的是,这些类型的错误的仅属于Java1.0 版,在本章后面将看到的新设计的Java 1.1 消除了这些类型的错误。)在windows 里,如果我们按下shift 键,列表框自动允许我们做多个选择。这非常的棒,因为它允许用户做单个或多个的选择而不是编程期间固定的。我们可能会认为我们变得更加的精明,并且当一个鼠标单击被evt.shiftdown()产生时如果shift
键是按下的将执行我们自己的试验程序。AWT 的设计妨碍了我们-我们不得不去了解哪个项目被鼠标点击时是否按下了shift 键,所以我们能取消其余部分所有的选择并且只选择那一个。不管怎样,我们是不可能在Java 1.0 版中做出来的。(Java 1.1 将所有的鼠标、键盘、焦点事件传送到列表中,所以我们能够完成它。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: