《Java Swing》第5节:常用组件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Java Swing》第5节:常用组件相关的知识,希望对你有一定的参考价值。

​窗体上的按钮、标签、文本框等都被称为“窗体组件”,简称“组件”。大部分组件都是Jcomponent类的子类,而Jcomponent又是Container的子类、Container又是Component的子类。这3个类中所定义的方法都会都会被组件各种组件继承下来,因此大部分组件都有相同的方法,这些方法如表20-5所示。

表20-5 Jcomponent常用方法​

方法​

功能​

void setSize(int width, int height)​

设置组件大小​

void setLocation(int x, int y)​

设置组件位置​

void setFont(Font font)​

设置组件的字体​

void setIcon(Icon icon)​

设置组件的图片​

void setToolTipText(String text)​

设置Tip文本​

void setBackground(Color bg)​

设置组件背景色​

void setForeground(Color fg)​

设置组件前景色​

void setOpaque(boolean isOpaque)​

设置组件的透明度​

void setCursor(Cursor cursor)​

设置组件上鼠标的形状​

void setBorder(Border border)​

设置组件边框​

本小节将详细讲解各种Swing组件的使用方法。​

20.5.1标签组件JLabel

在Swing体系中用Jlabel类表示标签组件。标签的作用是向窗体上贴一段文字或一副图片,JLabel可以通过setText()方法设置文字,也可以通过getText()方法获取标签上的文字。也可以通过继承而来的方法设置字体、图片、鼠标形状等各种外观属性。下面的【例20_08】展示了JLabel的使用方法。​

【例20_08 JLabel的使用】

Exam20_08.java​

import javax.swing.*;
import java.awt.*;
class Exam20_08Frame extends JFrame
JLabel label1;
JLabel label2;
public Exam20_08Frame( )
init();

private void init( )
Container container = this.getContentPane();//获得窗体的主体区域
container.setLayout(null);
label1 = new JLabel("你好");
label1.setSize(200, 100);
label1.setLocation(0, 0);
//设置label1上的字体为斜体隶书,大小为40磅
label1.setFont(new Font("隶书", Font.ITALIC, 40));
label2 = new JLabel();
label2.setSize(100, 100);
label2.setLocation(220, 0);
label2.setIcon(new ImageIcon("logo.png"));
//设置label2的鼠标形状为手形
label2.setCursor(new Cursor(Cursor.HAND_CURSOR));
container.add(label1);
container.add(label2);


public class Exam20_08
public static void main(String[] args)
Exam20_08Frame frame = new Exam20_08Frame();
frame.setSize(400, 200);//设置窗体的大小
frame.setLocationRelativeTo(null);//设置窗体出现在屏幕正中间
frame.setTitle("Exam20_08Frame");//设置窗体的标题
//设置关闭窗体时同时停止程序
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);//设置窗体可见

【例20_08】的窗体上添加了两个标签分别是label1和label2,程序中设置了label1的字体为斜体隶书,大小为40磅,而为label2设置了一个图片logo.png。需要注意,读者只有在项目文件夹的根目录下添加一个logo.png文件才能使这个图片正确显示出来。【例20_08】的运行结果如图20-7所示。​

第二十章《Java

图20-7【例20_08】运行结果​

读者把鼠标放在label2上时,会看到鼠标变成了手形。​

20.5.2文本框JTextField和密码框JPasswordField

在Swing体系中用JTextField类来表示文本框,而用JPasswordField类表示密码框。文本框是用来输入单行文本的,而密码框是用来输入密码的。文本框和密码框的方法大部分都是继承而来的,在表20-5中基本上都能找到,而JPasswordField新增了一个getPassword()来获得密码框中的内容,这个方法返回一个char型数组,当获得这个数组后可以以它为构造方法的参数创建一个String类对象。此外,程序员如果想设置密码框中显示的字符,可以调用JPasswordField类的setEchoChar()方法实现,这个方法的参数是char型,表示显示在密码框中的字符。下面的【例20_09】展示了文本框和密码框的使用方法。​

