现在我们看一下Java中如何使用窗体
首先要导入javax.swing
包
import javax.swing.*;
public class Demo {
public static void main(String[] args) {
JFrame jFrame = new JFrame("窗体标题");//创建窗体对象
jFrame.setVisible(true);//设置窗体可见
/**
* 窗体关闭规则
* EXIT_ON_CLOSE : 隐藏窗口,并停止程序
* DO_NOTHING_ON_CLOSE : 无任何操作
* HIDE_ON_CLOSE : 隐藏窗体,但不停止程序
* DISPOSE_ON_CLOSE : 释放窗体资源
*/
jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//关闭窗体时关闭程序
//设置窗体大小,(单位:像素)
//jFrame.setSize(300, 200);
//设置坐标,(单位:像素)
//jFrame.setLocation(200, 200);
//设置窗体坐标,大小(单位:像素)
jFrame.setBounds(200, 200, 300, 200);
jFrame.setResizable(false);//设置窗体大小不可以改变
//获取窗体容器
Container c = jFrame.getContentPane();
c.setBackground(Color.BLUE);//设置背景颜色
JLabel jLabel = new JLabel("这是一个窗体");//创建一个标签
c.add(jLabel);//添加组件
c.remove(jLabel);//删除组件
c.validate();//验证容器中的组件(刷新)
jFrame.setContentPane(c);//重新载入容器
}
}
实际开发中,我们通常会将该类继承自JFrame
,然后直接在构造器中添加窗体配置,这样在创建新对象时,直接进行初始化即可。
public class Demo extends JFrame {
//在构造器中直接进行窗体的初始化配置
public Demo(){
setVisible(true); //设置窗体可见
setTitle("窗体标题"); //设置窗体标题
/**
* 窗体关闭规则
* EXIT_ON_CLOSE : 隐藏窗口,并停止程序
* DO_NOTHING_ON_CLOSE : 无任何操作
* HIDE_ON_CLOSE : 隐藏窗体,但不停止程序
* DISPOSE_ON_CLOSE : 释放窗体资源
*/
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//关闭窗体时关闭程序
//设置窗体大小,(单位:像素)
//jFrame.setSize(300, 200);
//设置坐标,(单位:像素)
//jFrame.setLocation(200, 200);
//设置窗体坐标,大小(单位:像素)
setBounds(200, 200, 300, 200);
setResizable(false);//设置窗体大小不可以改变
//获取窗体容器
Container c = getContentPane();
c.setBackground(Color.BLUE);//设置背景颜色
JLabel jLabel = new JLabel("这是一个窗体");//创建一个标签
c.add(jLabel);//添加组件
//c.remove(jLabel);//删除组件
c.validate();//验证容器中的组件(刷新)
setContentPane(c);//重新载入容器
}
public static void main(String[] args) {
new Demo();
}
}
对话框窗体
public class JDialogDemo extends JDialog {
public JDialogDemo(JFrame jFrame){
/**
* 第一个参数是父窗体对象
* 第二个参数:对话框标题
* 第三个参数:是否阻塞父窗体
*/
super(jFrame, "对话框标题", true);
Container c = getContentPane();//获取窗体容器
c.add(new JLabel("这是一个对话框"));
setVisible(true);//设置窗体可见
setBounds(100, 100, 100, 100);//设置窗体坐标和大小
}
public static void main(String[] args) {
JFrame f = new JFrame("父窗体");
f.setBounds(50, 50, 300, 300);
Container c = f.getContentPane();
JButton button = new JButton("弹出对话框");
c.setLayout(new FlowLayout());//设置布局,使用流布局
c.add(button);
f.setVisible(true);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置按钮监听事件
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JDialogDemo jd = new JDialogDemo(f);
jd.setVisible(true);
}
});
}
}
创建一个新标签JLabel jl = new JLabel("这是一个标签");
设置标签内容jl.setText("更改标签内容");
获取标签内容jl.getText("更改标签内容");
设置字体属性(字体类型,格式,大小) jl.setFont(new Font("微软雅黑", Font.BOLD, 24));
设置字体颜色jl.setForeground(Color.RED);
设置标签大小jl.setSize(200, 200)
public class JLabelDemo extends JFrame {
public JLabelDemo(){
setBounds(200, 200, 300, 200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
setVisible(true);
JLabel jl = new JLabel("这是一个标签");
jl.setText("更改标签内容");
//设置字体属性(字体类型,格式,大小)
jl.setFont(new Font("微软雅黑", Font.BOLD, 24));
//设置字体颜色
jl.setForeground(Color.RED);
//获取标签内容
System.out.println(jl.getText());
c.add(jl);
}
public static void main(String[] args) {
new JLabelDemo();
}
}
添加图片也是使用标签,有两种方式
第一种:
public class PicDemo extends JFrame {
public PicDemo() {
setBounds(200, 200, 600, 500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
setVisible(true);
JLabel jl = new JLabel("这是一个展示图片的标签");
//获取图片rul路径
URL url = PicDemo.class.getResource("beauty.jpg");
//设置图标
Icon icon = new ImageIcon(url);
//将图标添加到标签中
jl.setIcon(icon);
c.add(jl);
}
public static void main(String[] args) {
new PicDemo();
}
}
第二种:
public class PicDemo extends JFrame {
public PicDemo() {
setBounds(200, 200, 600, 500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
setVisible(true);
JLabel jl = new JLabel("这是一个展示图片的标签");
//设置图标
Icon icon = new ImageIcon("src/beauty.jpg");
//将图标添加到标签中
jl.setIcon(icon);
c.add(jl);
}
public static void main(String[] args) {
new PicDemo();
}
}
效果同上。
即使设置标签大小,也不会改变图片大小。
也叫null布局,使用坐标来控制组件位置
public class NullLayoutDemo extends JFrame {
public NullLayoutDemo(){
setBounds(200, 200, 500, 600);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
//将容器布局设为绝对布局
c.setLayout(null);
JButton b1 = new JButton("按钮一"),
b2 = new JButton("按钮二");
//设置按钮的位置和大小(位置相对于容器)
b1.setBounds(50, 100, 200, 100);
b2.setBounds(50, 300, 200, 100);
c.add(b1);
c.add(b2);
setVisible(true);
}
public static void main(String[] args) {
new NullLayoutDemo();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JOoZgdW0-1596465300481)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803181043974.png)]
将容器布局设为流布局:c.setLayout(new FlowLayout());
左对齐:c.setLayout(new FlowLayout(FlowLayout.LEFT));
右对齐:c.setLayout(new FlowLayout(FlowLayout.RIGHT));
水平间距,垂直间距:c.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 20));
案例:
public class FlowLayoutDemo extends JFrame {
public FlowLayoutDemo(){
setBounds(200, 200, 500, 600);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
//将容器布局设为流布局
c.setLayout(new FlowLayout());
for (int i = 0; i<20; i++){
c.add(new JButton("按钮" + i));
}
setVisible(true);
}
public static void main(String[] args) {
new FlowLayoutDemo();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jK1cEWS1-1596465300483)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803181354629.png)]
窗体的默认布局
public class BorderLayoutDemo extends JFrame {
public BorderLayoutDemo(){
setBounds(200, 200, 500, 600);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
//将容器布局设为流布局
c.setLayout(new BorderLayout());
JButton b1 = new JButton("中"),
b2 = new JButton("东"),
b3 = new JButton("南"),
b4 = new JButton("西"),
b5 = new JButton("北");
c.add(b1, BorderLayout.CENTER);
c.add(b2, BorderLayout.EAST);
c.add(b3, BorderLayout.SOUTH);
c.add(b4, BorderLayout.WEST);
c.add(b5, BorderLayout.NORTH);
setVisible(true);
}
public static void main(String[] args) {
new BorderLayoutDemo();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YwG2g45Q-1596465300485)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803182441461.png)]
覆盖:如果在同一位置添加新元素,新组建会覆盖旧组件。
public class GridLayoutDemo extends JFrame {
public GridLayoutDemo(){
setBounds(200, 200, 500, 600);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
//将容器布局设为网格布局
//7 行 3 列,水平间距,垂直间距均为5
c.setLayout(new GridLayout(7, 3, 5, 5));
for (int i = 0; i<=20; i++){
c.add(new JButton("按钮" + i));
}
setVisible(true);
}
public static void main(String[] args) {
new GridLayoutDemo();
}
}
效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-45Q2Qg5l-1596465300486)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803183007875.png)]
会根据窗体的大小动态改变按钮的大小。始终保持窗体的排列顺序。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f5IRX4kV-1596465300487)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803183233234.png)]
如果手动分配的行列数不可以满足组件数,系统自动优化布局,将行列扩大,从而达到所有组件都可以显示。
有三种下拉列表框中添加数据的方法
方法一
JComboBox<String> jcb = new JComboBox<>();
jcb.addItem("身份证");
jcb.addItem("学生证");
jcb.addItem("工作证");
方法二
String items[] = {"数组元素1", "数组元素2", "数组元素3"};
JComboBox<String> jcb = new JComboBox<>(items);
方法三
JComboBox<String> jcb = new JComboBox<>();
String items[] = {"数组元素1", "数组元素2", "数组元素3"};
ComboBoxModel cm = new DefaultComboBoxModel(items);//创建下拉列表模型,保存下拉列表中的数据
jcb.setModel(cm);//向列表中添加数据模型
复选框是否可以被编辑:jcb.setEditable(true/false)
案例:
public class JComBoxDemo extends JFrame {
public JComBoxDemo(){
setBounds(200, 200, 300, 200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
setVisible(true);
// 方法一
// JComboBox jcb = new JComboBox<>();
// jcb.addItem("身份证");
// jcb.addItem("学生证");
// jcb.addItem("工作证");
// 方法二
// String items[] = {"数组元素1", "数组元素2", "数组元素3"};
// JComboBox jcb = new JComboBox<>(items);
JComboBox jcb = new JComboBox<>();
String items[] = {"数组元素1", "数组元素2", "数组元素3"};
ComboBoxModel cm = new DefaultComboBoxModel(items);//创建下拉列表模型,保存下拉列表中的数据
jcb.setModel(cm);//向列表中添加数据模型
JButton btn = new JButton("打印");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("选中的索引" + jcb.getSelectedIndex() );
System.out.println("选中的值" + jcb.getSelectedItem());
}
});
btn.setBounds(100, 10, 60, 20);
c.add(btn);
jcb.setBounds(100, 100, 100, 100);
jcb.setEditable(true/false)//复选框是否可以被编辑
c.add(jcb);
}
public static void main(String[] args) {
new JComBoxDemo();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8jvnTXfL-1596465300490)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803195402798.png)]
public class JListDemo extends JFrame {
public JListDemo() {
setBounds(200, 200, 300, 200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
setVisible(true);
String items[] = {"元素1", "元素2", "元素3", "元素4", "元素5"};
JList<String> jl = new JList(items);
jl.setBounds(10, 10, 100, 30);
c.add(jl);
c.add(jl);
}
public static void main(String[] args) {
new JListDemo();
}
}
但是这样可能会出现信息显示不全的可能。
所以我们添加一个滚动面板
public JListDemo() {
setBounds(200, 200, 300, 200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
setVisible(true);
String items[] = {
"元素1", "元素2", "元素3", "元素4", "元素5",
"元素1", "元素2", "元素3", "元素4", "元素5",
"元素1", "元素2", "元素3", "元素4", "元素5",
"元素1", "元素2", "元素3", "元素4", "元素5"};
JList jl = new JList(items);
//为列表框添加滚动条
JScrollPane js = new JScrollPane(jl);
js.setBounds(10, 10, 100, 100);
c.add(js);
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-euxHSbrQ-1596465300491)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803205346059.png)]
其它添加数据的方法:
通过数据模型添加元素
public JListDemo() {
setBounds(200, 200, 300, 200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
setVisible(true);
String items[] = {
"元素1", "元素2", "元素3", "元素4", "元素5",
"元素1", "元素2", "元素3", "元素4", "元素5",
"元素1", "元素2", "元素3", "元素4", "元素5",
"元素1", "元素2", "元素3", "元素4", "元素5"};
DefaultListModel<String> model = new DefaultListModel<>();
for (String tmp:items){
model.addElement(tmp);//向数据模型添加元素
}
JList<String> jl = new JList(items);
jl.setModel(model);//列表框载入数据模型。
//为列表框添加滚动条
JScrollPane js = new JScrollPane(jl);
js.setBounds(10, 10, 100, 100);
c.add(js);
}
设置选择模式:
/*
* 1.SINGLE_SELECTION 单选模式
* 2.SINGLE_INTERVAL_SELECTION 只能连续选择相邻的元素
* 3.MULTIPLE_INTERVAL_SELECTION 随便选
*/
jl.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
取出选择的内容:
JButton jbt = new JButton("选择内容");
jbt.setBounds(10,10,60,20);
jbt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获取列表框中选中的所有元素
List<String> values = jl.getSelectedValuesList();
for(String tmp: values){
System.out.println(tmp);
}
System.out.println("--------end--------");
}
});
c.add(jbt);
完整代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
public class JListDemo extends JFrame {
public JListDemo() {
setBounds(200, 200, 300, 200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
setVisible(true);
String items[] = {
"元素1", "元素2", "元素3", "元素4", "元素5",
"元素1", "元素2", "元素3", "元素4", "元素5",
"元素1", "元素2", "元素3", "元素4", "元素5",
"元素1", "元素2", "元素3", "元素4", "元素5"};
DefaultListModel<String> model = new DefaultListModel<>();
for (String tmp:items){
model.addElement(tmp);//向数据模型添加元素
}
JList<String> jl = new JList(items);
jl.setModel(model);//列表框载入数据模型。
/*
* 1.SINGLE_SELECTION 单选模式
* 2.SINGLE_INTERVAL_SELECTION 只能连续选择相邻的元素
* 3.MULTIPLE_INTERVAL_SELECTION 随便选
*/
jl.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
//为列表框添加滚动条
JScrollPane js = new JScrollPane(jl);
js.setBounds(10, 10, 100, 100);
JButton jbt = new JButton("选择内容");
jbt.setBounds(10,10,60,20);
jbt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获取列表框中选中的所有元素
List<String> values = jl.getSelectedValuesList();
for(String tmp: values){
System.out.println(tmp);
}
System.out.println("--------end--------");
}
});
c.add(jbt);
c.add(js);
}
public static void main(String[] args) {
new JListDemo();
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
public class JTestFieldDemo extends JFrame {
public JTestFieldDemo() {
setBounds(200, 200, 300, 200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
setVisible(true);
//设置文本框长度=setColumns(20)
JTextField jt = new JTextField(20);
jt.setColumns(20);
jt.setText("这是一个文本框");
jt.setFont(new Font("黑体", Font.PLAIN, 20));
c.add(jt);
JButton jbt = new JButton("获取内容");
jbt.setBounds(10, 10, 60, 20);
jbt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获取文本框中的文本值
System.out.println("文本框中的内容为:" + jt.getText());
jt.setText("");//清空
jt.requestFocus();//获取焦点
}
});
c.add(jbt);
}
public static void main(String[] args) {
new JTestFieldDemo();
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JPasswordFieldDemo extends JFrame {
public JPasswordFieldDemo() {
setBounds(200, 200, 300, 200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
setVisible(true);
JPasswordField jp = new JPasswordField();
jp.setColumns(20);//设置密码框长度
jp.setFont(new Font("黑体", Font.PLAIN, 20));//设置字体
//jp.setEchoChar('*');
jp.setEchoChar('\u2605');//设置回显字符
//设置密码框的动态监听
jp.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
char ch[] = jp.getPassword();//获取密码的字符数组
String str = new String(ch);
System.out.println(str);
}
});
c.add(jp);
}
public static void main(String[] args) {
new JPasswordFieldDemo();
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JTextAreaDemo extends JFrame {
public JTextAreaDemo() {
setBounds(200, 200, 300, 200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
setVisible(true);
JTextArea jt = new JTextArea();
jt.setColumns(100);//设置100列
jt.setRows(200);//设置200行
//jt.setText("这是一个文本域");//设置文本域内容
jt.append("这是一个文本域,你可以在后面添加内容");
jt.insert("插入",10);//在第10个字符后面插入内容
jt.setFont(new Font("楷体", Font.PLAIN, 28));
//给文本域添加滚动条
JScrollPane js = new JScrollPane(jt);
c.add(js);
}
public static void main(String[] args) {
new JTextAreaDemo();
}
}
相当于Android的点击事件,只是实现方法不同
按钮点击事件
JButton jbt = new JButton();
jbt.setBounds(10,10,40,20);
jbt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//监听到事件发生后执行的逻辑
}
});
jt.addFocusListener(new FocusListener() {
@Override
//获得焦点
public void focusGained(FocusEvent e) {
System.out.println("获得焦点");
}
@Override
//失去焦点
public void focusLost(FocusEvent e) {
System.out.println("失去焦点");
}
});
简化操作:
定义一个焦点监听实现类实现FocusListener
接口。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
public class JTextAreaDemo extends JFrame {
public JTextAreaDemo() {
setBounds(200, 200, 300, 200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
setVisible(true);
JTextArea jt = new JTextArea();
jt.setColumns(100);//设置100列
jt.setRows(200);//设置200行
//jt.setText("这是一个文本域");//设置文本域内容
jt.append("这是一个文本域,你可以在后面添加内容");
jt.insert("插入",10);//在第10个字符后面插入内容
jt.setFont(new Font("楷体", Font.PLAIN, 28));
//使用自定义鉴定实现类
jt.addFocusListener(new MyFocusListener());
c.add(jt);
}
public static void main(String[] args) {
new JTextAreaDemo();
}
//自定义的焦点事件监听实现类
class MyFocusListener implements FocusListener{
@Override
public void focusGained(FocusEvent e) {
Object o = e.getSource();//获取触发世事件的组件
System.out.println(o.toString());
}
@Override
public void focusLost(FocusEvent e) {
Object o = e.getSource();//获取触发世事件的组件
System.out.println(o.toString());
}
}
}
```[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w6ANNhEk-1596465300474)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803155743764.png)]