第11章 GUI程序开发
11.1 认识GUI和Swing
1.图形用户界面(Graphics User Interface,GUI)是指采用图形方式显示的计算机操作用户界面。
之前编写的程序,其操作基本是在控制台上进行的,称为文本用户界面或字符用户界面。
2.Swing是一个为Java设计的GUI开发包。在Java中,GUI操作支持的API一般保存在java.awt和javax.swing包中:
java.awt包中提供的(Abstract Window Toolkit,AWT)抽象窗口工具包界面开发API,适用于早期Java版本。
javax.swing包中提供的Swing界面开发API,功能比AWT更加强大,是Java 2推出的,成为JavaGUI开发的首选。其中,Javax中的“x”是扩展的意思。
11.2 使用窗口
1.JFrame类提供了窗口功能。打开文档,找到javax.swing.JFrame类,常见的构造函数如下:
public JFrame(String title) throws HeadlessException
其传入一个界面标题,实例化JFrame对象。
用户可以调用JFrame类里面的函数进行窗口操作,主要功能如下:
设置标题:
public void setTitle(String title)
设置在屏幕上的位置:
public void setLocation(int x,int y)
其中,x为窗口左上角在屏幕上的横坐标,y为窗口左上角在屏幕上的纵坐标。屏幕最左上角的横纵坐标为0。
设置大小:
public void setSize(int width,int height)
参数为宽度和高度。
设置可见性:
public void setVisible(boolean b)
根据参数b的值显示或隐藏此窗口。
显示一个窗口,示例代码如下:
import javax.swing.*;
public class FrameTest1 {
public static void main(String[] args) {
JFrame frm=new JFrame("这是一个窗口");
frm.setLocation(30,50);
frm.setSize(50,60);
frm.setVisible(true);
}
}
注意:单击窗口右上角的“关闭”按钮,窗口消失,但程序并没有结束,解决方法是调用frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)或frm.setDefaultCloseOperation(3)。
2.JDialog类也可以开发窗口,此时创建的窗口是对话框。打开文档,找到javax.swing.JDialog类,常见的构造函数如下:
public JDialog(Frame owner,String title,boolean model) throws HeadlessException
其中,owner为显示该对话框的父窗口,title为该对话框的标题,modal为true表示模态对话框。
在JFrame的基础上产生一个模态对话框,代码如下:
import javax.swing.*;
public class JDialogTest1 {
public static void main(String[] args) {
JFrame frm=new JFrame("这是一个窗口");
frm.setSize(400,200);
//frm.setDefaultCloseOperation(3);和下面的语句都可
fem.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
//创建一个模态对话框,不关闭对话框,窗口亦不能关闭
JDialog dlg=new JDialog(frm,"这是一个对话框",true);
dlg.setSize(200,100);
frm.setVisible(true);
}
}
11.3 使用控件
1.我们使用的按钮、文本框统称为控件,在Java中又称为Component(组件)。控件都有相应的类来实现,空间“按钮”,在Java中就是JButton类来实现的。
为了更好地组织控件,通常先将控件添加到面板(JPanel)上,再添加到窗口上。
将一个按钮添加到面板上,再添加到窗口上,代码如下:
import javax.swing.*;
public class ComponentTest1 extends JFrame {
private JButton jbt=new JButton("按钮");
private JPanel jpl=new JPanel();
public ComponentTest1() {
jpl.add(jbt);
this.add(jbt);
this.setSize(300,300);
this.setVisible(true);
}
public static void main(String[] args) {
new ComponentTest1();
}
}
特别说明:
(1)面板和窗口也称为容器对象。使用add方法可以在容器上添加容器,也可以添加控件。
(2)由于界面有可能比较复杂,所以一般不将界面的生成过程写在主函数中,而是写一个类继承JFrame。在其构造函数中初始化界面。
2.用户使用较多的控件是标签、按钮、文本框、多行文本框和密码框。
标签: 标签显示一段静态文本,用户可以用JLabel类开发标签。打开文档,找到javax.swing.JLabel类,常见的构造函数如下:
public JLabel(String text)
其传入一个标题,实例化一个标签。
按钮:用户可以用JButton类开发按钮。打开文档,找到javax.swing.JButton类,常见的构造函数如下:
public JButton(String text)
其传入一个标题,实例化一个按钮。
文本框:用户可以用JTextField类开发文本框。打开文档,找到javax.swing.JTextField类,常见的构造函数如下:
public JTextField(int columns)
参数为JTextField的显示列数。
多行文本框:用户可以用JTextArea类开发多行文本框。打开文档,找到javax.swing.JTextArea类,常见的构造函数如下:
public JTextArea(int rows,int columns)
参数为JTextArea显示的行数和列数。
注意:默认的文本框没有滚动条,如果要使用滚动条,需要使用JScrollPane类,将JTextArea对象传入其构造函数,然后在界面上添加JScrollPane对象。
密码框:输入的内容以掩码形式显示。用户可以用JPasswordField类开发密码框。打开文档,找到javax.swing.JPasswordField类,常见的构造函数如下:
public JPasswordField(int columns)
参数为JPasswordField的显示列数。
在界面上显示标签、按钮、文本框、多行文本框和密码框,代码如下:
import javax.swing.*;
public class ComponentTest2 extends JFrame {
private JLabel lblInfo=new JLabel("这是注册窗口");
private JButton btReg=new JButton("注册");
private JTextField tfAcc=new JTextField(10);
private JPasswordField pfPass=new JPasswordField(10);
private JTextArea taInfo=new JTextArea(3,10);
private JScrollPane spTaInfo=new JScrollPane(taInfo);
private JPanel jpl=new JPanel();
public ComponentTest2() {
jpl.add(lblInfo);
jpl.add(btReg);
jpl.add(tfAcc);
jpl.add(pfPass);
jpl.add(spTaInfo);
this.add(jpl);
this.setSize(150,220);
this.setVisible(true);
}
public static void main(String[] args) {
new ComponentTest2();
}
}
3.单选按钮、下拉列表框和复选框是较为常用的控件。
单选按钮:提供多选一功能(如性别)。用户可以使用JRadioButton类开发单选按钮。打开文档,找到javax.swing.JRadioButton类,常见的构造函数如下:
public JRadioButton(String text,boolean selected)
第1个参数为单选按钮标题,第2个参数为选择状态。
注意:单选按钮支持的选项是多选一,那么如何将多个单选按钮看成一组呢?用户可以使用java
x.swing.ButtonGroup实现,该类有一个add函数,能够将多个单选按钮加入,看成一组。但是ButtonGroup不能被加到界面上,用户要将单选按钮一个一个地加到界面上。
下拉列表框:提供多选一功能,适合选项较多地情况。用户可以使用JCombpBox类开发下拉列表框。打开文档,找到javax.swing.JCombpBox类,常见的构造函数如下:
public JComboBox()
实例化一个下拉列表框,其中地选项可用其addItem函数添加。
复选框:提供多选功能,可以不选、全选或选择部分选项。用户可以使用JCheckBox类开发下拉列表框。打开文档,找到javax.swing.JCheckBox类,常见的构造函数如下:
public JCheckBox(String text,boolean selected)
实例化一个复选框,第1个参数为复选框标题,第2个参数为选择状态。
在界面上显示单选按钮、下拉列表框和复选框集中控件,代码如下:
import javax.swing.*;
public class ComponentTest3 extends JFrame {
private JRadioButton rbSex1=new JRadioButton("男",true);
private JRadioButton rbSex2=new JRadioButton("女",false);
private JComboBox cbHome=new JComboBox();
private JCheckBox cbFav1=new JCheckBox("唱歌",true);
private JCheckBox cbFav2=new JCheckBox("跳舞");
private JPanel jpl=new JPanel();
public ComponentTest3() {
ButtonGroup bgSex=new ButtonGroup();
bgSex.add(rbSex1);
bgSex.add(rbSex2);
cbHome.addItem("北京");
cbHome.addItem("上海");
cbHome.addItem("天津");
jpl.add(rbSex1);
jpl.add(rbSex2);
jpl.add(cbHome);
jpl.add(cbFav1);
jpl.add(cbFav2);
this.add(jpl);
this.setSize(100,180);
this.setVisible(true);
}
public static void main(String[] args) {
new ComponentTest3();
}
}
4.菜单:常见的控件,菜单的开发需要了解以下问题。
(1)在界面上首先需要放置一个菜单条,由javax.swing.JMenuBar封装。打开文档,找到javax.swing.JMenuBar类,常见的构造函数如下:
public JMenuBar()
实例化一个菜单。
注意:使用JFrame的setJMenuBar(setJMenuBar menubar)方法可以将菜单条添加到界面上。
(2)菜单,由javax.swing.JMenu封装,JMenu放到菜单条上。打开文档,找javax.swing.JMenu类,常见的构造函数如下:
public JMenu(String s)
其参数是菜单文本。
注意:使用JMenuBar的add(JMenu menu)方法可以添加JMenu。
(3)菜单项,由javax.swing.JMenuItem封装,JMenuItem放到JMenu上。打开文档,找javax.swing.JMenuItem类,常见的构造函数如下:
public JMenuItem(String s)
其参数是菜单文本项。
注意:使用JMenu的add(JMenuItem menuItem)方法可以添加JMenuItem。
在界面上有个菜单条(JMenuBar),菜单条上有个菜单(JMenu),菜单中有菜单项(JMenuItem)。
在界面上显示上述控件,代码如下:
import javax.swing.*;
public class ComponentTest4 extends JFrame {
private JMenuBar mb=new JMenuBar();
private JMenu mFile=new JMenu("文件");
private JMenuItem miOpen=new JMenuItem("打开");
private JMenuItem miSave=new JMenuItem("保存");
private JMenuItem miExit=new JMenuItem("退出");
public ComponentTest4() {
mFile.add(miOpen);
mFile.add(miSave);
mFile.add(miExit);
mb.add(mFile);
this.setJMenuBar(mb);
this.setSize(200,180);
this.setVisible(true);
}
public static void main(String[] args) {
new ComponentTest4();
}
}
5.使用JOptionPane类也可以显示窗口。一般使用其显示一些消息框、输入框或确认框等。打开文档,找到javax.swing.JOptionPane类,一般使用其以下静态函数。
(1)显示消息框,代码如下:
public static void showMessageDialog(Component parentComponent,Object message) throws HeadlessException
第1个参数表示父组件(可以为空,也可以为一个Component),第2个参数表示消息内容。
(2)显示输入框,代码如下:
public static void showInputDialog(Object message) throws HeadlessException
参数表示输入框上的提示信息,输入之后的内容以字符串返回。
(3)显示确认框,代码如下import:
public static void showConfirmDialog(Component parentComponent,Object message) throws HeadlessException
第1个参数表示父组件(可以为空,也可以为一个Component),第2个参数表示确认框上的提示信息。
系统如何知道用户单击了那个按钮呢?系统根据返回的值来判断,返回值是一个整数,由JOptionPane类中定义的静态变量表示。例如,JOptionPane。YES_OPTION表示单击了“是”按钮,其他静态变量可以在文档中查到。
使用上述3种函数,显示3种显示窗口,代码如下:
import javax.swing.*;
public class OptionpaneTest1 {
public static void main(String[] args) {
JOptionPane.showMessageDialog(null,"这是一个消息框");
JOptionPane.showInputDialog("这是一个输入框");
int result=JOptionPane.showConfirmDialog(null,"这是一个确认框");
}
}
6.下面列出一些常见的控件
(1)Javax.swing.JFileChooser:文件选择框,用于文件的打开或保存。
(2)Javax.swing.JColorChooser:颜色选择框,用于颜色的选择。
(3)Javax.swing.JToolBar:用于在菜单条下方显示工具条。
(4)Javax.swing.JList:列表框,用于选择某些选项。
(5)Javax.swing.JProgressBar:进度条,用于显示某些进度。
(6)Javax.swing.JSlider:滑块,用于设定数值。
(7)Javax.swing.JTree:树形结构,用于将分层数据显示为树形轮廓。
(8)Javax.swing.JTable:表格,用于显示和编辑常规二维单元表。
(9)Javax.swing.JTabbedPane:选项卡面板。它允许用户通过点击给定标题或图标的选项卡,在一组组之间进行切换显示。
(10)Javax.swing.JInternaIFrame:在窗口中容纳多个小窗口。
11.4 颜色、字体和图片的使用
1.在Java中颜色是用java.awt.Color表达的。打开文档,找到java.awt.Color类,常见的构造函数如下:
public Color(int r,int g,int b)
其表示用红色、绿色和蓝色分量来初始化颜色,参数r,g,b必须取值为0~255。
小知识:生活中的任何颜色都可以看成是由红、绿、蓝3种颜色混合而成。如果3种颜色分量都为0,则为黑色;如果都为255,则为白色。
对于窗口和控件来说,可以设置两类颜色。
(1)设置背景颜色:
public void setBackground(Color c)
(2)设置前景颜色:
public void setForeground(Color c)
前景颜色主要是指控件上文字等内容的颜色。
在界面上显示一个按钮,界面背景颜色是黄色,按钮上文字的颜色是红色,代码如下:
import java.awt.*;
import javax.swing.*
public class ColorTest1 extends JFrame {
private JButton jbt=new JButton("按钮");
private Jpanel jpl=new Jpanel();
public ColorTest1() {
jpl.add(jbt);
this.add(jpl);
jpl.setBackground(Color.yellow);
jpt.setForeground(Color.red);
this.setSize(100,80);
this.setVisible(true);
}
public static void main(String[] args) {
new ColorTest();
}
}
2.在GUI编程中字体也是要经常使用的内容,在Java中字体是用java.awt.Font表达的。打开文档,找到java.awt.Font类,常见的构造函数如下:
public Font(String name,int style,int size)
其用字体名称、字体风格和字体大小初始化字体。
注意:
(1)如果字体名称错误,则使用系统默认字体。在Fort类中也定义了一些静态变量表示系统提供的字体,如Fort.SANS_SERIF等,具体可以参考文档。
(2)字体风格可以选用Fort.PLAIN(普通)、Fort.BOLD(粗体)、Fort.ITALIC(斜体)等,如果同时使用多种,则用“|”隔开,如,Fort.BOLD|Fort.ITALIC表示粗斜体。
设置字体一般针对含有文字的控件,可以通过以下方法设置字体:
public setFont(Font f)
在界面上显示一个标签和一个文本框,标签字体为20号粗斜楷体,文本框中的字体为20号斜黑体,代码如下:
import java.awt.*;
import javax.swing.*
public class FontTest1 extends JFrame {
private JLabel lblAcc=new JLabel("输入账号:");
private JTextField tfAcc=new JTextField(10);
private JPanel jpl=new JPanel();
public FontTest1() {
Font fontLblAcc=new Font("楷体_GB2312",Font.BOLD|Font.ITALIC,20);
lblAcc.setFont(fontLblAcc);
Font fontTfAcc=new Font("黑体",Font.ITALIC,20);
tfAcc.setFont(fontTfAcc);
jpl.add(lblAcc);
jpl.add(tfAcc);
this.add(jpl);
this.setSize(250,80);
this.setVisible(true);
}
public static void main(String[] args) {
new FontTest1();
}
}
3.在GUI编程中经常使用图片。
图像:用java.awt.Image来封装的。打开文档,找到java.awt.Image类,该类是一个抽象类,无法被实例化。Image对象一般使用以下方式得到:
Image img=Toolkit.getDefaultToolkit().creatImage("图片路径");
JFrame有一个函数:
public void setIconImage(Image image)
通过该函数可以设置此窗口要显示在最小话图标中的图像。
图标:是用java.swing.Icon来封装的。打开文档,找到java.awt.Icon,它是一个接口,无法被实例化。一般使用Icon的实现类java.swing.ImageIcon来生成一个图标。打开文档,找到java.awt.ImageIcon类,常见的构造函数如下:
public ImageIcon(String filename)
其传入一个路径,实例化ImageIcon对象。
设置图标在Swing开发中较为常见。常见的控件一般都提供了构造函数传入一个图标。例如,JButton类就用以下构造函数传入一个图标:
public JButton(String text,Icon icon)
此外,还用setIcon函数修改图标。
JLabel等其他类也有相应的图标支持函数,具体可以参考文档。
11.5 其他功能
1.在GUI编程中风格是由java.swing.UIManager类进行管理。通过该类的以下函数来设置界面的显示风格:
public static void setLookAndFeel(String className)
throws ClassNotFoundException,
InstantiationException,
IllegalAccessException,
UnsupportedLookAndFeelException
用户可以使用以下函数得到系统中已经支持的风格:
public static UIManger.LookAndFeelInfo[] getInstalledLookAndFeels()
用系统支持的所有风格显示一个输入框,代码如下:
import javax.swing.*;
public class StyleTest {
public static void main(String[] args) {
try{
UIManager.LookAndFeelInfo[] infos=
UIManager.getInstalledLookAndFeels();
for(UIManager.LookAndFeelInfo Info:infos) {
UIManger.LookAndFeel(info.getClassName());
JOptionPane.showInputDialog(info.getName()+"风格");
}
}catch(Exception ex) {}
}
}
2.在GUI编程中屏幕大小是由java.awt.GraphicsEnvironment类获得的。打印当前的屏幕大小,代码如下:
import java.awt.*;
public class ScreenTest {
public static void main(String[] args) {
GraphicsEnvironment ge=
GraphicsEnvironment.getLocalGraphicsEnvironment();
Retangle rec=
ge.getDefaultScreenDevice().getDefaultConfiguration().getBounds();
System.out.println("屏幕宽度:"+rec.getWidth());
System.out.println("屏幕高度:"+rec.getHeight());
}
}
3.在JDK6.0中增加java.awt.SystemTray类,该类的功能是用默认应用程序打开文件。此功能也可以用Desktop类实现。
打开C盘中的test.pdf(C盘中要先创建该文档),代码如下:
import java.awt.Desktop;
import java.io.File;
public class DesktopTest {
public static void main(String[] args) {
Desktop.getDesktop().open(new File("C:\\test.pdf"));
}
}
4.在JDK6.0中增加了java.awt.SystemTray类,该类可以在任务栏上显示系统托盘,系统托盘用java.awt.TaryIcon封装(可自行了解)。