【例20_09 JTextField和JPasswordField的使用】

Exam20_09.java​

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

class Exam20_09Frame extends JFrame
JLabel lblUserName;
JLabel lblPassword;
JTextField txtUserName;
JPasswordField pwdPassword;
JButton btnLogin;
JButton btnCancel;
public Exam20_09Frame()
init();

private void init( )
Container container = this.getContentPane();
container.setLayout(null);
lblUserName = new JLabel("用户名");
lblPassword = new JLabel("密 码");
txtUserName = new JTextField();
pwdPassword = new JPasswordField();
btnLogin = new JButton("登录");
btnCancel = new JButton("取消");

lblUserName.setSize(70, 40);
lblUserName.setLocation(100, 60);
lblUserName.setFont(new Font("微软雅黑", Font.PLAIN, 20));
lblPassword.setSize(70, 40);
lblPassword.setLocation(100, 160);
lblPassword.setFont(new Font("微软雅黑", Font.PLAIN, 20));
txtUserName.setSize(300, 40);
txtUserName.setLocation(200, 60);
pwdPassword.setSize(300, 40);
pwdPassword.setLocation(200, 160);
//设置密码框中显示的字符为*
pwdPassword.setEchoChar(*);
btnLogin.setSize(150, 40);
btnLogin.setLocation(130, 240);
btnLogin.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnLogin.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
String userName = txtUserName.getText();
String password = new String(pwdPassword.getPassword());
System.out.println("用户名: "+userName+" 密码:"+password);
System.out.println("登录中...");

);
btnCancel.setSize(150, 40);
btnCancel.setLocation(320, 240);
btnCancel.setFont(new Font("微软雅黑", Font.PLAIN, 20));
container.add(lblUserName);
container.add(lblPassword);
container.add(txtUserName);
container.add(pwdPassword);
container.add(btnLogin);
container.add(btnCancel);


