Java_SWING个人学习笔记

目录

一、布局

1.FlowLayout(流式布局)

2.GridLayout(网格布局)

3.GridBagLayout(网格袋布局)

4.BoxLayout(箱式布局)

5.CardLayout(卡片布局)

6.BorderLayout(边界布局)

7.AbsoluteLayout(绝对布局)

二、组件

三、事件

0.监听

1.焦点事件

2.鼠标事件

3.键盘事件

4.窗口事件

附加、Graphics类的常用图形绘制方法


 


一、布局

1.FlowLayout(流式布局)

FlowLayout,流式布局管理器。按水平方向依次排列放置组件,排满一行,换下一行继续排列。排列方向(左到右 或 右到左)取决于容器的componentOrientation属性(该属性属于Component),它可能的值如下:

  • ComponentOrientation.LEFT_TO_RIGHT(默认)
  • ComponentOrientation.RIGHT_TO_LEFT

同一行(水平方向)的组件的对齐方式由 FlowLayout 的align属性确定,它可能的值如下:

FlowLayout.LEFT

左对齐

FlowLayout.CENTER

居中对齐(默认)

FlowLayout.RIGHT

右对齐

FlowLayout.LEADING

与容器方向的开始边对齐,例如,对于从左到右的方向,则与左边对齐

FlowLayout.TRAILING

与容器方向的结束边对齐,例如,对于从左到右的方向,则与右边对齐。

FlowLayout的 构造方法:

FlowLayout()

 

// 默认 居中对齐的,水平和垂直间隙是 5 个单位

 

FlowLayout(int align)

// 指定对齐方式,默认的水平和垂直间隙是 5 个单位

FlowLayout(int align, int hgap, int vgap)

 

// 指定对其方式,水平 和 竖直 间隙

 

2.GridLayout(网格布局)

GridLayout,网格布局管理器。它以矩形网格形式对容器的组件进行布置,把容器按行列分成大小相等的矩形网格,一个网格中放置一个组件,组件宽高自动撑满网格。

以行数和总数优先: 通过构造方法或 setRows 和 setColumns 方法将行数和列数都设置为非零值时,指定的列数将被忽略。列数通过指定的行数和布局中的组件总数来确定。因此,例如,如果指定了三行和两列,在布局中添加了九个组件,则它们将显示为三行三列。仅当将行数设置为零时,指定列数才对布局有效。

GridLayout构造方法:

GridLayout()

 

默认构造, 每个组件占据一行一列

GridLayout(int rows, int cols)

 

指定 行数 和 列数 的网格布局

GridLayout(int rows, int cols, int hgap, int vgap)

 

指定 行数 和 列数 的网格布局, 并指定 水平 和 竖直 网格间隙

 

3.GridBagLayout(网格袋布局)

GridBagLayout,网格袋布局管理器。它不要求组件的大小相同便可以将组件垂直、水平或沿它们的基线对齐。每个 GridBagLayout 对象维持一个动态的矩形单元格(动态计算出单个单元格的大小),每个组件占用一个或多个的单元格,该单元格被称为 显示区域。每个组件显示区域按 从左到右,从上到下,依次排列。

 

4.BoxLayout(箱式布局)

它把若干组件按水平或垂直方向依次排列放置。Swing 提供了一个实现了 BoxLayout 的容器组件Box。使用 Box 提供的静态方法,可快速创建水平/垂直箱容器(Box),以及填充组件之间空隙的不可见组件。用水平箱和垂直箱的组合嵌套可实现类似于 GridBagLayout 的效果,但没那么复杂。

 

5.CardLayout(卡片布局)

CardLayout,卡片布局管理器。

它将容器中的每个组件看作一张卡片,一次只能看到一张卡片,容器则充当卡片的堆栈,默认显示第一张卡片。

 

6.BorderLayout(边界布局)

BorderLayout,边界布局管理器。

它把 Container 按方位分为 5 个区域(东、西、南、北、中),每个区域放置一个组件。

 

