目录
1. 标签组件
标签(JLabel)组件通常用于显示提示性的文本信息或图标。JLabel类的构造方法如下:
- JLabel():创建一个不显示文本和图标的空标签。
- JLabel(String text):创建一个显示文本的标签。
- JLabel(Icon image):创建一个显示图标的标签。
- JLabel(String text,int horizontalAlignment):创建一个显示文本并且可以设置水平对齐方式的标签。
- JLabel(String text,Icon image,int horizontalAlignment):创建一个同时显示文本和图标并且可以设置水平对齐方式的标签。
在上述构造方法中,参数horizontalAlignment表示水平对齐方式,其取值可为JLabel.LEFT、JLabel.RIGHT和JLabel.CENTER,分别表示左对齐、右对齐和居中。默认情况下,只有文本的标签在水平方向上左对齐显示,只有图标的标签在水平方向上居中显示。可以通过setHorizontalAlignment(int alignment)方法改变标签内容的水平对齐方式。对应既有文本又包含图标的标签,默认情况下,文本显示在图标的右侧。可以通过setVerticalAlignment(int textPosition)和setVerticalTextPosition(int textPosition)方法设置文本与图标的相对位置,textPosition的取值可为JLabel.LEFT、JLabel.RIGHT和JLabel.CENTER。
【例1】标签组件的使用。
import java.awt.*;
import javax.swing.*;
public class JLabelDemo extends JFrame{
JLabel label1=new JLabel("图标:");//只有文本的标签
Icon icon1=new ImageIcon("./src/img/hit.jpg");
Icon icon2=new ImageIcon("./src/img/weixin.jpg");
Icon icon3=new ImageIcon("./src/img/java.jpg");
JLabel label2=new JLabel(icon1);//只有图标的标签
//同时有文本和图标的标签
JLabel label3=new JLabel("微信",icon2,JLabel.LEFT);
JLabel label4=new JLabel("Java",icon3,JLabel.CENTER);
public JLabelDemo() {
this.setTitle("标签示例");
this.setSize(300,400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane=this.getContentPane();
contentPane.setLayout(new GridLayout(4,1,1,1));//网格布局
//设置文本和图标的相对位置,文本在图标的底部,与图标中间对齐
label4.setVerticalTextPosition(JLabel.BOTTOM);
label4.setHorizontalTextPosition(JLabel.CENTER);
contentPane.add(label1);
contentPane.add(label2);
contentPane.add(label3);
contentPane.add(label4);
this.setVisible(true);
}
public static void main(String[] args) {
JLabelDemo frame=new JLabelDemo();
}
}
运行上述程序,显示结果如图1所示。从该图可以看出,只有文本的标签默认情况下左对齐,只有图标的标签默认情况下居中,既有文本又有图标的标签默认本文在图标的右侧。第19行和第行20代码的功能表示将文本显示在图标的底部并且居中。
图1. 标签组件的使用示例
2. 本文组件
文本组件的主要功能是用于显示和输入信息。Swing中的文本组件主要包括:文本框(JTextField)、密码框(JPasswordField)和为文本区(JTextArea),它们都有一个共同的基类JTextComponent。文本框和密码框都只能输入和显示单行文本,当按下Enter键时可以触发ActionEvent事件。而在文本区中可以输入和显示多行文本。
(1)文本框
文本框(JTextField)是用来输入和显示单行信息的文本组件。JTextField类的构造方法如下:
- JTextField():创建一个空的文本框。
- JTextField(int columns):创建一个指定列数的空文本框。
- JTextField(String text):创建一个指定初始字符串的文本框。
- JTextField(String text, int columns):创建一个指定列数和显示指定初始字符串的文本框。
(2)密码框
密码框(JPasswordField)是专门用来输入密码的,输入内容一般不显示原始字符,只显示回显符,默认回显符是“*”。JPasswordField类是JTextField类的子类,因此,其构造方法与JTextField的构造方法类似,这里不再赘述。可以使用setEchoChar(char c)方法重新设置回显字符,调用char[] getPassword()方法返回实际密码。
(3)文本区
文本区(JTextArea)可以输入和显示多行文本信息。JTextArea类的构造方法如下:
- JTextArea():创建一个空的文本区。
- JTextArea(int rows,int columns):创建一个指定行数和列数的空文本区。
- JTextArea(String text):创建一显示指定初始字符串的文本区。
- JTextArea(String text,int rows,int columns):创建一个指定行数和列数并显示指定初始字符串的文本区。
- JTextArea(Docment doc):创建一个指定文档的文本区。
- JTextArea(Docment doc,String text,int rows,int columns):创建一个指定文档,具有指定行数和列数并显示指定初始字符串的文本区。
JTextArea类中定义了多种对文本区操作的方法,常用方法如下:
- append(String str):将指定的字符串添加到文本域最后。
- insert(String str,int pos):将指定的字符串插入到文本域的特定位置。
- replace(String str,int start,int end):用指定的字符串替换文本域中的部分内容。
- setRows(int rows):设置文本区的行数。
- setColumns(int columns):设置文本区的列数。
文本区本身不带滚动条,当文本区显示的内容时可以将其加入到滚动面板(JScrollPane)中。
【例2】利用文本框和密码框等组件编程一个登录界面程序。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class LoginDemo extends JFrame{
JLabel usernameLabel = new JLabel("账号:");
JTextField usernameField=new JTextField(20);
JLabel passwordLabel = new JLabel("密码:");
JPasswordField passwordField=new JPasswordField(20);
JButton loginButton = new JButton("登录");
JButton exitButton = new JButton("退出");
public LoginDemo() {
setTitle("登录界面");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(350, 200);
this.setResizable(false);//禁用最大化
setLocationRelativeTo(null);//窗口相对于屏幕居中
Container contentPane=this.getContentPane();
JPanel panel1 = new JPanel();
SpringLayout springLayout=new SpringLayout();
panel1.setLayout(springLayout);//弹性布局
//账号标签布局
panel1.add(usernameLabel);
springLayout.putConstraint(SpringLayout.WEST, usernameLabel, 50,
SpringLayout.WEST, panel1);
springLayout.putConstraint(SpringLayout.NORTH, usernameLabel, 30,
SpringLayout.NORTH, panel1);
//账号文本框布局
panel1.add(usernameField);
springLayout.putConstraint(SpringLayout.WEST, usernameField, 10,
SpringLayout.EAST, usernameLabel);
springLayout.putConstraint(SpringLayout.NORTH, usernameField, 30,
SpringLayout.NORTH, panel1);
springLayout.putConstraint(SpringLayout.EAST, usernameField, -50,
SpringLayout.EAST, panel1);
//密码标签布局
panel1.add(passwordLabel);
springLayout.putConstraint(SpringLayout.WEST, passwordLabel, 50,
SpringLayout.WEST, panel1);
springLayout.putConstraint(SpringLayout.NORTH, passwordLabel, 30,
SpringLayout.SOUTH, usernameLabel);
//密码框布局
panel1.add(passwordField);
springLayout.putConstraint(SpringLayout.WEST, passwordField, 10,
SpringLayout.EAST, passwordLabel);
springLayout.putConstraint(SpringLayout.NORTH, passwordField, 30,
SpringLayout.SOUTH, usernameField);
springLayout.putConstraint(SpringLayout.EAST, passwordField, -50,
SpringLayout.EAST, panel1);
//将面板panel1放到窗口的中部
contentPane.add(panel1,BorderLayout.CENTER);
JPanel panel2 = new JPanel();
panel2.add(loginButton);
panel2.add(exitButton);
//将面板panel2放到窗口的下部
contentPane.add(panel2,BorderLayout.SOUTH);
//注册事件监听器(匿名类)
loginButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String username = usernameField.getText();
String password = new String(passwordField.getPassword());
if (username.equals("admin") && password.equals("password")) {
JOptionPane.showMessageDialog(LoginDemo.this, "登录成功!");
} else {
JOptionPane.showMessageDialog(LoginDemo.this, "登录失败!");
}
}
});
//注册事件监听器(匿名类)
exitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
setVisible(true);
}
public static void main(String[] args) {
new LoginDemo();
}
}
运行上述程序,显示结果如图2(a)所示。当用户输入账号 “admin”和密码“passord”,点击登录按钮,则弹出“登录成功!”的消息框,如图2(b)所示。如果用户输入的账号不是“admin”或者密码不是“passord”,点击登录按钮。则会弹出如图2(c)所示的消息框。当用户点击退出按钮,则会结束应用程序的运行。
(a)
(b)
(c)
图2. 登录界面示例