public class Exam20_09
public static void main(String[] args)
Exam20_09Frame frame = new Exam20_09Frame();
frame.setSize(600, 400);
frame.setLocationRelativeTo(null);
frame.setTitle("Exam20_09Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

【例20_09】中,窗体上有一个文本框和一个密码框,并设置密码框中显示的字符是“*”,【例20_09】的运行结果如图20-8所示。​

第二十章《Java

图20-8【例20_09】运行结果​

单击窗体上的“登录”按钮,可以看到控制台上输出了当前填写的用户名和密码。​

20.5.3文本区JTextArea

在Swing体系中JTextArea类来表示文本区。所谓文本区就是多行文本框,它是用来输入大段文本信息的组件。与JTextField 不同,JTextArea不支持添加ActionListener监听器。用户在单行文本框中按下回车键,能够触发ActionListener监听器处理事件,而在文本区中按下回车键,只能起到文本手动换行的作用。文本区组件相比较文本框组件而言,增加了大量用来编辑文字的方法,如表20-6所示。​

表20-6 JTextArea编辑文字的方法​

方法

功能

void append(String str)

文本末尾加入字符串str

void insert(String str, int pos)

文本区pos处插入字符串str

void selectAll()

选中文本区中所有文本

void copy()

复制文本区中选中的文本

void paste()

把文本粘贴到插入点位置,如果文本区没有获得焦点则把文本粘贴到文本区末尾

Swing体系不支持“撤销”和“重做”的快捷键,希望实现用快捷键的方式完成在“撤销”和“重做”操作,必须借助UndoManager类,这个类本质上其实是一个监听器类,程序员可以创建它的一个对象,让这个对象监听某个文本区上所做的操作。当某个文本区添加了这种类型的监听器之后,用户对这个文本区输入了哪些文本,输入的顺序是怎样的,在输入过程中是否做过撤销和重做的操作,监听器都会了如指掌,并且它还会把这些操作步骤全部都记录下来。如果希望实现撤销操作,需要先调用UndoManager对象的canUndo()方法来判断一下能否做撤销操作,如果能做撤销操作,就调用undo()方法就能实现撤销。实现重做的原理也是一样的,通过canRedo()方法实现判断是否能够重做,如果能重做,那么调用redo()方法实现重做。需要注意:判断是否能够撤销和重做都是需要程序员写代码手动调用相应判断方法,监听器对象本身并不会自动判断。​

给文本区设置快捷键的基本原理也很简单,只需要在文本区上添加一个KeyListener(键盘事件监听器)。每次按下一个键的时候,都在相应的事件处理方法中判断一下是不是程序员所设定的快捷键。KeyListener所有处理键盘事件的方法都有一个KeyEvent类型的参数,这个参数对象是由Java运行时系统在捕捉到事件之后创建并传递给处理事件方法的。在这个参数对象当中包含了很多信息,其中最主要的信息就是用户所按下的是哪一个键,以及是否按下了Ctrl键。假如键盘事件对象是e,则判断是否按下了Ctrl+A的代码是:​

e.isControlDown() && e.getKeyCode()==KeyEvent.VK_Z​

而由于文本区自身又并不自带滚动条,这就导致当文本区中的文字越来越多时,下面的文字无法显示出来。解决这个问题的办法是把文本区添加到JScrollPane中。JScrollPane是滚动面板,它是一个容器组件,这个组件会自带滚动条。此外,窗体上的文本区组件常常要通过setLineWrap(true)设置允许自动换行,如果不做这个设置,文本区中的文本无法实现自动换行。下面的【例20_10】展示了文本区组件的操作方式,在这个例子中,窗体上有两个文本区,用户可以把左边文本框中的文本赋值到剪切板,然后插入或添加到右边的文本区中。​

【例20_10 JTextArea的使用】

Exam20_10.java​

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.undo.*;
class Exam20_10Frame extends JFrame
JTextArea txaSrc;
JTextArea txaDest;
JButton btnAppend;
JButton btnInsert;
JButton btnSelectAll;
JButton btnCopy;
JButton btnPaste;
JButton btnUndo;
JButton btnRedo;
UndoManager undoManager;
JScrollPane jspSrc;
public Exam20_10Frame()
init();

private void init( )
Container container = this.getContentPane();//获得窗体的主体区域
container.setLayout(null);
undoManager = new UndoManager();
txaSrc = new JTextArea();
txaSrc.setFont(new Font("微软雅黑", Font.PLAIN, 20));
txaSrc.setLineWrap(true);
txaSrc.getDocument().addUndoableEditListener(undoManager);
txaSrc.addKeyListener(new KeyAdapter()
@Override
public void keyPressed(KeyEvent e)
//实现撤销操作的快捷键
if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_Z)
if(undoManager.canUndo())
undoManager.undo();


//实现重做操作的快捷键
if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_Y)
if(undoManager.canRedo())
undoManager.redo();



);
jspSrc = new JScrollPane(txaSrc);
jspSrc.setSize(300, 150);
jspSrc.setLocation(80, 0);
txaDest = new JTextArea();
txaDest.setSize(300, 150);
txaDest.setLocation(420, 0);
txaDest.setFont(new Font("微软雅黑", Font.PLAIN, 20));
txaDest.setBorder(BorderFactory.createLineBorder(Color.GRAY,1));
btnAppend = new JButton("添加");
btnAppend.setSize(80, 40);
btnAppend.setLocation(60, 200);
btnAppend.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnAppend.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
txaSrc.append("ab");

);
btnInsert = new JButton("插入");
btnInsert.setSize(80, 40);
btnInsert.setLocation(160, 200);
btnInsert.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnInsert.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
txaSrc.insert("c", 0);

);
btnSelectAll = new JButton("全选");
btnSelectAll.setSize(80, 40);
btnSelectAll.setLocation(260, 200);
btnSelectAll.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnSelectAll.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
txaSrc.requestFocus();
txaSrc.selectAll();


);
btnCopy = new JButton("复制");
btnCopy.setSize(80, 40);
btnCopy.setLocation(360, 200);
btnCopy.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnCopy.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
txaSrc.copy();

);
btnPaste = new JButton("粘贴");
btnPaste.setSize(80, 40);
btnPaste.setLocation(460, 200);
btnPaste.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnPaste.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
txaDest.paste();

);
btnUndo = new JButton("撤销");
btnUndo.setSize(80, 40);
btnUndo.setLocation(560, 200);
btnUndo.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnUndo.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
if(undoManager.canUndo())
undoManager.undo();


);
btnRedo = new JButton("重做");
btnRedo.setSize(80, 40);
btnRedo.setLocation(660, 200);
btnRedo.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnRedo.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
if(undoManager.canRedo())
undoManager.redo();


);
container.add(jspSrc);
container.add(txaDest);
container.add(btnAppend);
container.add(btnInsert);
container.add(btnCopy);
container.add(btnPaste);
container.add(btnUndo);
container.add(btnSelectAll);
container.add(btnRedo);


