基本格式
创建一个图形用户界面的基本步骤,直接上代码
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
/**
* Creat By xiao on 2020/4/1
**/
public class HelloSwingDemo {
public static void main(String[] args)throws IOException {
//创建窗口--顶层容器的一个实例
new HelloSwingGUI();
}
}
//TODO:基本格式
class HelloSwingGUI extends JFrame{ //1.继承JFrame
//2.定义组件,把需要的swing定义好
JLabel messageLab1 ;
JTextField messageText ;
JButton okBtn;
//构造方法
public HelloSwingGUI(){
//3.创建组件
//创建标签
messageLab1 = new JLabel("Message:");
//创建文本框
messageText = new JTextField(10);
//创建按钮
okBtn = new JButton("OK");
//设置窗口组件排列方式
this.setLayout(new FlowLayout());//流式布局
//4.添加组件到容器
this.add(messageLab1);
this.add(messageText);
this.add(okBtn);
//5.设置窗体
this.setTitle("组件显示");
this.setSize(300,100);
//设置当窗体关闭时JVM也推出
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//6.显示窗体--设置窗体可见
this.setVisible(true);
}
}
在展示窗口的基础上,有很多布局方法
个人感觉很类似QT,不过qt习惯了ui界面的直接拖动操作,对于用代码执行有点奇怪。
**所有的创建窗口方法都是new一个实例,就不编写main方法了。**
边界布局
特点:安放组件时可以添加方位
//TODO:边界布局
class BorderLayoutGUI extends JFrame{
JButton jb1,jb2,jb3,jb4,jb5;
public BorderLayoutGUI(){
jb1 = new JButton("中部");
jb2 = new JButton("东部");
jb3 = new JButton("南部");
jb4 = new JButton("西部");
jb5 = new JButton("北部");
this.add(jb1,BorderLayout.CENTER);
this.add(jb2,BorderLayout.EAST);
this.add(jb3,BorderLayout.SOUTH);
this.add(jb4,BorderLayout.WEST);
this.add(jb5,BorderLayout.NORTH);
this.setTitle("边界布局案例");
this.setSize(300,200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setResizable(false);
}
}
流式布局
特点:拖动窗口会随窗口而变化位置
//TODO:流式布局
class FlowLayoutGUI extends JFrame{
JButton [] jbs = new JButton[6];
public FlowLayoutGUI(){
String [] s = {"关羽","张飞","赵云","马超","魏延","黄忠"};
for(int i=0;i<jbs.length;i++){
jbs[i] = new JButton(s[i]);
}
this.setLayout(new FlowLayout());//默认居中
for (int i=0;i<jbs.length;i++){
this.add(jbs[i]);
}
this.setTitle("流式布局管理案例");
this.setSize(350,100);
//设置当窗体关闭时JVM也推出
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
网格布局
特点:可指定行数,列数
//TODO:网格布局
class GridLayout extends JFrame{
int size = 9;
JButton [] jbs = new JButton[size];
public GridLayout(){
for (int i=0;i<jbs.length;i++)
jbs[i] = new JButton(String.valueOf(i+1));
//设置布局---3行3列,10位行距和列距
this.setLayout(new java.awt.GridLayout(3,3,10,10));
for (int i=0;i<jbs.length;i++){
this.add(jbs[i]);
}
this.setTitle("网格布局管理案例");
this.setSize(300,200);
//设置当窗体关闭时JVM也推出
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
其它控件
也有点像qt(吐槽)
布局管理器
特点:默认边界布局,相当于一个容器,个人感觉用途在于方便编写代码指定位置
class LayoutGUI extends JFrame{
JPanel jp1,jp2;
JButton [] jbs = new JButton[6];
public LayoutGUI(){
jp1 = new JPanel();
jp2 = new JPanel();
String s[] = {"飒飒","撒旦","手动","我去","委屈","热情"};
for (int i=0;i<jbs.length;i++)
jbs[i] = new JButton(s[i]);
//布局管理器--使用默认的边界布局
jp1.add(jbs[0]);
jp1.add(jbs[1]);
for (int i=2;i<5;i++)
jp2.add(jbs[i]);
//把JPanel添加到jFrame
this.add(jp1, BorderLayout.NORTH);
this.add(jp2,BorderLayout.SOUTH);
this.add(jbs[5],BorderLayout.CENTER);
this.setTitle("综合布局案例");
this.setSize(300,200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
单选/复选框
特点:控件,没有特点
class Register extends JFrame{
JPanel jp1,jp2,jp3;
JLabel jl1,jl2;
JButton jb1,jb2;
JCheckBox jcb1,jcb2,jcb3;//复选按钮
JRadioButton jrb1,jrb2;//单选按钮
ButtonGroup buttonGroup;//单选按钮组
public Register(){
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jl1 = new JLabel("你喜欢的运动");
jl2 = new JLabel("你的性别");
jb1 = new JButton("注册用户");
jb2 = new JButton("取消注册");
jcb1 = new JCheckBox("足球");
jcb2 = new JCheckBox("篮球");
jcb3 = new JCheckBox("乒乓球");
jrb1 = new JRadioButton("男");
jrb2 = new JRadioButton("女");
//一定要把jrb1,jrb2加到一个ButtonGroup集中管理
buttonGroup = new ButtonGroup();
buttonGroup.add(jrb1);
buttonGroup.add(jrb2);
this.setLayout(new GridLayout(3,1));
jp1.add(jl1);
jp1.add(jcb1);
jp1.add(jcb2);
jp1.add(jcb3);
jp2.add(jl2);
jp2.add(jrb1);
jp2.add(jrb2);
jp3.add(jb1);
jp3.add(jb2);
this.add(jp1);
this.add(jp2);
this.add(jp3);
this.setSize(300,150);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("用户注册");
this.setVisible(true);
}
}
下拉框/列表框/滚动窗格组件
特点:控件
//TODO:下拉框/列表框/滚动窗格组件
class ComBoBoxGUI extends JFrame{
JPanel jp1,jp2;
JLabel jl1,jl2;
JComboBox jComboBox;
JList jList;
JScrollPane jScrollPane;//滚动面板
public ComBoBoxGUI(){
jp1 = new JPanel();
jp2 = new JPanel();
jl1 = new JLabel("你的籍贯:");
jl2 = new JLabel("旅游地点:");
String [] jg = {"北京","湖南","上海","武汉"};
jComboBox = new JComboBox(jg);
String [] add = {"九寨沟","故宫","长城","非洲"};
jList = new JList(add);
//设置你希望显示多少个选项
jList.setVisibleRowCount(3);
//列表加入到滚动面板
jScrollPane = new JScrollPane(jList);
//设置布局,添加组件
this.setLayout(new GridLayout(2,1));
jp1.add(jl1);
jp1.add(jComboBox);
jp2.add(jl2);
jp2.add(jScrollPane);
this.add(jp1);
this.add(jp2);
this.setTitle("用户调查");
this.setSize(200,200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
按钮事件处理
特点:按钮的特点,下面是一个简单的用户登录界面,图片需要自己导入
//TODO:按钮事件处理
class LoginGUI extends JFrame implements ActionListener {
private JPanel jPanel1,jPanel2,jPanel3;
private JLabel jlUser,jlPwd;
private JButton jbLogin,jbCancel;
private JTextField jTextField;
private JPasswordField jPasswordField;
public LoginGUI(){
jPanel1 = new JPanel();
jPanel2 = new JPanel();
jPanel3 = new JPanel();
jlUser = new JLabel("用户名");
jlPwd = new JLabel("密 码");
jbLogin = new JButton("登录");
jbCancel = new JButton("取消");
//控制宽度,美观
jTextField = new JTextField(10);
jPasswordField = new JPasswordField(10);
//组件外观设置
//设置字体
Font font = new Font("楷体",Font.BOLD,18);
jlUser.setFont(font);
jlPwd.setFont(font);
jbLogin.setFont(font);
jbCancel.setFont(font);
//设置前景色
Color color = new Color(0,0,255);
jlUser.setForeground(color);
jlPwd.setForeground(Color.blue);
jbLogin.setForeground(color);
jbCancel.setForeground(color);
//创建容器(使用默认容器),设置布局管理器
this.setLayout(new GridLayout(3,1));
jPanel1.add(jlUser);
jPanel1.add(jTextField);
jPanel2.add(jlPwd);
jPanel2.add(jPasswordField);
jPanel3.add(jbLogin);
jPanel3.add(jbCancel);
this.add(jPanel1);
this.add(jPanel2);
this.add(jPanel3);
//监听注册----注册按钮事件到监听器frame
jbLogin.addActionListener(this);//this代表这个Frame
jbCancel.addActionListener(this);
//设置图标
ImageIcon icon = new ImageIcon("image/1.jpg");
this.setIconImage(icon.getImage());
this.setTitle("用户登录");
this.setSize(300,180);
this.setLocation(300,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
//实现接口ActionListener的接收事件和委派事件的actionPerformed
//当按钮被单击时actionPerformed方法被调用
@Override
public void actionPerformed(ActionEvent actionEvent) {
//检测哪个按钮被单击
if(actionEvent.getSource()==jbLogin){
if (check() == true){
JOptionPane.showMessageDialog(null,
"成功登录\n用户名和密码正确","提示",1);
}
else
{
JOptionPane.showMessageDialog(null,
"用户名或者密码错误","提示",2);
}
}
else
if (actionEvent.getActionCommand()=="取消"){
clear();
}
}
//自定义方法,检查用户名和密码
public boolean check(){
String userName = "dxxy";
String userPW = "admin";
String user = jTextField.getText().trim();//trim()去掉多余空格
String pw = String.valueOf(jPasswordField.getPassword()).trim();
if (user.equals(userName)&&pw.equals(userPW))
return true;
else
return false;
}
//清空文本框
private void clear(){
jTextField.setText("");
jPasswordField.setText("");
}
}
鼠标事件处理
特点:鼠标的所有事件可以不用覆写(制空),该实例是处理鼠标拖动和按下,实现画图的基本功能
//TODO:鼠标事件处理--徒手绘图
class DragDrawFrame extends JFrame
implements MouseListener, MouseMotionListener {
JPanel jPanel;
int x1,x2,y1,y2;
public DragDrawFrame(){
jPanel = new JPanel();
this.add(jPanel);
//设置监听
this.addMouseListener(this);
this.addMouseMotionListener(this);
this.setSize(300,300);
this.setTitle("徒手绘图");
this.setLocation(400,400);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//实现接口中的所有方法
@Override
public void mouseClicked(MouseEvent mouseEvent) {
}
@Override
public void mousePressed(MouseEvent mouseEvent) {
x1=mouseEvent.getX();
y1=mouseEvent.getY();
}
@Override
public void mouseReleased(MouseEvent mouseEvent) {
}
@Override
public void mouseEntered(MouseEvent mouseEvent) {
}
@Override
public void mouseExited(MouseEvent mouseEvent) {
}
//鼠标拖动
@Override
public void mouseDragged(MouseEvent mouseEvent) {
//Graphics2D:JAVA中呈现二维形状、文本、图像的基础类,验证码生成用到此类
Graphics2D g = (Graphics2D)getGraphics();
x2 = mouseEvent.getX();
y2 = mouseEvent.getY();
g.draw(new Line2D.Double(x1,y1,x2,y2));//绘制直线
x1 = x2;
y1 = y2;
g.dispose();//释放此图形的上下文并释放他用到的所有系统资源
}
@Override
public void mouseMoved(MouseEvent mouseEvent) {
}
}
键盘事件处理
特点:单纯读取键盘按下的数值并检测按下的状态,好像是只支持ascll表的,如果切换英文输入就会出现乱码
//TODO:键盘事件处理
class KeyGUI extends JFrame implements KeyListener{
JLabel jLabel;
public KeyGUI(){
jLabel = new JLabel();
this.add(jLabel);
//设置标签文字水平居中
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
//设置字体
jLabel.setFont(new Font("Serif",Font.ITALIC,25));
//设置前景色
jLabel.setForeground(Color.RED);
//添加注册键盘事件监听器
this.addKeyListener(this);
//窗口设置
this.setTitle("键盘处理事件");
this.setSize(350,200);
//设置窗口居中
this.setLocationRelativeTo(this);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//实现KeyListener中的方法
@Override
public void keyTyped(KeyEvent keyEvent) {
}
@Override
public void keyPressed(KeyEvent keyEvent) {
jLabel.setText("键盘字符为"+ keyEvent.getKeyChar()+"事件:key down");
}
@Override
public void keyReleased(KeyEvent keyEvent) {
jLabel.setText("键盘字符为"+ keyEvent.getKeyChar()+"事件:key up");
}
}
利用监听器适配器类实现事件处理
特点:因为Java是单继承机制,所有当只能基础一个类时,可以在内部再定义一个类,称之为监听器
//TODO:利用监听器适配器类实现事件处理
class MouseAdapterGUI extends MouseAdapter{
JFrame jFrame;
public MouseAdapterGUI(){
jFrame = new JFrame();
jFrame.setSize(350,150);
jFrame.setVisible(true);
jFrame.addMouseListener(this);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//只需要重写mouseClicked方法
@Override
public void mouseClicked(MouseEvent e) {
jFrame.setTitle("点击坐标为("+e.getX()+","
+e.getY()+")");
}
}
匿名函数
特点:代码的监听器中创建的MouseAdapter是没有实例的,当可以直接覆写它的方法,广泛用于编程(画重点)
//TODO:匿名内部类
class MouseAdapterGUI2 extends JFrame{
JFrame jFrame;
public MouseAdapterGUI2(){
jFrame = new JFrame();
jFrame.setSize(350,150);
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//方法addMouseListener中定义一个匿名内部类
jFrame.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
jFrame.setTitle("点击坐标为("+e.getX()+","
+e.getY()+")");
}
});//匿名内部类结束
}
}
小结
这些代码过一篇就可以算是图形界面的基本框架有了,可以直接拖到编译器里面运行。如果看完有点帮助,不胜荣幸。