Java初学——Swing界面设计(二)
Java中图形化界面编程——JFrame、JPanel、JTextFeild、JPasswordField和JButton的使用
文章目录
一、前言
本篇文章将通过简单的Java登录界面代码来简单介绍Swing中的基础组件JFrame、JPanel、JTextFeild、JPasswordField和JBotton的使用。代码所用jdk为Java8,使用IntelliJ IDEA和Swing UI Designer插件。IntelliJ IDEA和Swing UI Designer插件的介绍和简单使用见上一篇文章。
1、登录代码及注释展示
Signin类代码:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Signin extends JFrame {
private JTextField textField1;
private JPanel panel1;
private JPasswordField passwordField1;
private JButton 登录Button;//夹带中文命名仅为简单区分两个按钮
private JButton 取消Button;//虽然系统不报错只发出非ASCII码值的警告,但不推荐这种写法
public Signin(User user){
setTitle("图书馆管理系统用户登录");//设置界面标题
setDefaultCloseOperation(EXIT_ON_CLOSE);//设置窗口关闭时的操作为退出整个应用程序
setContentPane(panel1);//设置为窗口内容面板
pack();//调整窗口大小,使其刚好容纳所有子组件
setLocationRelativeTo(null);//窗口居中
setVisible(true);//设置框架可见
登录Button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String name = textField1.getText();//得到用户从文本框输入的文本
String password = new String (passwordField1.getPassword());//得到用户从密码框输入的密码并转化为 String类对象
if(name.isEmpty() || password.isEmpty()){
System.out.println("账号名称或账号密码不能为空");
}//处理文本框和密码框为空的情况
else{
if(user == null){
System.out.println("空指针异常");//判定传入User对象是否为空指针
}
else{
if(user.getPassword().equals(password) && user.getName().equals(name)){
System.out.println("登录成功");
}
else{
System.out.println("登录失败");
}//判断账号名称和密码是否为真确
}
}
}
});//重写动作监听器,监听登录按钮按下的动作
取消Button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dispose();//关闭frame界面
}
});//重写动作监听器,监听取消按钮按下的动作
}
}
Main类:
import javax.swing.*;
public class Main {
public static void main(String[] args) {
//不推荐硬编码,此处仅为简单展示登录功能
User user = new User();
user.setName("张三");
user.setPassword("123");
//把创建和显示界面的代码,放到 Swing 的“事件分发线程(Event Dispatch Thread, EDT)”上去执行
// Swing 界面操作必须且只能在这条专用线程上执行,invokeLater 就是保证这一点。
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Signin signin = new Signin(user);
}});
}
}
2、界面展示


3、User类代码展示
public class User {
private String name;
private String password;
public User(){}
public User(String name,String password){
this.name = name;
this.password = password;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
}
二、JFrame和JPanel的使用
setTitle()、setDefaultCloseOperation()、setContentPane()、pack()、setLocationRelativeTo()和setVisible()均为JFrame类的方法。Signin类继承JFrame可直接使用JFrame的方法,不需要创建Frame类对象。
setTitle()将()中String类对象作为运行窗口的标题。

setDefaultClose()设置窗口关闭的默认形式,可在()中输入DO_NOTHING_ON_CLOSE(按下窗口的红叉后不会有任何作用,既不会关闭当前窗口,也不会暂停程序)、Hide_ON_CLOSE(当()中未输入任何内容时setDefaultClose的默认值,按下窗口红叉时只将窗口隐藏,运行窗口的程序依然执行)、DISPOSE_ON_CLOSE(按下红叉后销毁当前窗口,释放当前窗口资源)和EXIT_ON_CLOSE(按下红叉后调用System.exit(0)结束所有程序)。
setContentpane()可以将指定容器(如 JPanel)设为 JFrame 的内容面板,也可以用来更换内容面板但需要revalidate()和repaint()来刷新布局和重绘界面。如果没有setContentpane()或没有指定正确的内容面板,都会导致窗口空白。
pack()负责将窗口适配到刚好容纳所有组件的大小,避免运行窗口过小。如果仍然嫌窗口太小,可以在signin.form中的组件树点击Jpanel1并在下方属性中勾选显示专家属性找到preferredSize更改窗口大小,或使用setSize()输入高和宽,也可以使用setBounds()在调整窗体位置的同时设置窗体大小。
setLocationRelativeTo()设置窗口位置相对什么组件居中,输入null就是窗口居于主屏幕中间。对于窗口的位置调整也可以使用上文提到的setBounds,对于组件的位置可以使用LayoutManager布局管理器来处理。
setVisible()设置窗口是否可见,输入true则运行后窗口可见,反之则无。
dispose()关闭窗口并释放窗口资源。
三、JTextFeild和JPasswordField的使用
1、JTextFeild的使用
JTextFeild可以通过setText()为窗口的文本框设置字段文本和指定列数,通过getText获得窗口运行时用户输入的文本且返回值为String类。如果想要用户在按Enter键时触发ActionEvent,则需要添加监听器。如果想要限制用户输入内容,则需要通过其子类JFormattedTextFeild的方法。
2、JPasswordField的使用
在JPasswordField中输入文本时会掩盖输入内容,其返回值类型为char类型数组。可通过setEchoChar()来设置掩码字符。如果想将其返回值转化为String类可以使用new String(passwordFeild1.get())、String.ValueOf(passwordFeild1.get())和Arrays.toString(passwordFeild1.get()),不能使用passwordFeild1.toString()来处理。其继承自JTextFeild,相同点不再介绍。
四、JButton的使用
JButton功能的实现依赖于动作事件监听器去监听动作,我们需要为其增添动作事件监听器(addActionEvent),并采用匿名内部类的写法(该类不需要写方法体,只使用一次)重写public void actionPerformed(ActionEvent e)方法。其中ActionEvent e不需要额外处理,只需在重写的方法的方法体内写按钮按下后的应该触发的功能。
更多推荐

所有评论(0)