public class Exam20_10
public static void main(String[] args)
Exam20_10Frame frame = new Exam20_10Frame();
frame.setSize(800, 300);
frame.setLocationRelativeTo(null);
frame.setTitle("Exam20_10Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

【例20_10】的运行结果如图20-9所示。​

第二十章《Java

图20-9【例20_10】运行结果​

20.5.4复选框JCheckBox

Swing体系用JCheckBox类来表示复选框,JCheckBox和表示按钮的JButton都是AbstractButton的子类,因此复选框也可以被看作是一种特殊的按钮。复选框能够实现多项选择,在某些场景下也可以用于让用户完成实现确认,在这种情况下复选框也被称为“检查框”,如图20-10所示。​

第二十章《Java

图20-10用户确认检查框​

窗体上如果出现复选框,程序员可以通过AbstractButton类中定义的isSelected()方法来判断某个复选框是否被选中,由于JCheckBox是AbstractButton的子类,所以JCheckBox也具有这个方法。如果希望获得复选框的文本,则需要调用getText()方法实现。​

JCheckBox除了可以添加ActionListener作为监听器外,还可以添加ItemListener作为监听器,ItemListener用于监听选项的变化,如果一个复选框被选中或取消选中都会出发该监听器的处理方法,ItemListener监听器的处理方法是itemStateChanged(),从方法的名称不难看出它表示选项状态的变化。下面的【例20_11】展示了如何使用检查框完成用户确认以及使用复选框完成多选。​

【例20_11 JCheckBox的使用】

Exam20_11.java​

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Exam20_11Frame extends JFrame
JCheckBox cbxConfirm;
JButton btnNext;
String[] names;
JCheckBox[] cbxCities;
JButton btnOK;
JLabel lblCities;
public Exam20_11Frame()
init();

private void init()
Container container = this.getContentPane();//获得窗体的主体区域
container.setLayout(null);
cbxConfirm = new JCheckBox("我已阅读并接受条款");
btnNext = new JButton("下一步");
lblCities = new JLabel("选择你去过的城市");
names = new String[]"北京","上海","广州","深圳";
cbxCities = new JCheckBox[names.length];
btnOK = new JButton("提交");
cbxConfirm.setSize(250, 40);
cbxConfirm.setLocation(30, 30);
cbxConfirm.setFont(new Font("微软雅黑", Font.PLAIN, 20));
cbxConfirm.addItemListener(new ItemListener()
@Override
public void itemStateChanged(ItemEvent e)
boolean flag = cbxConfirm.isSelected();
btnNext.setEnabled(flag);


);
btnNext.setSize(100, 40);
btnNext.setLocation(30, 80);
btnNext.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnNext.setEnabled(false);
lblCities.setSize(200, 40);
lblCities.setLocation(30, 150);
lblCities.setFont(new Font("微软雅黑", Font.PLAIN, 20));
for(int i=0;i<cbxCities.length;i++)
cbxCities[i] = new JCheckBox(names[i]);
cbxCities[i].setSize(70, 40);
cbxCities[i].setLocation(30+i*70, 200);
cbxCities[i].setFont(new Font("微软雅黑", Font.PLAIN, 18));
container.add(cbxCities[i]);

btnOK.setSize(80, 40);
btnOK.setLocation(30, 250);
btnOK.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnOK.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
String str = "";
for(int i=0;i<cbxCities.length;i++)
if(cbxCities[i].isSelected()==true)
str = str+cbxCities[i].getText()+" ";


System.out.println(str);

);
container.add(cbxConfirm);
container.add(btnNext);
container.add(lblCities);
container.add(btnOK);


