当前位置:文档之家› [java入门学习]第_8_章_Swing组件

[java入门学习]第_8_章_Swing组件

[java入门学习]第_8_章_Swing组件
[java入门学习]第_8_章_Swing组件

第8章Swing组件

在第7章中,介绍了用AWT创建图形用户界面的基本原理。在java.awt包中,提供了各种具体的组件,如Frame、Panel、Button、Label等。AWT组件的优点是简单、稳定,同时兼容于任何JDK版本,缺点是依赖于本地操作系统的GUI,缺乏平台的独立性。为了实现跨平台,使得用java创建的图形界面在不同操作系统中保持相同的外观,从JKD1.2版本开始引入了Swing组件,这些组件位于javax.swing包中, Swing GUI组件定义了相对于java.awt 包更多、更强的功能,可以使用户更加灵活方便的进行GUI的设计。

Swing组件时用纯Java语言编写的,不依赖于本地操作系统的GUI,Swing组件可以跨平台运行。独立于本地平台的Swing组件被称为轻量级组件,而依赖于本地平台的AWT组件被称为重量级组件。

多数Swing组件的父类为javax.swing.JComponent,JComponent 的直接父类为java.awt.Container,与AWT中的Window与Panel处于同一个继承类层次。多数Swing组件类都是以大写字母“J”开头,图8-1显示了Swing组件的类层次结构。从图中可以看出,除JFrame外,其余的Swing组件都继承自JComponent类。

图8-1 Swing组件的类层次结构

8.1 容器组件

8.1.1 JFrame

JFrame是用来替代AWT包中Frame的,可以实现与Frame相同的功能,包括作为容器容纳其他组件,显示组件等。

[例8-1]

import javax.swing.*;

import java.awt.*;