7.AbsoluteLayout(绝对布局)

绝对布局尺寸坐标不会随设备屏幕大小改变。

 

 

 


 

二、组件

1JLabel
JLabel 对象是一个在容器中放置文本的组件。
2JButton
该类创建一个有标签的的按钮。
3JColorChooser
JColorChooser 提供一个控制面板,设计允许用户操作和选择颜色。
4JCheck Box
JCheckBox 是一个图形化的组件,它的状态要么是 on(true)要么是 off(false)。
5JRadioButton
JRadioButton 类是一个图形化的组件,在一个组中,它的状态要么是 on(true)要么是off(false)。
6JList
JList 组件呈现给用户一个滚动的文本项列表。
7JComboBox
JComboBox 组件呈现给用户一个显示菜单的选择。
8JTextField
JTextField 对象是一个文本组件,它允许编辑单行文本。
9JPasswordField
JPasswordField 对象是一个专门用于密码输入的文本组件。
10JTextArea
JTextArea 对象是一个文本组件,它允许编辑多行文本。
11ImageIcon
ImageIcon 控件是一个图标界面的实现,它从图像描绘图标
12JScrollbar
Scrollbar 控件代表一个滚动条组件,为了让用户从值的范围中选择。
13JOptionPane
JOptionPane 提供了一组提示用户输入值的标准对话框,或者通知他们其他东西。
14JFileChooser
JFileChooser 控件代表一个对话框窗口,用户可以从该对话框窗口选择一个文件。
15JProgressBar
随着任务完成的进展,进度条显示任务完成的百分比。
16JSlider
JSlider 让用户在有界区间内通过滑动旋钮图形化地选择一个值。
17JSpinner
JSpinner 是一个单行输入字段,它让用户从一个有序序列中选择一个数字或者一个对象值。

一个简单的Demo:

package test;

import java.awt.*;

import javax.swing.*;

public class Demo extends JFrame {

	private static final long serialVersionUID = 1L;
	// 让Demo类也成为一个窗体

	public Demo() {
		setVisible(true);// 设置窗体可见
		setTitle("窗体标题");// 设置窗体标题

		/*
		 * 窗体关闭规则: EXIT_ON_CLOSE:隐藏窗口,并停止程序 DO_NOTHING_ON_CLOSE:无任何操作
		 * HIDE_ON_CLOSE:隐藏窗体,但不停止程序 DISPOSE_ON_CLOSE:释放窗体资源
		 */
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		// setSize(300,200);//设置窗体大小(宽,高),单位:像素
		// setLocation(200, 200);//设置坐标(x,y),单位:像素
		setBounds(200, 200, 300, 200);// 设置窗体坐标和大小,单位:像素

		Container c = getContentPane();// 获取窗体容器
		c.setBackground(Color.WHITE);// 设置背景颜色
		JLabel l = new JLabel("test");
		c.add(l);// 添加组件
		// c. remove(l);//删陈组件
		c.validate();// 验证容器中的组件
		// f. setContentPane(c);//重新载入容器

		setResizable(false);// 设置窗体是否可以改变大小

		System.out.println("x=" + getX() + " y=" + getY());// 获取窗体位置
	}

	public static void main(String[] args) {
		new Demo();
	}
}

 

 


 

三、事件

0.监听

给一个按钮注册监听器,按下按钮后会打印“事件被监听到”。

package test;

import javax.swing.*;

/**
 * @author: happyaaakkk
 * @date : 2020年3月21日
 * @Description:测试按钮事件
 */
public class TestButton {

	public static void main(String[] args) {
		
		JFrame jf = new JFrame("测试事件");
		jf.setSize(600, 400);
		jf.setLocationRelativeTo(null);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JPanel panel = new JPanel();
		JButton btn = new JButton("点击按钮测试事件");
		//给按钮注册监听事件
		btn.addActionListener(new ButtonEvent());
		panel.add(btn);
		
		jf.setContentPane(panel);
		jf.setVisible(true);
		
	}
	
}