public class Exam20_11
public static void main(String[] args)
Exam20_11Frame frame = new Exam20_11Frame();
frame.setSize(450, 350);
frame.setLocationRelativeTo(null);
frame.setTitle("Exam20_11Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

【例20_11】的运行结果20-11所示。​

第二十章《Java

图20-11【例20_11】运行结果​

在图20-11所示窗体中选择“我已阅读并接受条款”,“下一步”按钮就会变成可用状态,而选择几个去过的城市后再单击“提交”按钮,控制台上就会输出所选择的选项。​

20.5.5单选按钮JRadioButton

单选按钮也是桌面应用程序中常见到的组件,在Swing体系中用JRadioButton表示单选按钮。单选按钮和复选框有相似之处,它们都是用来让用户完成选择操作的,只不过复选框是用来让用户做多项选择的,而单选按钮是用来让用户做单项选择,最典型的例子是常常用单选按钮让用户选择性别。以单选按钮表示的一组选项必须实现“互斥”效果。所谓互斥就是指从多个选项中只能选择一个,例如从“男”和“女”中只能选中一个选项。为了让一组单选按钮之间能够有互斥效果,必须使用ButtonGroup对象,ButtonGroup相当于一个容器,程序员只需要把单选按钮都放在这个容器中就能实现单选按钮的互斥效果。需要强调:把一组单选按钮加入到ButtonGroup中时,这一组单选按钮必须都已经完成了实例化,否则单选按钮无法完成互斥。​

同JCheckBox一样,程序员可以通过isSelected()方法来判断某个单选按钮是否被选中,并通过getText()方法获得某个单选按钮的文本。但通常情况下,一般都只获得被选中的单选按钮的文本,这种情况下可以先调用每一个单选按钮执行setActionCommand()方法对其设置一个“命令文本”,然后调用ButtonGroup的getSelection()获得被选中的选项,最后再调用该选项的getActionCommand()方法获得它的“命令文本”。下面的【例20_12】展示了单选按钮的使用方法及互斥效果。​

【例20_12 JRadioButton的使用】

Exam20_12.java​

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Exam20_12Frame extends JFrame
JButton btnOK;
JLabel lblSex;
JRadioButton rbtMale;
JRadioButton rbtFemale;
ButtonGroup btgSex;
public Exam20_12Frame()
init();

private void init()
Container container = this.getContentPane();//获得窗体的主体区域
container.setLayout(null);
lblSex = new JLabel("请选择性别");
rbtMale = new JRadioButton("男",true);//参数true表示默认选中
rbtFemale = new JRadioButton("女",false);
btnOK 以上是关于《Java Swing》第5节:常用组件的主要内容,如果未能解决你的问题,请参考以下文章

《Java Swing》第1节:Swing简介

《Java Swing》第4节:事件处理与监听器

《Java Swing》第2节:窗体的创建

《Java Swing》第8节:选择器

Java基础:GUI

java的swing组件的使用