创建一个窗体
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
public class SwingLearn {
public static void main(String[] args) {
//实例化 JFrame
JFrame frame = new JFrame();
//设置相关属性
frame.setTitle("Swing学习");//标题
frame.setSize(300,300);//窗体大小
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击关闭按钮是关闭程序
frame.setLocationRelativeTo(null); //设置居中
frame.setResizable(false); //不允许修改界面大小
//获取容器
Container container = frame.getContentPane();
// 未设置Layout时,java默认为flowLayout布局的,设置为null即为清空布局管理器,之后添加组件,常常是设置组件左上角坐标相对于容器左上角(0,0)的x,y值来确定组件的位置,即使更改容器大小也不会改变位置。这种方式常常用于窗体大小固定的容器里。
frame.setLayout(null);
//创建按钮
JButton jButton = new JButton("我是按钮");
jButton.setBounds(100, 100, 100, 40);
jButton.setFocusPainted(false); // 去掉文字周围的虚线框
//按钮添加到容器中
container.add(jButton);
//设置显示
frame.setVisible(true);
}
}
jFrame.setVisible(true); // 因为你第一种写法是先用setVisible(true)显示框架,再用test.setContentPane(panel)将jtextfield组件加进来的。所以只要将setVisible(true)这句话写在后面就可以了。
JButton(按钮)
button.setSize(200,100)
JLabel(标签)
JTextArea(文本域)
JTextField(文本框)
布局
边框布局(BorderLayout)
流式布局(FlowLayout)
卡片布局(CardLayout)
网格布局(GridLayout)
网格包布局(GridBagLayout)
事件处理
jButton1.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标点击");
}
// 其他方法省略......
});
// 组件可以添加多个事件
jButton1.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标点击");
}
// 其他方法省略......
});
常用监听器
JFrame
创建一个窗体
JFrame jFrame = new JFrame();
jFrame.setSize(600,400); // 设置窗体大小
jFrame.setTitle("我是窗体标题"); // 设置窗体标题
jFrame.setVisible(true); // 设置窗体为可见(默认是不可见的)
// jFrame.setLocation(100,200); // 设置窗体的位置(距离左上角)
jFrame.setLocationRelativeTo(null); // 设置窗体出现在屏幕正中间(一般用这个)
// 点击关闭按钮时同时结束程序
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
注意:jFrame.setVisible(true) 需要放在所有组件的最后面,否则有时候会导致某些组件不能显示。
JLabel:标签
- setSize:设置大小
- setLocation:设置位置
- setFont:设置字体
- setIcon:设置图片
- setCursor:设置鼠标指针形状
- setToolTipText:设置 Tip 文本
部分代码:
jLabel1 = new JLabel("hello");
jLabel1.setSize(200,100);
jLabel1.setLocation(0,0);
// 这里需要传入一个Font类型的对象。参数:字体名称、字体样式、大小(磅)
jLabel1.setFont(new Font("微软雅黑",Font.ITALIC,40)); // 微软雅黑、斜体、40磅
// 标签添加图片
jLabel2 = new JLabel();
jLabel2.setSize(300,300);
jLabel2.setLocation(200,0);
// 需要一个Icon对象,这是一个接口。一般我们传入他的一个叫ImageIcon的实现类。
jLabel2.setIcon(new ImageIcon("可爱流萤.jpg")); // 注意路径。注意图片大小和标签大小要一致,否则显示不全
// 鼠标放到标签上,变成另一个形状
jLabel2.setCursor(new Cursor(Cursor.MOVE_CURSOR)); // 传入Cursor对象。参数:Cursor类的静态属性。
// 显示提示框。像idea那样
jLabel2.setToolTipText("这是一个tip");
运行

JTextField(文本框)和 JPasswordField(密码框)
- 文本框和密码框的ActionListener 是用来处理按下回车按键事件的
- doClick():相当于点击了这个按钮
- getPassword():获取密码框中的内容
- setEchoChar(char c):设置密码框中的回显字符,默认是黑点
- setColumns():文本框使用时,在空布局的情况下不起作用,流式布局可以看到效果,用 m 字母进行衡量。
JProgressBar:进度条
- setSize:设置大小
- setLocation:设置位置
- setFont:设置字体
- setValue(int value)/getValue():设置/获取当前值
- setMinimum(int n)/getMinimum:设置/获取最小值
- setMaximum(int n)/getMaximum:设置/获取最大值
- setStringPainted(boolean b):显示出任务完成度的百分比
- setString(String s):设置进度条文本
- ChangeListener:进度条最常用的监听器
确定模式和不确定模式
确定模拟:进度条有最大值,
不确定模式:一般用于网络下载,因为不确定啥时候下载完成,看网速。
// 构造方法参数:最小值、最大值
jProgressBar = new JProgressBar(0,10);
// jProgressBar.setMinimum(20); // 设置最小值
// jProgressBar.setMaximum(100); // 设置最大值
jProgressBar.setLocation(0,0);
jProgressBar.setSize(200,20);
// jProgressBar.setValue(20); // 蓝条没了,因为设置了最小值。
// jProgressBar.setValue(30);
jProgressBar.setStringPainted(true); // 设置显示完成度百分比(其实是显示字符串,默认是这样)
// jProgressBar.setString("未完成"); // 显示字符串
// 进度条进行设置监听器。按钮点击十次,进度条进行百分比变化,十次后显示完成。
// 按钮点击十次
jButton = new JButton("点击10次");
jButton.setSize(100,20);
jButton.setLocation(200,0);
jButton.addActionListener(e -> {
count = count+1;
jProgressBar.setValue(count);
});
// 进度条监听器
jProgressBar.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
System.out.println("changed");
// 获取当前值与最大值进行对比,判断任务是否完成
if(jProgressBar.getValue() == jProgressBar.getMaximum()){
jProgressBar.setString("任务已完成 ");
}
}
});
// 不确定进度条
jNot = new JProgressBar();
jNot.setSize(100,20);
jNot.setLocation(0,30);
jNot.setIndeterminate(true); // 进度条变为不确定模式。设置最大值和最小值没有用,不改变进度条
运行