————————————————————————————————————————————————————————————————————————————————————————————————————————————

package test;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @author: happyaaakkk
 * @date : 2020年3月21日
 * @Description:按钮事件
 */
public class ButtonEvent implements ActionListener{
	
	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("事件被监听到");
	}

}

 

1.焦点事件

给文本框注册焦点监听,点击文本框得到焦点,点击按钮则文本框失去焦点

package test;

import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.*;

/**
 * @author: happyaaakkk
 * @date  : 2020年3月24日  
 * @Description:测试焦点事件
 */
public class TestFocus {
	public static void main(String[] args) {
		JFrame jf = new JFrame("焦点测试");
		jf.setSize(600,400);
		jf.setLocationRelativeTo(null);
		
		JPanel panel = new JPanel();
		JButton btn = new JButton("按钮");
		
		JTextField txt = new JTextField(10);
		txt.addFocusListener(new FocusListener() {
			
			@Override
			public void focusLost(FocusEvent e) {
				System.out.println("失去焦点");
			}
			
			@Override
			public void focusGained(FocusEvent e) {
				System.out.println("得到焦点");
			}
		});
		
		panel.add(btn);
		panel.add(txt);
		
		jf.setContentPane(panel);
		jf.setVisible(true);
	}
}

 

2.鼠标事件

点击鼠标画出方块,按下并拖动鼠标画线(画得快了会不连续),打印鼠标的动作和坐标。

package test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.*;

/**
 * @author: happyaaakkk
 * @date  : 2020年3月22日  
 * @Description:测试鼠标事件
 */
public class TestMouse {
	public static void main(String[] args) {
		JFrame jf = new JFrame("鼠标测试");
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setSize(600,400);
		jf.setLocationRelativeTo(null);
		//面板
		JPanel panel = new JPanel();
		//添加监听
		panel.addMouseListener(new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent e) {
				System.out.println("鼠标释放");
			}
			
			@Override
			public void mousePressed(MouseEvent e) {
				System.out.println("鼠标按下");
				//取得鼠标所在panel中的位置
				int x = e.getX();
				int y = e.getY();
				//从panel中获取画笔
				Graphics g = panel.getGraphics();
				//设置画笔颜色
				g.setColor(Color.BLACK);
				//进行绘画
				g.drawRect(x, y, 20, 20);//方块
				//g.drawLine(x, y, x, y);//线
			}
			
			@Override
			public void mouseExited(MouseEvent e) {
				System.out.println("鼠标退出");
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {
				System.out.println("鼠标进入");
			}
			
			@Override
			public void mouseClicked(MouseEvent e) {
				System.out.println("鼠标点击");
				//取得鼠标所在panel中的位置
				int x = e.getX();
				int y = e.getY();
				//从panel中获取画笔
				Graphics g = panel.getGraphics();
				//设置画笔颜色
				g.setColor(Color.BLACK);
				//进行绘画
				//g.drawRect(x, y, 20, 20);//方块
				g.drawLine(x, y, x, y);//线
			}
		});
		//鼠标移动和拖拽
		panel.addMouseMotionListener(new MouseMotionListener() {
			
			@Override
			public void mouseMoved(MouseEvent e) {
				System.out.println("鼠标移动"+e.getX()+" "+e.getY());
			}
			
			@Override
			public void mouseDragged(MouseEvent e) {
				System.out.println("鼠标拖拽"+e.getX()+" "+e.getY());
				Graphics g = panel.getGraphics();
				g.setColor(Color.RED);
				g.drawRect(e.getX(), e.getY(), 5, 5);//按鼠标画线
			}
		});
		//将面板添加到窗口
		jf.setContentPane(panel);
		
		jf.setVisible(true);
	}

}

(更新)解决画线不连续的问题:

package test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.*;

