Java-swing笔记
- Java图形界面对对开发(Java GUI)
①AWT、②Swing、③Java FX、④SWT、⑤Android、⑥Harmony OS
- 第一个窗口
①JFrame→窗口类(Java.Swing.JFrame)
②JFrame构造方法的参数是窗口标题
③setSize()设置窗口大小
④setvisible(true)显示窗囗
⑤setTitle()设窗口标题
代码1
运行结果1
- 容器与控件
①JPanel→表示一个容器,也称为面板
JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,可以进行嵌套,功能是对窗体中具有相同逻辑功能的组件进行组合。
②JButton→表示一个按钮控件
③frame.setContentpane(root)设置为根容器
代码 2
运行结果 2
- JLabel控件
①JLable→标签控件,用于显示文本
Ps:可以用匿名类的方式实现;
代码 3
运行结果3
总结:步骤:建立窗口→添加容器→容器里添加控件;
- 自定义窗口
①自定义一个窗口类(继承JFrame类)
用来负责窗口界面的构造、以及相关的逻辑
例如:
Public class MyFrame extends JFrame{
}
代码4
运行结果4
- 多态
①由于继承的关系一般不直接
MyFrame frame =new MyFrame(“title”);
一般使用
JFrame frame =new MyFrame(“title”);
因为子类的实例拥有父类的全部特征;
实质上还是MyFrame类;
- 事件处理
①需要设置监听器
②将监听器传递给按钮
③ActionListener是一个java.awt.event内定义的接口
④ActionListener接口是不能实例化的,需要写一个子类MyActionListener
⑤class MyActionListener implements ActionListener{}
⑥实例化一个MyActionListener传递给button
⑦button.addActionListener(listener);
代码 5
点击按钮结果5
- 简写
①多态的使用
例如:
MyActionListener listener=new MyActionListener();
改成:
ActionListener listener=new MyActionListener();
②匿名类
button.addActionListener(new MyActionListener());
- 实现显示当前时间
①先实现将时间打印出来
代码 6
点击按钮结果6
②利用JLabel显示时间
代码 7
点击按钮结果7
- 匿名内部类
①例如
button.addActionListener(listener);
private class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
timelabel.setText(new SimpleDateFormat("HH:mm;ss").format(new Date()));
}
}
改写成:
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
timelabel.setText(new SimpleDateFormat("HH:mm;ss").format(new Date()));
}
});
}
- Lambda表达式
①格式e->{方法体;}
②本身还是一个内部匿名类,
代码 8
- 文本框JTextField
①JTextField单行文本框
JTextField TextField= new JTextField(20);
Ps:20代表20个英文字符的长度。
代码 9
运行结果9
②获取单文本框内容并用JLabel显示文本
代码 10
获取文本前 运行结果10 获取文本后
- 复选框JCheckBox
①相关API
setSelected(true/false)设置选中状态
isSelected()是否选中
addActionListener()勾选或取消获取事件
②实现复选框来控制按钮的状态
代码 11
Ps;setEnabled();设置按钮是否可以被点击
勾选前 运行结果11 勾选后
- 下拉列表JComboBox
①JComboBox是一个泛型需要指明数据项的参数类型
例如:
JComboBox<String> something = new JComboBox<>();
//数据项的类型是String
②相关API
getSelectedIndex();→获取选中了哪一项
addItem();→添加数据项
getSelectedItem();→按数据项访问
③利用JLabel显示选中的数据项
代码 12
选择前 运行结果12 选择后
- 标签控件JLabel相关API补充
①setFont()→字体的设置
setFont(new Font(“字体名称”,Font.字体粗细,字体大小);
例如:setFont(new Font(“仿宋”,Font.PLAIN,14);
Ps:细PLAIN;粗BOLD。
②setForegroud→设置文字颜色
例如:
setForegroudt(new Color(255,255,255));
③setBackground()→设置背景色
首先将背景设置为不透明
setOpaque(true);
设置颜色
setBackground(new Color(255,255,255));
·Ps:具体颜色查找RGB颜色表
④setPreferredSize()→设置控件的大小
Dimension是宽度和高度
例如:
setPreferredSize(new Dimension(60,30));
⑤setHorizontalAlignment()→文本的对齐
例如:
setHorizontalAlignment(SwingCostants.CENTER);
⑥综合实例
代码 13
运行结果13
补充:在定义JLabel数组时候遇到一个问题:
JLabel[] label=new JLabel[10];
在循环将label[i]加入容器时候发生错误
原因:没有将数组的元素实例化,应该添加一条语句在前面:l
abel[i]=new JLabel(“title”);
- 布局器LayouManager
①容器自带的布局管理器
例如:
Root.setLayout();
FlowLayout流式布局→默认布局
②BorderLayout边界布局器
分为上下左右中→NORTH、SOUTH、WEST、EAST、CENTER
上下宽占满、左右高占满;
尺寸调节:setPreferredSize(new Dimension(宽,高));
③手工布局器
㈠设置布局器为空
root.setLayout(null);
㈡利用控件自带的定位功能
控件.setBounds(向右,向下,宽度,高度)
④自定义布局器
㈠实现LayoutManager2接口
定义一个类来实现
- 自定义布局器
①需要实现的方法
public void addLayoutComponent(Component comp, Object constraints)
public void removeLayoutComponent(Component comp)
public void layoutContainer(Container parent)
②JPanel是属于Container的,所以Container也是容器
所有的控件都属于Component
③Container的相关方法
Container parent//容器
parent.getWidth();→获取宽度
parent.getHeight();→获取高度
Component[] children = parent.getComponent();→获取子控件
待补充代码
- 利用建立抽象类LayoutAdapter来简化LayoutManager2接口
①写一个
public abstract class LayoutAdpter implements LayoutManager2
抽象类LayoutAdpter实现LayoutManager2
②再继承抽象类LayoutAdpter来实例化方法
- 布局管理
①LayoutManager2布局管理器
public void addLayoutComponent(Component comp, Object constraints)
//加入控件
public void removeLayoutComponent(Component comp)//删除控件
public void layoutContainer(Container parent)//布局控件
②用List<Component>来管理控件
List<Component> list = new ArrayList<>();
③利用内部类来定制私有布局器
- 自定义控件
①JPanel即使容器也是控件
代码 14
运行结果 14
- 图片的绘制
①g.drawImage();→容器中绘制图片
格式:
g.drawImage(image,x,y,width,height,null);
image→图像对象
x,y,width,height→坐标和大小
observer→null
代码 15
运行结果 15
②步骤
㈠准备图片并且在项目里建立一个放图片的目录
㈡File建立一个图片实例
File file =new File("data/桔梗.jpg");
㈢加载图片(消耗CPU)
BufferedImage image=ImageIO.read(file);
㈣绘制图片
g.drawImage(image,0,0,width,height,null);
㈤用try/catch来捕获异常,防止图片更改;
try {
File file =new File("data/桔梗.jpg");
BufferedImage image=ImageIO.read(file);
g.drawImage(image,0,0,width,height,null);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
- 加载图片
①代码优化
每次调节窗口的时候都要调用paintComponent()所以要将加载图片的操作放在构造方法里面
代码 16
②保持长宽比
㈠首先令窗口的长度或者宽度为图片的长度或宽度
㈡利用图片长宽比求出宽度或者长度
㈢如果图片的宽度或者长度更改后大于窗口的宽度或长度则令窗口的宽度或者长度为图片的宽度或长度
㈣设定图片起始坐标,用图片宽度和长度减去算出来的宽度和长度的二分之一即是坐标
代码 17
运行结果 17
- 图标
图标一般都是PNG的格式,显示与图片显示一样
- 资源文件
①放在src文件夹里新建一个文件夹
读取资源,MyFrame↓
InputStream res=this.getClass().getResourceAsStream(“目录”)
加载资源为图片,
Image image=ImagelO.read(res)
- 鼠标事件
①三类监听器
addMouseListener()→点击、按下、抬起、移入、移出
addMouseMotionListener()→移动、拖动
addMouseWheelListener()→鼠标滚轮转动
②鼠标动作
鼠标点击 mouseClicked
鼠标按下mousePressed鼠标抬起mouseReleased
鼠标移入mouseEntered鼠标移出mouseExited
鼠标移动mouseMoved 鼠标拖动mouseDragged
鼠标滚轮mouseWheelMoved
③所有的控件都支持鼠标事件处理
④设置控件的鼠标点击事件
代码 18
点击控件效果 18
⑤鼠标事件
- getPoint()/getX()/getY():点击的坐标,相对于该控件
- getPointOnScreen()/getXOnScreen()/getYOnScreen():屏幕坐标
- getSource():事件源,即点中的控件
- getButton():左键、中键、右键
Ps:BUTTON1、2、3代表左、中、右键;
- getClickCount():单击、双击、三击
⑥MouseAdapter简化MouseListener
⑦鼠标点击事件
-mousePressed()鼠标按下
-mouseReleased()鼠标抬起
-mouseClicked()鼠标点击
其中,mouseClicked()是指鼠标按下,并且原地抬起
⑧鼠标移入移出
mouseEntered();
mouoseExited();
⑨鼠标移动事件MouseMotionListener接口
-mouseMoved()鼠标移动
-mouseDragged()鼠标按住并移动
- 添加边框
①Border border = new LineBorder(Color.BLUE,4);
//选择颜色、占多少像素点;
a1.setBorder(border);
其中Border是接口,LinBorder是具体的实现类
②Border border = BorderFactory.createLineBorder(Color.BLUE,4);
a2.setBorder(border2);
③所有的JComponent都支持Border
④边框样式
createLineBorder()→线性边框
CreateRaisedBevelBorder()→3D立体边框
- 对话框JOptionPane
①JOptionPane.showMessageDialog();消息提示框
代码 19
运行效果 19
②JOptionPane.showConfirmDialog():确认提示框
代码 20
运行效果 20
③JOptionPane.showlnputDialog();输入提示框
代码 21
运行效果 21
- 文件选择框JFileChooser
①showOpenDialog打开一个文件
㈠文件名后缀过滤器
FileNameExtensionFilter filter = new FileNameExtensionFilter("图片","jpg");
chooser.setFileFilter(filter);
㈡显示对话框
int ret =chooser.showOpenDialog(this);
㈢判断用户是否确认了操作
ret==JFileChooser.APPROVE_OPTION
代码 22
运行 22
②showSaveDialog保存一个文件、
将上述代码的showOpenDialog改成showSaveDialog即可
运行 23
③showOpenDialog/DIRECTORIES_ONLY选择一个文件目录
- 右键菜单JPopupMnu
①响应鼠标的右键
②弹出菜单
-创建菜单JPopupMenu
-添加菜单项JMenuItem
-弹出菜单窗口popup.show()
代码 24
运行 24
③右键菜单处理事件
item.addActionListener(listener)添加监听器
item.addActionCommand()添加命令码
- 列表框JList
①创建列表框
JList<T> listbox = new JList<>();
②滚动支持
JScrollPane scrollPane = new JScrollPane(listbox);
③添加到主界面
root.add(scrollPane,BorderLayout.CENTER);
④设置列表数据
DefaultListModel<String> model = new DefaultListModel<>();
Model.addElement(“数据”);
⑤设置数据
Listbox.setModel(model);
⑥单选模式
Listbox.setSelectionMode(ListSelectModel.SINGLE_SELECTION);
⑦getSelectedIndex()记录的索引
未选中返回值为-1;>0为有效选项;
getSelectedValue()记录的数据项
⑧单选模式的列表项的操作
㈠增加一项
model.addElement(value)
model.add(index,value)
㈡删除一项
index = listbox.getSelectedIndex();//未选中返回-1
Value = listbox.getSelectedValue();
model.remove(index);
⑨多选模式
ListSelectionModeMULTIPLE_INTERVAL_SELECTION
按CTRL间隔多选,按SHIFT连续多选
⑩鼠标左键处理
相关 API :
listbox.clearSelection()清空选项
listbox.setSelectedIndex(index)选择一项
listbox.addSelectionInterval(from.to)添加选择(多选模式)
index = listbox.locationTolndex(point)计算点中的位置是哪一项
bounds= listbox.getCellBounds(index, index)计算某一项的位置矩形