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