/**
 * @author: happyaaakkk
 * @date : 2020年4月9日
 * @Description:测试鼠标画线
 */
public class TestPencil {
	static int x = -1;
	static int y = -1;

	public static void main(String[] args) {
		JFrame jf = new JFrame("鼠标测试");
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setSize(600, 400);
		jf.setLocationRelativeTo(null);
		// 面板
		JPanel panel = new JPanel();
		// 添加监听
		panel.addMouseListener(new MouseListener() {

			@Override
			public void mouseReleased(MouseEvent e) {
				// System.out.println("鼠标释放");
			}

			@Override
			public void mousePressed(MouseEvent e) {
				// System.out.println("鼠标按下");
				x = e.getX();
				y = e.getY();
				Graphics g = panel.getGraphics();
				g.setColor(Color.RED);
				g.drawLine(x, y, e.getX(), e.getY());// 按鼠标画线
			}

			@Override
			public void mouseExited(MouseEvent e) {
				// System.out.println("鼠标退出");
			}

			@Override
			public void mouseEntered(MouseEvent e) {
				// System.out.println("鼠标进入");
			}

			@Override
			public void mouseClicked(MouseEvent e) {
				// System.out.println("鼠标点击");
			}
		});
		// 鼠标移动和拖拽
		panel.addMouseMotionListener(new MouseMotionListener() {

			@Override
			public void mouseMoved(MouseEvent e) {
				// System.out.println("鼠标移动"+e.getX()+" "+e.getY());
			}

			@Override
			public void mouseDragged(MouseEvent e) {
				// System.out.println("鼠标拖拽"+e.getX()+" "+e.getY());
				Graphics gs = panel.getGraphics();
				Graphics2D g = (Graphics2D) gs;
				g.setColor(Color.RED);
				// 通过该方法的设置,使图形去除锯齿状,可以得到细腻的图形。
				g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
				g.drawLine(x, y, e.getX(), e.getY());// 按鼠标画线
				x = e.getX();
				y = e.getY();
				// panel.repaint();

			}
		});
		// 将面板添加到窗口

		jf.setContentPane(panel);
		jf.setVisible(true);
	}

}

3.键盘事件

1.打印键盘敲击的键。

package test;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

/**
 * @author: happyaaakkk
 * @date  : 2020年3月23日  
 * @Description:测试键盘监听器
 */
public class TestKeyboard {
	
	public static void main(String[] args) {
		JFrame jf = new JFrame("键盘测试");
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setSize(600,400);
		jf.setLocationRelativeTo(null);
		
		jf.addKeyListener(new KeyListener() {
			
			@Override
			public void keyTyped(KeyEvent e) {
				System.out.println("键盘敲击了"+e.getKeyChar());
			}
			
			@Override
			public void keyReleased(KeyEvent e) {
				//System.out.println("键盘释放");
			}
			
			@Override
			public void keyPressed(KeyEvent e) {
				//System.out.println("键盘按下");
			}
		});
		
		jf.setVisible(true);
	}

	
}

 

2.插入一个小狮子图片并用WASD控制它的移动,用到了线程。

package test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * @author: happyaaakkk
 * @date : 2020年3月23日
 * @Description:插入图片并控制其移动
 */
public class TestImageControl {
	// 狮子初始位置
	static int x = 275;
	static int y = 175;
	// 定义四个变量用来存储是否按下了对应键
	static boolean w;
	static boolean a;
	static boolean s;
	static boolean d;