class JFrameTest extends JFrame{

private JButton button1 = new JButton("button1");

private JButton button2 = new JButton("button2");

public JFrameTest(String title){

super(title);//设置标题

this.setBounds(50,50,200,150);

//获得与JFrame关联的contentPane,contentPane默认的布局管理器是BorderLayout

Container contentPane = this.getContentPane();

contentPane.setLayout(new FlowLayout(5));

contentPane.add(button1);

contentPane.add(button2);

this.setVisible(true);

//设置JFrame对关闭按钮的处理方式

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

public class Test8_1 {

public static void main(String[] args) {

new JFrameTest("JFrame测试");

}

}

程序运行界面如下:

图8-2 例8-1运行界面

利用JFrame实现了与Frame相同的功能,但JFrame与Frame在使用上还是有很大区别的。

(1)两者都可以添加其他组件到窗口中,Frame直接使用add方法添加相应的组件;JFrame 则不能直接通过add方法添加组件,每个JFrame都有一个与之关联的内容面板(contentPane),只能针对这个contentPane添加相应组件。

(2)两者都可以设置布局管理器,Frame直接使用setLayout即可设置;JFrame则需先得到其内容面板,对其内容面板设置布局管理器。

(3)Frame要想关闭窗口需要编写相应的事件处理程序(见例7-12),而JFrame则不必编写事件处理程序,只需调用方法setDefaultCloseOperation(int operation),通过设置operation的值来响应用户关闭窗体的操作,该方法的参数operation的值有以下三个。

JFrame.DO_NOTHING_ON_CLOS:什么也不做

JFrame.HIDE_ON_CLOSE:隐藏窗体,这是JFrame的默认选项

JFrame.EXIT_ON_CLOSE:关闭窗体,结束程序

8.1.2 Jpanel

JPanel是使用最多的组件之一,它是AWT中Panel的替代组件。其默认的布局管理器是FlowLayout布局管理器。

利用JPanel可以实现更为复杂的布局,如BorderLayout布局管理策略,只允许添加5个组件,那么我们可以在5个区域中添加5个JPanel,而每个JPanel又可以根据不同的布局管理策略添加多个组件,只要你愿意,可以添加任意多个你想添加的组件。时

8.1.3 JTabbedPane

当窗口的组件元素过多时,我们可以将这些组件分组放到不同的页面中,java提供了JTabbedPane页签面板来实现。JTabbedPane包含多个选项卡,每个页面和一个选项卡相对应,每个选项卡又是一个容器(一般用JPanel类来封装),可以包含其他的GUI组件,选项卡可以显示图标和文本。当用户选择特定的标签后,就会显示相应的选项卡,并且会触发ChangeEvent事件,该事件由ChangeListener监听器响应。

JTabbedPane提供了如下三个构造方法用于创建JTabbedPane类对象。

表8-1 JTabbedPane构造方法

构造方法说明

public JTabbedPane() 创建一个具有默认的JTabbedPane.TOP选项卡布局

的空TabbedPane。

public JTabbedPane(int tabPlacement) 创建一个空的TabbedPane,使其按照tabPlacement

值指定选项卡的布局

public JTabbedPane

(int tabPlacement, int tabLayoutPolicy) 创建一个空的TabbedPane,使其具有指定的选项卡布局(tabPlacement值指定)和选项卡布局策略(tabLayoutPolicy指定)。

构造方法中涉及的两个参数的含义及具体值如下:

tabPlacement:选项卡布局,int枚举类型,值为JTabbedPane.TOP、JTabbedPane.BOTTOM、JTabbedPane.LEFT或JTabbedPane.RIGHT,分别表示将标签文本显示在上方、下方、左侧、右侧。

tabLayoutPolicy:一行不能放置所有选项卡标签值时的放置策略,int枚举类型,值为JTabbedPane.WRAP_TAB_LAYOUT或JTabbedPane.SCROLL_TAB_LAYOUT。

JTabbedPane.WRAP_TAB_LAYOUT—表示在容器中显示所有标签,如果一排内不能容纳,则把剩下的标签放到下一排。

JTabbedPane.SCROLL_TAB_LAYOUT—只显示一排标签,剩下的标签可以通过滚动图标显示。

[例8-2]中定义了一个JTabbedPaneTest类,在该类中添加了一个 JTabbedPane类对象,为该类对象添加了六个选项卡,程序可以完成点击任何一个选项卡,在窗口下方的JTextField中显示出相应的选项卡的标题。

[例8-2]

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;

class JTabbedPaneTest extends JFrame{

private JTabbedPane jtabbedpane = new JTabbedPane();

private JTextField jtextField = new JTextField();

public JTabbedPaneTest(String title){

super(title);

Container contentPane = this.getContentPane();

//添加六个选项卡

jtabbedpane.addTab("第一页", new JPanel());

jtabbedpane.addTab("第二页", new JPanel());

jtabbedpane.addTab("第三页", new JPanel());

jtabbedpane.addTab("第四页", new JPanel());

jtabbedpane.addTab("第五页", new JPanel());

jtabbedpane.addTab("第六页", new JPanel());

//注册监听器

jtabbedpane.addChangeListener(new MyChangeListener());

contentPane.add(jtextField,BorderLayout.SOUTH);

contentPane.add(jtabbedpane,BorderLayout.CENTER);

this.setSize(300,200);

this.setVisible(true);

}

//命名内部类处理Change事件

private class MyChangeListener implements ChangeListener{

public void stateChanged(ChangeEvent e) {

String temp =

jtabbedpane.getTitleAt(jtabbedpane.getSelectedIndex());

jtextField.setText(temp+"被选择");

}

}

}

public class Test8_2 {

public static void main(String[] args) {

new JTabbedPaneTest("JTabbedPane测试");

}

}

程序运行结果如图8-3左侧所示。

将创建JTabbedPane类对象的无参构造方法修改为

private JTabbedPane jtabbedpane = new

JTabbedPane(JTabbedPane.BOTTOM,JTabbedPane.SCROLL_TAB_LAYOUT);

事件处理中有如下一段代码:

String temp = jtabbedpane.getTitleAt(jtabbedpane.getSelectedIndex()); getSelectedIndex()方法表示获得当前选择的选项卡的索引值(int类型,从0开始,-1表示未选中任何选项卡)。

getTitleAt(index)方法表示获得索引值为index的选项卡的标题。

8.1.4 JScrollPane

JSCrollPane又称滚动面板,可以用于当窗口中的内容大于窗口时,在窗口的右边和下边设置滚动条,借助滚动条就可以看到整个窗口的内容。JSCrollPane的直接父类为JComponent。

JSCrollPane提供了四个构造方法用于创建JSCrollPane类对象,见下表。

构造方法说明

JScrollPane()创建一个空的JSCrollPane对象

JScrollPane(Component view)创建JSCrollPane对象,并加入一个view组件,当组

件内容大于显示区域时自动产生滚动条

JScrollPane(int vsbPolicy,

int hsbPolicy)

创建有水平滚动条和垂直滚动条的JSCrollPane对象

JScrollPane(Component view, int vsbPolicy,int hsbPolicy) 创建有水平滚动条和垂直滚动条的JSCrollPane对象,并在其内加入一个view对象

例了。

8.2 按钮控件

图8-1中有一个AbstractButton类,该类是Swing中所有按钮的父类,该类的三个直接派生类JButton、JToggleButton和JMenuItem。

JButton与AWT中的Button类似,JButton有一个直接子类为BasicArrowButton,是一个带有箭头的按钮(箭头有上、下、左、右四个方向)。

JToggleButton表示一个切换按钮,该类有两个直接子类是我们经常使用到的,JRadioButton—单选按钮和JCheckBox—复选按钮。

JMenuItem包括三个直接子类,它们都是与菜单相关的按钮。

程序[例8-3]演示了各个按钮的用法。

[8-3]

import java.awt.*;

import javax.swing.*;

import javax.swing.plaf.basic.BasicArrowButton;

import java.awt.event.*;

class ButtonsTest extends JFrame{

private JButton jbutton = new JButton("JButton");

private BasicArrowButton

basicArrowButtonUp= new

BasicArrowButton(BasicArrowButton.NORTH),

basicArrowButtonDown= new

BasicArrowButton(BasicArrowButton.SOUTH),

basicArrowButtonLeft= new

BasicArrowButton(BasicArrowButton.WEST),

basicArrowButtonRight= new

BasicArrowButton(BasicArrowButton.EAST);

private JToggleButton jtoggleButton = new

JToggleButton("JToggleButton");

private JCheckBox jcheckBox = new JCheckBox("JCheckBox");

private JRadioButton jradioButton = new

JRadioButton("JRadioButton");

public ButtonsTest(String title){

super(title);

Container contentPane = this.getContentPane();

contentPane.setLayout(new FlowLayout(5));

contentPane.add(jbutton);

contentPane.add(basicArrowButtonUp);

contentPane.add(basicArrowButtonDown);

contentPane.add(basicArrowButtonLeft);

contentPane.add(basicArrowButtonRight);

contentPane.add(jtoggleButton);

contentPane.add(jcheckBox);

contentPane.add(jradioButton);

this.pack();

this.setVisible(true);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

public class Test8_3 {

public static void main(String[] args) {

new ButtonsTest("java各种按钮测试");

}

}

运行结果如下。

图8-4 例8-3运行结果

所有按钮组件单击时都可触发ActionListener事件,如果需要对这些按钮做某些处理,可构造事件处理器实现ActionListener进行事件处理。JRadioButton和JCheckBox在编程中经常使用到,我们会在8.4节选择组件中详细介绍。

8.3文本输入

在java中,能够用于文本输入的组件包括JTextField(文本框)、JTextArea(文本区)以及JPasswordField(密码框),JLabel(标签)不支持文本输入,但可以容纳文本。

8.3.1 JTextFileld 文本框

JTextField文本框是一个允许编辑单行文本的swing组件,JTextField提供了多个构造方法用于创建JTextField对象。具体见下表8-3。

表8-3 JTextField构造方法

构造方法说明

public JTextField() 构造一个新的TextField。初始字符串为null,列数为0 public JTextField(String text) 构造一个用指定文本初始化的新TextField。列数为0 public JTextField(int columns) 构造一个具有指定列数的新的空TextField。初始字符串为

null。

public JTextField (String text,int columns) 构造一个用指定文本和列初始化的新TextField。text:文本值,columns:列数

JTextField有两个重要的方法setText(String t)和getText()分别用于设置文本框的显示文本和获取当前文本框的文本。不过这两个方法都不是JTextField本身提供的方法,而是其父类JTextComponent所提供的。

JTextField类可引发ActionEvent事件,当用户在文本框中按下回车键时触发。

8.3.2 JTextArea 文本区

JTextArea文本区是一个允许编辑多行文本的swing组件,JTextArea提供了多个构造方法用于创建JTextArea对象。具体见下表8-4。

构造方法说明

JTextArea() 构造新的TextArea。初始字符串为null,行/列设置为0。JTextArea(String text) 构造显示指定文本的新的TextArea。行/列设置为0

JTextArea(int rows, int columns)构造具有指定行数和列数的新的空TextArea。初始字符串为null

JTextArea(String text, int rows,int columns)构造具有指定文本、行数和列数的新的TextArea。text:文本值,rows:行数,columns:列数

因为JTextArea是JTextComponent的直接子类,因此与JTextField一样,也可以通过setText(String t)和getText()方法设置和获取文本区的文本值。

JTextArea类可引发ActionEvent事件,当用户在文本区中按下回车键时触发。

8.3.3 JPasswordField密码框

在AWT组件中,并没有单独的密码框组件,而是通过TextField的一个setEchoChar()方法来得到密码框,但在Swing中则单独通过一个类JPasswordField来表示。密码框是文本框JTextField组件的简单扩展。因此,其构造方法与JTextField相类似,这里不再介绍。JPasswordField类中有几个重要方法,如下:

成员方法说明

public char[] getPassword() 获得密码的字符数组表示,用来替代getText()方法public void setEchoChar(char c) 设置此JPasswordField的回显字符

public char getEchoChar() 返回要用于回显的字符

8.3.4 JLabel标签

JLabel是一个静态组件,该组件可以显示一行静态文本,一般只是一个说明性的文字,而不接受用户的输入,也无事件响应。

JLabel提供了如下方法用于构建JLabel对象

构造方法说明

JLabel() 创建无图像并且其标题为空字符串的JLabel类对象JLabel(Icon image) 创建具有指定图像的JLabel类对象

public JLabel(Icon image,

int horizontalAlignment)

创建具有指定图像和水平对齐方式的JLabe类对象JLabel(String text) 创建具有指定文本的JLabel类对象

JLabel(String text,Icon icon, int horizontalAlignment)创建具有指定文本、图像和水平对齐方式的JLabel 类对象

JLabel(String text,

int horizontalAlignment)

创建具有指定文本和水平对齐方式的JLabel类对象

构造方法中各参数意义

Image:显示在JLabel上的图标。

horizontalAlignment:JLabel上文字的对齐方式,其值为int枚举型,值包括SwingConstants.LEFT、SwingConstants.CENTER、SwingConstants.RIGHT、SwingConstants.LEADING和SwingConstants.TRAILING。

text:显示在JLabel上的文字。

以下的例8-4演示了本节中所介绍的各个组件的用法,界面可提供用户输入用户名和密码,按下回车后在JTextArea显示区显示用户输入的用户名和密码信息,不允许用户名或密码为空。

[例8-4]

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

class TextInputTest extends JFrame{

private JTextField userName = new JTextField(10);

private JTextArea ta = new JTextArea(4,10);

private JPasswordField password = new JPasswordField(10);

private JLabel label1 = new JLabel("用户名");

private JLabel label2 = new JLabel("密码");

public TextInputTest(String title){

super(title);

password.setEchoChar('*');//设置回显字符

Container contentPane = this.getContentPane();

JPanel panelNorth = new JPanel();

JPanel panelCenter = new JPanel();

panelNorth.add(label1);

panelNorth.add(userName);

panelCenter.add(label2);

panelCenter.add(password);

contentPane.add(panelNorth,BorderLayout.NORTH);

contentPane.add(panelCenter,BorderLayout.CENTER);

contentPane.add(ta,BorderLayout.SOUTH);

pack();

//监听userName和password控件

userName.addActionListener(new MyActionListener());

password.addActionListener(new MyActionListener());

this.setVisible(true);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

private class MyActionListener implements ActionListener{ public void actionPerformed(ActionEvent arg0) {

String name = userName.getText();

char[] pwd = password.getPassword();

if(name.length()==0){

ta.setText("请输入用户名");

return;

}

if(pwd.length==0){

ta.setText("请输入密码");

return;

}

//new String(pwd)将字符数组pwd转换为字符串

ta.setText("用户名:"+name+"\n密码:"+new String(pwd));

}

}

}

public class Test8_4 {

public static void main(String[] args) {

new TextInputTest("文本输入控件测试");

}

}

程序运行结果如图8-5所示

用户名密码都输入按回车只输入密码按回车只输入用户名按回车

图8-5 例8-4不同输入情况下的运行结果

例8-4中用到了容器的嵌套,JFrame的North和Center添加的都是JLabel对象,而两个JLabel对象里又添加了其他组件,在程序中没有使用setLayout设置JFrame和JLabel的布局策略,原因是两者的默认布局策略正好可以满足我们的布局。

8.4选择组件

经过上节的学习,我们知道了如何利用文本输入组件获取用户输入的文本,但是,在很多情况下,用户可能更倾向于你给他一些选择,而不是让他自己输入这些信息。Java中提供了这样的组件,可以使用户不需输入文字而与GUI界面进行交互。

8.4.1 JCheckBox 复选框

JCheckBox是从JToggleButton类中派生出来的,具有两种状态,通常用于显示文本,并有一个指示是否被选中的方形按钮。

JCheckBox的构造方法较多,详见下表8-7。

表8-7 JCheckBox构造方法

构造方法说明

JCheckBox() 创建一个没有文本、没有图标并且最初未被选定的复选框JCheckBox(Icon icon) 创建有一个图标、最初未被选定的复选框

JCheckBox(Icon icon, boolean selected) 创建一个带图标的复选框,并指定其最初是否处于选定状态

JCheckBox(String text) 创建一个带文本的、最初未被选定的复选框

JCheckBox(String text,

boolean selected) 创建一个带文本的复选框,并指定其最初是否处于选定状态

JCheckBox(String text, 创建带有指定文本和图标的、最初未选定的复选框

Icon icon)

JCheckBox(String text, Icon icon,boolean selected)创建一个带文本和图标的复选框,并指定其最初是否处于选定状态

构造方法中各参数意义

text - 复选框的文本

icon - 要显示的 Icon 图像

selected - 指示最初选择状态的 boolean 值。如果该参数为 true,则复选框被选定当JCheckBox被选中或取消选中时,会触发一个事件,该事件就是ActionEvent,如果想根据JCheckBox的选中情况进行不同处理,可以编写实现ActionListener接口的类进行处理。

8.4.2 JRadioButton单选按钮

单选按钮JRadioButton与复选按钮JCheckBox几乎是相同的,都是从JToggleButton类中派生出来的,都具有两种状态,主要用于显示文本。JRadioButton有一个指示是否被选中的圆形按钮。不同之处在于单选按钮机会总是用于显示一组互相排斥的选项(如某人的性别,男、女只能选择一项),所以,JRadioButton通常位于一个ButtonGroup按钮组中,不在按钮组中的JRadioButton也就失去了JRadioButton的意义。

在同一个ButtonGroup按钮组种的单选按钮,任何时刻最多有一个单选按钮被选中,因此,如果我们创建的多个单选按钮其初始状态都是选中状态,则最先加入ButtonGroup按钮组的单选按钮的选中状态被保留,其后加入到ButtonGroup按钮组中的其他单选按钮的选中状态被取消。选中状态的保留与加入到ButtonGroup中的次序有关,与加入到其要显示的父容器顺序无关。

如下代码中

Container contentPane = this.getContentPane();

JRadioButton r1 = new JRadioButton("a",true);

JRadioButton r2 = new JRadioButton("b",true);

JRadioButton r3 = new JRadioButton("c",true);

ButtonGroup button = new ButtonGroup();

button.add(r3);

button.add(r2);

button.add(r1);

contentPane.setLayout(new FlowLayout());

contentPane.add(r2);

contentPane.add(r1);

contentPane.add(r3);

加入ButtonGroup中的JRadioButton的顺序为r3,r2,r1,而加入contentPane中的书序则为r2,r1,r2,这时候其运行效果如下:

可见其状态选中是根据加入ButtonGroup 中的顺序决定的

JRadioButton 提供了与JCheckBox 完全相似的构造方法。见下表8-8

构造方法 说明

JRadioButton() 创建一个初始化为未选择的单选按钮,其文本未设定 JRadioButton(Icon icon)

创建一个初始化为未选择的单选按钮,其具有指定的图像但无文本

JRadioButton(Icon icon, boolean selected) 创建一个具有指定图像和选择状态的单选按钮,但无文本

JRadioButton(String text)

创建一个具有指定文本的状态为未选择的单选按钮

JRadioButton(String text, boolean selected) 创建一个具有指定的文本和图像并初始化为未选择的单

选按钮 JRadioButton(String text,

Icon icon)

创建一个具有指定的文本和图像并初始化为未选择的单选按钮

JRadioButton(String text, Icon icon,boolean selected)

创建一个具有指定的文本、图像和选择状态的单选按钮 构造方法中各参数意义

text -此单选按钮上显示的字符串 icon -此按钮应显示的图像

selected - 指示最初选择状态的 boolean 值。如果该参数为 true ,则单选框被选定

当JRadioButton 被选中或取消选中时,会触发一个事件,该事件就是ActionEvent ,如果想根据JRadioButton 的选中情况进行不同处理,可以编写实现ActionListener 接口的类进行处理。

例8-5 中在JFrame 添加了两个JRadioButton 及三个JCheckBox ,验证我们所学的部分知识。 [例 8-5]

import java.awt.*; import javax.swing.*; import java.awt.event.*;

class JCheckBoxAndJRadioButtonTest extends JFrame{ private JPanel panelNorth = new JPanel(); private JLabel label1 = new JLabel("性别");

private JRadioButton rb1 = new JRadioButton("男",true ); private JRadioButton rb2 = new JRadioButton("女"); private ButtonGroup group = new ButtonGroup(); private JLabel label2 = new JLabel("擅长"); private JCheckBox cb1= new JCheckBox("书法"); private JCheckBox cb2= new JCheckBox("唱歌"); private JCheckBox cb3= new JCheckBox("跳舞"); private JButton button = new JButton("确定"); private JTextArea ta = new JTextArea(6,10);

public JCheckBoxAndJRadioButtonTest(String title){

super(title);

Container contentPane = this.getContentPane();

//添加JRadioButton到ButtonGroup中

group.add(rb1);

group.add(rb2);

panelNorth.add(label1);

panelNorth.add(rb1);

panelNorth.add(rb2);

panelNorth.add(label2);

panelNorth.add(cb1);

panelNorth.add(cb2);

panelNorth.add(cb3);

panelNorth.add(button);

contentPane.add(panelNorth,BorderLayout.NORTH);

contentPane.add(ta,BorderLayout.CENTER);

pack();

//监听button的Action事件

button.addActionListener(new MyActionListener());

this.setVisible(true);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }

private class MyActionListener implements ActionListener{ public void actionPerformed(ActionEvent e) {

String sex="";//记录性别

StringBuffer strBuf=new StringBuffer();//记录擅长

//isSelected表示控件被选中

if(rb1.isSelected()){

sex="男";

}

if(rb2.isSelected()){

sex="女";

}

if(cb1.isSelected()){

strBuf.append("书法 ");

}

if(cb2.isSelected()){

strBuf.append("唱歌 ");

}

if(cb3.isSelected()){

strBuf.append("跳舞 ");

}

ta.setText("您的性别:"+sex+"\t擅长:

"+strBuf.toString()+"\n"+ta.getText());

}

}

}

public class Test8_5{

public static void main(String[] args) {

new JCheckBoxAndJRadioButtonTest("单选复选按钮测试");

}

}

运行结果如图8-6所示

图8-6 例8-5多次按下确定按钮的运行结果

例8-5中我们并没有监测JRadioButton和JCheckBox,实际上我们设计类来监测其ActionEvent,同样可以达到本例题的效果,有兴趣的读者可以修改例8-5中事件处理部分来监测两个JRadioButton和三个JCheckBox。

8.4.3JComboBox下拉列表

JComboBox组件也称为下拉列表框,其特点是将所有选项折叠在一起,只显示最前面的或被用户选中的一个。选择时需要单击下拉列表右边的下三角按钮,这时候会弹出包含所有选项的列表。用户可以在列表中进行选择,也可以根据需要直接输入所要的选项。也可以输入选项中没有的内容。

JcomboBox类提供了多个构造方法用于创建JcomboBox类对象,详见下表8-9。

构造方法说明

JComboBox() 创建一个空的JcomboBox对象,可使用addItem方法

添加选项

JComboBox(ComboBoxModel aModel) 创建一个JComboBox,其项取自现有的

ComboBoxModel

JComboBox(Object[] items) 创建包含指定数组中的元素的JComboBox

JComboBox(Vector items) 创建包含指定Vector 中的元素的JComboBox 我们可以利用上表给出的四个方法中的任意一个来创建JComboBox对象,在实际使用中,JComboBox()及JComboBox(Object[] items)方式可能会更常用。

JComboBox类提供了多个成员方法用于操作下拉列表框中的项。详见下表8-10。

表8-10 JComboBox类的常用方法

成员方法说明

void addItem(Object anObject) 将指定的对象作为项添加到下拉列表框中

在下拉列表框中的给定索引处插入项

void insertItemAt

(Object anObject,int index)

void removeItem(Object anObject) 在下拉列表框中删除指定的对象项

void removeItemAt(int anIndex) 在下拉列表框中删除指定位置的对象项

void removeAllItems() 从下拉列表框中删除所有项

int getItemCount() 返回下拉列表框中的项数

Object getItemAt(int index) 获取指定下标的列表项,下标从0开始

int getSelectedIndex() 获取当前选择的下标

Object getSelectedItem() 获取当前选择的项

需要创建相应的类实现ItemListener 和ActionListener接口。ItemEvent触发的时机是当下拉列表框中的所选项更改时,ActionEvent触发的时机是当用户在JComboBox上直接输入选择项并回车时。

例8-6演示了如何在程序中为JComboBox添加项,如何删除项以及选中JComboBox中的某项后的事件处理。

[例8-6]

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

class JComboBoxTest extends JFrame{

private JComboBox cmb = new JComboBox();

private JLabel label = new JLabel("要添加项的值:");

private JTextField tf = new JTextField(5);

private JButton buttonAdd = new JButton("添加");

private JButton buttonDel = new JButton("删除");

private JTextArea ta = new JTextArea(4,8);

private JPanel panelNorth = new JPanel();

public JComboBoxTest(String title){

super(title);

Container contentPane = this.getContentPane();

panelNorth.add(cmb);

panelNorth.add(label);

panelNorth.add(tf);

panelNorth.add(buttonAdd);

panelNorth.add(buttonDel);

contentPane.add(panelNorth,BorderLayout.NORTH);

contentPane.add(ta,BorderLayout.CENTER);

buttonAdd.addActionListener(new MyActionListener());

buttonDel.addActionListener(new MyActionListener());

cmb.addItemListener(new MyItemListener());

pack();

setVisible(true);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

//监听"添加"和"删除"按钮

private class MyActionListener implements ActionListener{ public void actionPerformed(ActionEvent e) {

String command = e.getActionCommand();

//添加按钮处理

if(command.equals("添加")){

if(tf.getText().length()!=0){

cmb.addItem(tf.getText());//添加项

ta.setText("添加成功,添加项:"+tf.getText());

pack();//自动调整窗口大小

}

else{

ta.setText("请输入要添加的项");

}

}

//删除按钮处理

if(command.equals("删除")){

if(cmb.getSelectedIndex()!=-1){

//先获得要删除的项的值

String strDel = cmb.getSelectedItem().toString();

cmb.removeItem(strDel);//删除项

ta.setText("删除成功,删除项:"+strDel);

pack();//自动调整窗口大小

}

else{

ta.setText("请选择要删除的项");

}

}

}

}

private class MyItemListener implements ItemListener{

public void itemStateChanged(ItemEvent e) {

String str = e.getItem().toString();

ta.setText("您选择了项:"+str);

}

}

}

public class Test8_6 {

public static void main(String[] args) {

new JComboBoxTest("JComboBox测试");

}

}

针对不同情况,给出了程序的三个运行结果,见图8-7

图8-7 例8-6三种不同情况下的运行结果

在添加及删除成功后的代码中,两次使用了“pack()”语句,其作用是,当添加或删除成功后,其JComboBox的宽度可能会有所改变,为了不影响其他组件的显示效果,需要使用“pack()”语句使窗体重新调整大小以适应所有组件的显示。

8.4.4 JList列表框

JList又叫列表框,它和下拉列表有许多不同之处。JList在界面上占据固定行数,既支持单项选择,也支持多项选择(连续区间选择需按住Shift键选择,不连续区间选择需按住Ctrl键选择)。而JComboBox一次则只能选择一项。

JList提供了多个构造方法用于创建JList类对象,详见下表8-11。

构造方法说明

JList() 构造一个空的JList对象

JList(ListModel dataModel) 使用dataModel模式构造一个JList对象

JList(Object[] listData) 使用listData数组构造一个JList对象

JList(Vector listData) 使用listData向量数组构造一个JList对象与JComboBox不同,JList类没有提供任何添加、插入和删除项的方法,在完成JList的构造后,唯一可以修改数据的方法时setListDate(),这个方法可以一次指定所有的项。

JList类中常用的成员方法如下表8-12。

成员方法说明

int getSelectedIndex() 获取所有选项最小下标

int[] getSelectedIndices() 获取所有选项的下标(按升序排列)

void setSelectionMode(int selectionMode) 设置列表的选择模,selectionMode值见说明void setVisibleRowCount(int visibleRowCount) 设置列表的可见行数

(1)ListSelectionModel.SINGLE_SELECTION :一次只能选择一个列表索引。

(2)ListSelectionModel.SINGLE_INTERVAL_SELECTION:只允许选择连续范围内的多个项,可通过按住Shift键的方式选择。

(3)ListSelectionModel.MULTIPLE_INTERVAL_SELECTION:列表框的默认模式,既可选择连续范围内的多个项,也可选择不连续的多个项。

JList从够响应两个事件:ListSeletionEvent和MouseEvent,,要处理这两个事件,需要创建相应的类实现ListSeletionListener 和MouseListener接口(或是继承MouseAdapter)。ListSeletionEvent触发的时机是当用户单击列表框中的某一个选项并选中它时,MouseEvent 触发的时机是当用户双击列表框中的某个选项时。

JList本身是不带滚动条的,如果将JList放到JScrollPane(滚动面板)中,则会是JList 带有滚动条效果。

例8-7演示了JList的创建、显示及对ListSeletionEvent事件的处理情况。

[例8-7]

import java.awt.*;

import javax.swing.*;

import javax.swing.event.*;

import java.awt.event.*;

class JListTest extends JFrame{

相关主题
相关文档 最新文档