AWT:抽象窗口工具集。
程序仅指定了界面组件的位置和行为,并未提供真正的实现。把组件的创建和动作委托给程序所运行的平台。
Component:一个能以图形方式显示出来并且可以与用户交互的对象。比如按钮Button和文本框TextField
Container是一种特殊的Component,可以装普通的Component,用add操作。
Container特有的常用API如下:
Window是可以独立存在的顶级窗口,默认使用BorderLayout边界布局
Panel可以嵌入其他组件,默认使用FlowLayout流式布局
ScrollPane是一个带滚动条的容器,和Window一样使用BorderLayout边界布局
Frame类用于创建一个具有标题栏的框架窗口作为程序的主要界面,它不依赖其他容器可以单独存在。运行后可以看到一个弹窗
public static void main(String[] args) {
//frame窗口
Frame frame = new Frame("java图形化界面窗口");
//设置可见性 与 窗口大小
frame.setVisible(true);
frame.setSize(400,400);
//设置背景颜色
frame.setBackground(new Color(145, 36, 44));
//设置弹出的初始位置 0,0 在左上角
frame.setLocation(0,0);
//设置窗口是否可拉伸
frame.setResizable(false);
}
特性:面板不能单独存在,必须在容器里面,可以看成一个空间。在程序中通常会使面板来实现一些特殊的布局。
public static void main(String[] args) {
//frame窗口
Frame frame = new Frame("java图形化界面窗口");
//设置可见性 与 窗口大小
frame.setVisible(true);
frame.setSize(400,400);
//设置背景颜色
frame.setBackground(new Color(145, 36, 44));
//设置弹出的初始位置 0,0 在左上角
frame.setLocation(0,0);
//设置窗口是否可拉伸
frame.setResizable(false);
//设置布局
frame.setLayout(null);
//pannel面板
Panel panel = new Panel();
panel.setBounds(0,0,100,400);
panel.setBackground(new Color(83, 169, 56));
frame.add(panel);
}
public static void main(String[] args) {
//frame窗口
Frame frame = new Frame("java图形化界面窗口");
//scrollPane滚动条容器
ScrollPane scrollPane = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
scrollPane.add(new Button("button"));
scrollPane.add(new TextField("textField"));
//设置可见性 与 窗口大小
frame.setVisible(true);
frame.setSize(400, 400);
//设置弹出的初始位置 0,0 在左上角
frame.setLocation(0, 0);
frame.add(scrollPane);
}
布局管理器可以根据操作系统来自动的调整组件大小,不用再手动设置组件的大小和位置。只需要选择合适的布局管理器就好
按水平方向依次排列放置组件,排满一行,换下一行继续排列。
排列方向(左到右 或 右到左)取决于容器的componentOrientation属性(该属性属于Component),它可能的值如下:
public static void main(String[] args) {
//frame窗口
Frame frame = new Frame("java图形化界面窗口");
//设置可见性 与 窗口大小
frame.setVisible(true);
frame.setBounds(0,0,400,400);
//文本框组件
TextField num1 = new TextField();
TextField num2 = new TextField();
TextField num3 = new TextField();
//一个按钮
Button button = new Button("=");
//一个标签
Label label = new Label("+");
FlowLayout flowLayout = new FlowLayout();
//设置流式布局
frame.setLayout(flowLayout);
frame.add(num1);
frame.add(label);
frame.add(num2);
frame.add(button);
frame.add(num3);
//设置最佳大小
frame.pack();
}
1.向BorderLayout的容器中添加组件时,需要指定添加到哪个区域,如果没有指定添加到哪个区域,则默认添加到center区域。
2.如果向同一个区域添加多个组件,则后放入的组件会覆盖先放入的
如果出现中文乱码:则VM options需要设置: -Dfile.encoding=gbk
frame是Window窗口,默认布局就是 BorderLayout
public static void main(String[] args) {
//frame窗口
Frame frame = new Frame("java图形化界面窗口");
//设置可见性 与 窗口大小
frame.setVisible(true);
frame.setSize(400,400);
//设置弹出的初始位置 0,0 在左上角
frame.setLocation(0,0);
//按钮组件
Button east = new Button("east");
Button west = new Button("west");
Button south = new Button("south");
Button north = new Button("north");
Button center = new Button("center");
//设置边界布局
frame.setLayout(new BorderLayout());
frame.add(east,BorderLayout.EAST);
frame.add(west,BorderLayout.WEST);
frame.add(south,BorderLayout.SOUTH);
frame.add(north,BorderLayout.NORTH);
frame.add(center,BorderLayout.CENTER);
//设置最佳大小
frame.pack();
}
如果西侧按钮和东侧按钮我不放,则不会留白,而是会被中间区域占有。如下:
以矩形网格形式对容器的组件进行布置,把容器按行列分成大小相等的矩形网格,一个网格中放置一个组件,组件宽高自动撑满网格。默认是从左往右、从上往下添加到网格中
public static void main(String[] args) {
//frame窗口
Frame frame = new Frame("java图形化界面窗口");
//设置可见性 与 窗口大小
frame.setVisible(true);
frame.setSize(400,400);
//设置背景颜色
frame.setBackground(new Color(145, 36, 44));
//设置弹出的初始位置 0,0 在左上角
frame.setLocation(0,0);
//设置窗口是否可拉伸
frame.setResizable(false);
//按钮组件
Button button1 = new Button("button1");
Button button2 = new Button("button2");
Button button3 = new Button("button3");
Button button4 = new Button("button4");
Button button5 = new Button("button5");
Button button6 = new Button("button6");
//设置表格3行2列
GridLayout gridLayout = new GridLayout(3, 2);
//设置布局
frame.setLayout(gridLayout);
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.add(button4);
frame.add(button5);
frame.add(button6);
}
//监听窗口关闭事件
frame.addWindowListener(new WindowAdapter() {
//适配器模式
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
public static void main(String[] args) {
//frame窗口
Frame frame = new Frame("java图形化界面窗口");
//设置可见性 与 窗口大小
frame.setVisible(true);
frame.setSize(400,400);
//设置背景颜色
frame.setBackground(new Color(145, 36, 44));
//设置弹出的初始位置 0,0 在左上角
frame.setLocation(0,0);
//设置窗口是否可拉伸
frame.setResizable(false);
//按钮组件
Button button1 = new Button("button1");
//显示设置按钮上的信息
button1.setActionCommand("button1-11");
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("eee");
System.out.println(e.getActionCommand());
}
});
frame.add(button1,BorderLayout.CENTER);
}
点击按钮后,控制台打印。setActionCommand是为了在多个按钮的监听写在一个监听器,用if判断
public static void main(String[] args) {
//frame窗口
Frame frame = new Frame("java图形化界面窗口");
//设置可见性 与 窗口大小
frame.setVisible(true);
frame.setSize(400,400);
//设置背景颜色
frame.setBackground(new Color(145, 36, 44));
//设置弹出的初始位置 0,0 在左上角
frame.setLocation(0,0);
//设置窗口是否可拉伸
frame.setResizable(false);
//文本框组件
TextField textField = new TextField();
//按下回车键,会触发这个监听
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获取资源
TextField field = (TextField) e.getSource();
//打印文本框内容
System.out.println(field.getText());
}
});
frame.add(textField,BorderLayout.CENTER);
}
监听鼠标按压、鼠标释放、鼠标点击
public static void main(String[] args) {
//frame窗口
Frame frame = new Frame("java图形化界面窗口");
//设置可见性 与 窗口大小
frame.setVisible(true);
frame.setBounds(0,0,400,400);
frame.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("鼠标进入组件区域");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("鼠标离开组件区域");
}
@Override
public void mousePressed(MouseEvent e) {
// 获取按下的坐标(相对于组件)
System.out.println("相对组件" + e.getPoint() + ",横坐标:" + e.getX() + ", 纵坐标:" + e.getY());
// 获取按下的坐标(相对于屏幕)
System.out.println("相对屏幕" + e.getLocationOnScreen() + ",横坐标:" + e.getXOnScreen() + ", 纵坐标:" + e.getYOnScreen());
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("鼠标释放");
}
@Override
public void mouseClicked(MouseEvent e) {
// 鼠标在组件区域内按下并释放(中间没有移动光标)才识别为被点击
System.out.println("鼠标点击");
}
});
}
鼠标拖动、鼠标移动、鼠标滚轮滚动
public static void main(String[] args) {
//frame窗口
Frame frame = new Frame("java图形化界面窗口");
//设置可见性 与 窗口大小
frame.setVisible(true);
frame.setBounds(0,0,400,400);
/**
* 鼠标移动/拖动监听器
*/
frame.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
// 鼠标保持按下状态移动即为拖动
System.out.println("鼠标拖动");
}
@Override
public void mouseMoved(MouseEvent e) {
System.out.println("鼠标移动");
}
});
/**
* 鼠标滚轮监听器
*/
frame.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
// e.getWheelRotation() 为滚轮滚动多少的度量
System.out.println("mouseWheelMoved: " + e.getWheelRotation());
}
});
}
上下左右键和空格键:KeyEvent.VK_UP
public static final int VK_LEFT = 0x25;
public static final int VK_UP = 0x26;
public static final int VK_RIGHT = 0x27;
public static final int VK_DOWN = 0x28;
public static final int VK_SPACE = 0x20;
public static void main(String[] args) {
//frame窗口
Frame frame = new Frame("java图形化界面窗口");
//设置可见性 与 窗口大小
frame.setVisible(true);
frame.setBounds(0,0,400,400);
/**
* 键盘监听事件
*/
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
// 获取键值,和 KeyEvent.VK_XXXX 常量比较确定所按下的按键
System.out.println("按下: " + e.getKeyChar() + ",键值为:" + e.getKeyCode());
}
@Override
public void keyTyped(KeyEvent e) {
// e.getKeyChar() 获取键入的字符
System.out.println("键入: " + e.getKeyChar());
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("释放: " + e.getKeyCode());
}
});
}
public static void main(String[] args) {
//frame窗口
Frame frame = new Frame("java图形化界面窗口");
//设置可见性 与 窗口大小
frame.setVisible(true);
frame.setBounds(0, 0, 400, 400);
/**
* 窗口监听事件
*/
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("窗口被关闭了");
System.exit(0);
}
@Override
public void windowActivated(WindowEvent e) {
System.out.println("窗口被激活了");
}
});
}
public class MyPaint extends Frame {
public void loadFrame(){
setBounds(0,0,600,400);
setVisible(true);
}
@Override
public void paint(Graphics g) {
//设置画笔的颜色
g.setColor(Color.RED);
//设置画一个圆圈
g.drawOval(50,100,50,50);
//画实心圆
g.fillOval(100,100,50,50);
//重新设置画笔的颜色
g.setColor(Color.GREEN);
//画实心矩形
g.fillRect(150,100,100,50);
}
}
在别的类中,启动
public static void main(String[] args) {
new MyPaint().loadFrame();
}
Swing是纯java实现的(100%),不再调用本地平台的GUI,可以在所有操作系统上都保持相同的界面外观,相较于awt被称为“轻量级组件”。
Swing组件采用MVC,模型-视图-控制器
大部分情况下,在awt组件的名称前面加J,就变成Swing组件。但是有几个特殊情况:
Swing组件相较于AWT组件,额外增了以下功能:
每一个Swing组件都有一个对应的UI代理类,UI代理类通常是一个抽象基类,不同的PLAF会有不同的UI代理实现类实现不同外观绘制。
public abstract class ButtonUI extends ComponentUI {
}
以JButtton为例,其UI代理类如下:
public class SwingDemo {
JFrame jf = new JFrame("jframe 窗口测试");
//声明菜单相关组件
JMenuBar jMenuBar = new JMenuBar();
JMenu fileMenu = new JMenu("文件");
JMenu editMenu = new JMenu("编辑");
JMenuItem auto = new JMenuItem("自动换行");
JMenuItem copy = new JMenuItem("复制");
JMenuItem paste = new JMenuItem("粘贴");
JMenu formatMenu = new JMenu("格式");
JMenuItem comment = new JMenuItem("注释");
JMenuItem cacleComment = new JMenuItem("取消注释");
//声明文本域
JTextArea jTextArea = new JTextArea(8, 20);
//声明选择框
//下拉列表框
JComboBox colorSelect = new JComboBox<>();
//单选框需要按钮组
ButtonGroup buttonGroup = new ButtonGroup();
JRadioButton male = new JRadioButton("男", false);
JRadioButton female = new JRadioButton("女", true);
//复选框
JCheckBox isSingle = new JCheckBox("是否单身", true);
//声明底部
JTextField tf = new JTextField(40);
JButton ok = new JButton("确定");
public static void main(String[] args) {
new SwingDemo().init();
}
//初始化界面
public void init() {
//组装底部
JPanel bottomJPanel = new JPanel();
bottomJPanel.add(tf);
bottomJPanel.add(ok);
jf.add(bottomJPanel, BorderLayout.SOUTH);
//组装选择组件
JPanel selectJPanel = new JPanel();
colorSelect.addItem("绿色");
colorSelect.addItem("红色");
colorSelect.addItem("黄色");
selectJPanel.add(colorSelect);
buttonGroup.add(male);
buttonGroup.add(female);
selectJPanel.add(male);
selectJPanel.add(female);
selectJPanel.add(isSingle);
//组装文本域和选择相关组件
Box top = Box.createVerticalBox();
top.add(jTextArea);
top.add(selectJPanel);
jf.add(top);//默认放centre区域
//组装菜单相关
formatMenu.add(comment);
formatMenu.add(cacleComment);
editMenu.add(auto);
editMenu.addSeparator();//添加横杠
editMenu.add(copy);
editMenu.add(paste);
editMenu.addSeparator();//添加横杠
editMenu.add(formatMenu);
jMenuBar.add(fileMenu);
jMenuBar.add(editMenu);
//窗口菜单显示
jf.setJMenuBar(jMenuBar);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小与可见
jf.pack();
jf.setVisible(true);
}
}
效果如下:
jToolBar基本使用
public class SwingDemo {
JFrame jf = new JFrame("jframe 工具条测试");
JTextArea jTextArea = new JTextArea(6, 30);
//声明工具条相关组件
JToolBar jToolBar = new JToolBar("播放工具条", SwingConstants.HORIZONTAL);
AbstractAction pre = new AbstractAction("上一曲") {
@Override
public void actionPerformed(ActionEvent e) {
//工具条按钮点击后的行为
jTextArea.append("上一曲\n");
}
};
AbstractAction pause = new AbstractAction("暂停播放") {
@Override
public void actionPerformed(ActionEvent e) {
//工具条按钮点击后的行为
jTextArea.append("暂停播放\n");
}
};
AbstractAction next = new AbstractAction("下一曲") {
@Override
public void actionPerformed(ActionEvent e) {
//工具条按钮点击后的行为
jTextArea.append("下一曲\n");
}
};
public static void main(String[] args) {
new SwingDemo().init();
}
//初始化界面(组装视图)
public void init() {
jToolBar.add(pre);
jToolBar.addSeparator();
jToolBar.add(pause);
jToolBar.addSeparator();
jToolBar.add(next);
//设置工具条可以拖动
jToolBar.setFloatable(true);
jf.add(jToolBar, BorderLayout.NORTH);
jf.add(jTextArea);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小与可见
jf.pack();
jf.setVisible(true);
}
}
把一个组件设置在JScrollPane,就可以支持滚动条了。
JColorChooser用于创建颜色选择器对话框,showDialog是一个静态方法。用法如下:
component:指定当前对话框的父组件
title:对话框名称
initialColor:默认选中的颜色
返回值是用户选中的颜色
public static Color showDialog(Component component,
String title, Color initialColor) throws HeadlessException {
}
案例测试
public class SwingDemo {
JFrame jf = new JFrame("jframe 颜色选择器测试");
JTextArea jTextArea = new JTextArea("我行我素,大大咧咧",6,30);
JButton jButton = new JButton(new AbstractAction("选择背景颜色") {
@Override
public void actionPerformed(ActionEvent e) {
//弹出颜色选择器
Color result = JColorChooser.showDialog(jf, "颜色选择器", Color.white);
//修改文本框背景颜色
jTextArea.setBackground(result);
}
});
public static void main(String[] args) {
new SwingDemo().init();
}
//初始化界面(组装视图)
public void init() {
jf.add(jTextArea);
jf.add(jButton,BorderLayout.SOUTH);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小与可见
jf.pack();
jf.setVisible(true);
}
}
JFileChooser用于生成“打开文件”、“保存文件”对话框
public class SwingDemo {
JFrame jf = new JFrame("jframe 文件选择器测试");
JMenuBar jMenuBar = new JMenuBar();
JMenu jMenu = new JMenu("文件");
JMenuItem open = new JMenuItem(new AbstractAction("打开") {
@Override
public void actionPerformed(ActionEvent e) {
//显示文件选择器,传入默认打开路径为当前项目路径
JFileChooser jFileChooser= new JFileChooser(".");
jFileChooser.showOpenDialog(jf);
//获取用户选择的文件
File file = jFileChooser.getSelectedFile();
try {
//读取图片,重绘画布
image = ImageIO.read(file);
myCanvas.repaint();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
JMenuItem save = new JMenuItem(new AbstractAction("另存为") {
@Override
public void actionPerformed(ActionEvent e) {
//显示文件选择器,传入默认打开路径为当前项目路径
JFileChooser jFileChooser= new JFileChooser(".");
jFileChooser.showSaveDialog(jf);
//获取用户选择的保存文件路径
File file = jFileChooser.getSelectedFile();
try {
ImageIO.write(image,"jpg",file);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
public static void main(String[] args) {
new SwingDemo().init();
}
private class MyCanvas extends Panel{
@Override
public void paint(Graphics g) {
//把图片绘制到组件上
g.drawImage(image,0,0,null);
}
}
BufferedImage image;
MyCanvas myCanvas= new MyCanvas();
//初始化界面(组装视图)
public void init() {
jMenu.add(open);
jMenu.add(save);
jMenuBar.add(jMenu);
//菜单条设置给窗口
jf.setJMenuBar(jMenuBar);
//放入绘图区
myCanvas.setPreferredSize(new Dimension(740,500));
jf.add(myCanvas);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小与可见
jf.pack();
jf.setVisible(true);
}
}
JOptionPane可以创建一些简单的对话框。。如下:
消息对话框
确认对话框
输入对话框
可以将一个容器分割成上下或者左右俩个部分。
JSplitPane使用步骤:
1
JTablePane使用步骤
JProgressBar使用步骤
JProgressMonitor使用如下:
树本质上是一个一个节点(父节点、子节点)组成的。
public class SwingDemo {
JFrame jf = new JFrame("jframe JTree测试");
public static void main(String[] args) {
new SwingDemo().init();
}
//初始化界面(组装视图)
public void init() {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("中国");
DefaultMutableTreeNode shanxi = new DefaultMutableTreeNode("陕西");
DefaultMutableTreeNode liaoning = new DefaultMutableTreeNode("辽宁");
DefaultMutableTreeNode xian = new DefaultMutableTreeNode("西安");
DefaultMutableTreeNode yulin = new DefaultMutableTreeNode("榆林");
DefaultMutableTreeNode shenyang = new DefaultMutableTreeNode("沈阳");
DefaultMutableTreeNode dalian = new DefaultMutableTreeNode("大连");
//组装节点关系
root.add(shanxi);
root.add(liaoning);
shanxi.add(xian);
shanxi.add(yulin);
liaoning.add(shenyang);
liaoning.add(dalian);
//根据根节点创建JTree对象
JTree jTree=new JTree(root);
jf.add(jTree);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小与可见
jf.pack();
jf.setVisible(true);
}
}
其他重要方法
编辑树节点
监听树节点事件
改变树节点外观
public class SwingDemo {
JFrame jf = new JFrame("jframe JTable测试");
Object[] titles={"姓名","年龄","性别"};
Object[][] data={
{"张三","21","男"},
{"李四","22","女"},
{"王五","23","男"}
};
public static void main(String[] args) {
new SwingDemo().init();
}
//初始化界面(组装视图)
public void init() {
JTable jTable = new JTable(data, titles);
jf.add(new JScrollPane(jTable));
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小与可见
jf.pack();
jf.setVisible(true);
}
}
表格调整
自定义TableModel
DefaultTableModel
DefaultTableModel defaultTableModel=new DefaultTableModel(data,titles);
JTable jTable = new JTable(defaultTableModel);
DefaultTableModel提供如下方法控制数据行操作