	public static void main(String[] args) {
		JFrame jf = new JFrame("图片和控制测试");
		jf.setResizable(false);// 不可改变大小(默认是true)
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setSize(600, 400);
		jf.setLocationRelativeTo(null);

		final Image image = new ImageIcon("image/lion.jpg").getImage();// 存图片地址

		// 面板
		JPanel panel = new JPanel() {// 重写绘制方法
			/**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			@Override
			protected void paintComponent(Graphics g) {
				// 设置面板颜色
				g.setColor(Color.BLACK);
				// 填充颜色
				g.fillRect(10, 10, 600, 400);// x、y、宽、高
				// 绘制狮子
				g.drawImage(image, x, y, 50, 50, null);// 地址、x、y、宽、高、缩放
				// 重复绘制面板内容
				this.repaint();
			}
		};
		// 键盘事件
		jf.addKeyListener(new KeyListener() {

			@Override
			public void keyTyped(KeyEvent e) {
			}

			@Override
			public void keyReleased(KeyEvent e) {// 按键释放
				if (e.getKeyCode() == KeyEvent.VK_W) {
					w = false;
				} else if (e.getKeyCode() == KeyEvent.VK_S) {
					s = false;
				} else if (e.getKeyCode() == KeyEvent.VK_A) {
					a = false;
				} else if (e.getKeyCode() == KeyEvent.VK_D) {
					d = false;
				}
			}

			@Override
			public void keyPressed(KeyEvent e) {// 按键按下
				if (e.getKeyCode() == KeyEvent.VK_W) {
					w = true;
					// y -= 10;//不推荐这种移动方式,下面的线程方式能使移动更加顺滑
				} else if (e.getKeyCode() == KeyEvent.VK_S) {
					s = true;
					// y += 10;
				} else if (e.getKeyCode() == KeyEvent.VK_A) {
					a = true;
					// x -= 10;
				} else if (e.getKeyCode() == KeyEvent.VK_D) {
					d = true;
					// x += 10;
				}
			}
		});

		// 启动线程 每隔10ms检查一次是按下还是释放
		// 这种方式的移动更加顺滑,时间间隔越短,移动距离相应越小,则越顺滑
		new Thread() {
			public void run() {
				while (true) {
					// 停一会
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					if (w)// 如果用 else if 则不能同时按下两个方向键,即不能斜着走
						y -= 2;
					if (s)
						y += 2;
					if (a)
						x -= 2;
					if (d)
						x += 2;
					System.out.println("x:" + x + "y:" + y);
				}
			}
		}.start();

		jf.setContentPane(panel);
		jf.setVisible(true);
	}

}

 

4.窗口事件

给退出窗口加一个确认提示。

package test;

import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.*;

/**
 * @author: happyaaakkk
 * @date : 2020年3月24日
 * @Description:测试窗体事件
 */
public class TestWindow implements WindowListener {

	@Override
	public void windowOpened(WindowEvent e) {
		System.out.println("windowOpened--->窗体被打开");
	}

	@Override
	public void windowClosing(WindowEvent e) {
		System.out.println("windowClosing--->窗体即将关闭");
		//确认是否退出
		int result=JOptionPane.showConfirmDialog(new JFrame(),"确认退出","提示",JOptionPane.YES_NO_OPTION);
		if(result==JOptionPane.YES_OPTION){
			System.exit(0);
		}
	}

	@Override
	public void windowClosed(WindowEvent e) {
		System.out.println("windowClosed--->窗体被关闭");
	}

	@Override
	public void windowIconified(WindowEvent e) {
		System.out.println("windowIconified--->窗体最小化");
	}

	@Override
	public void windowDeiconified(WindowEvent e) {
		System.out.println("windowDeiconfied--->窗体从最小化恢复");
	}

	@Override
	public void windowActivated(WindowEvent e) {
		System.out.println("windowActivated--->窗体获得焦点");
	}

	@Override
	public void windowDeactivated(WindowEvent e) {
		System.out.println("windowDeactivated--->窗体失去焦点");
	}

	public static void main(String[] args) {
		JFrame jf = new JFrame("窗体测试");
		jf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//什么都不做,交给事件处理
		jf.addWindowListener(new TestWindow());
		jf.setSize(600, 400);
		jf.setLocationRelativeTo(null);
		jf.setVisible(true);
	}
}

 

 

附加、Graphics类的常用图形绘制方法

画笔属性 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱吃狮子头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值