(一)Frame
软件的交互方式:
1.dos命令的交互方式。
2.图形化界面的交互方式。
在Java图形化界面编程中把所有的图形类都称为组件类。
所有图形组件都位于:java.awt 和javax.swing包
在awt包中存在的图形类,在swing中一样会存在,区别在于swing的图形都是以J开头。
java.awt包的图形类与javax.swing包的图形类的区别:
1.java.awt包中的所有图形类的图形都是依赖系统的图形库。java.swing包中的所有图形类的图形都是sun自己实现的。
所有图形类都称为组件:
容器组件:
非容器组件:
public static void main(String[] args) {
//创建一个窗体软件,初始是不可见的
JFrame frame=new JFrame("这是我第一个窗体软件");
//设置窗体大小,以像素为单位
//frame.setSize(300,400);
//设置窗体左上角出现的位置
//frame.setBounds(533, 134, 300, 400);//出现在屏幕中间,根据分辨率得出
//将设置位置等操作写成一个工具类
FrameUtil.initFrame(frame, 500, 400);
//设置窗体的可见性
frame.setVisible(true);
//设置窗体的关闭事件
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出并关闭(否则只关闭窗体,不退出程序)
}
//自己实现的图形化界面的工具类
public class FrameUtil {
//设置窗体出现在中间位置
public static void initFrame(JFrame frame,int width,int height) {
//获取默认的系统工具包
Toolkit toolkit=Toolkit.getDefaultToolkit();
//获取屏幕分辨率
Dimension d=toolkit.getScreenSize();
int x=(int)d.getWidth();//返回double类型
int y=(int)d.getHeight();
frame.setBounds((x-width)/2, (y-height)/2, width, height);
//设置窗体的可见性
frame.setVisible(true);
//设置窗体的关闭事件
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
(二)Dialog
Dialog(对话框):
Dialog(Dialog owner,String title,boolean modal)
owner 所有者
title 对话框标题
modal 模式 true:对话框没有关闭时不准操作所有者。 false:对话框即使没有关闭也可以操作所有者。
JOptionPane(对话框):
//消息、警告、错误
showMessageDialog(Component parentComponent,Object message,String title,int messageType)
patentComponent 所有者
message 消息
title 对话框的标题
messageType 指定对话框的类型(消息、警告、错误)
public static void main(String[] args) {
//创建一个窗体
JFrame frame=new JFrame("窗体");
/*
JDialog dialog=new JDialog(frame,"对话框",true);
FrameUtil.initFrame(frame, 500, 400);//433 143
dialog.setBounds(580, 250, 250, 250);
dialog.setVisible(true);
*/
FrameUtil.initFrame(frame, 500, 400);
//消息对话框
//JOptionPane.showMessageDialog(frame, "明天第26天","通知",JOptionPane.INFORMATION_MESSAGE);
//警告对话框
//JOptionPane.showMessageDialog(frame,"疫情防控!!!","警告",JOptionPane.WARNING_MESSAGE);
//错误对话框
//JOptionPane.showMessageDialog(frame,"发脾气就不爱你了哦~~","错误",JOptionPane.ERROR_MESSAGE);
/*
//确认对话框
int num=JOptionPane.showConfirmDialog(frame, "继续戴口罩么?");
System.out.println(num);//是 0 否 1 取消 2
*/
//输入对话框
String money=JOptionPane.showInputDialog(frame, "请输入要取出的金额:");
System.out.println("money:"+money);
}
(三)FileDialog
FileDialog(文件对话框)
FileDialog(Dialog parent,String title,int mode)
parent 所有者
title 标题
mode FileDialog.LOAD(加载) 或 FileDialog.SAVE(保存)
public static void main(String[] args) {
JFrame frame=new JFrame();
FileDialog dialog=new FileDialog(frame,"请打开文件",FileDialog.LOAD);
//设置显示dialog
dialog.setVisible(true);
FrameUtil.initFrame(frame, 500, 400);
System.out.println("打开文件的路径:"+dialog.getDirectory());
System.out.println("打开的文件名:"+dialog.getFile());
}
(四)非容器类组件
public static void main(String[] args) {
JFrame frame=new JFrame("注册");
//创建一个面板
JPanel panel=new JPanel();
//创建一个标签对象
//用户名
JLabel nameLabel=new JLabel("用户名:");
//输入框
JTextField nameField=new JTextField(12);//默认文本 列(一行多列)
//把组件添加到面板上
panel.add(nameLabel);
panel.add(nameField);
//密码
JLabel pwdLabel=new JLabel("密码:");
//密码框
JPasswordField pwdField=new JPasswordField(12);
panel.add(pwdLabel);
panel.add(pwdField);
//性别
JLabel sexLabel=new JLabel("性别:");
//单选框 注意:单选框一定要进行分组,在同一组的单选框中只能选其中一个
JRadioButton man=new JRadioButton("男",true);//默认值
JRadioButton woman=new JRadioButton("女");
//分组
ButtonGroup group=new ButtonGroup();
//将选项添加到分组中
group.add(woman);
group.add(man);
panel.add(sexLabel);
panel.add(man);
panel.add(woman);
//城市
JLabel addLabel =new JLabel("城市:");
//下拉框
Object[] cities= {"北京","上海","广州","深圳","郑州","西安"};
JComboBox cityBox=new JComboBox(cities);
panel.add(addLabel);
panel.add(cityBox);
//爱好
JLabel hobbLabel=new JLabel("爱好:");
//复选框
JCheckBox java=new JCheckBox("java");
JCheckBox listen=new JCheckBox("听他唱歌");
JCheckBox feng=new JCheckBox("李易峰");
panel.add(hobbLabel);
panel.add(java);
panel.add(listen);
panel.add(feng);
//自我介绍
JLabel introJLabel=new JLabel("自我介绍:");
//文本框(多行多列)
JTextArea area=new JTextArea(15,15);//指定行 列
panel.add(introJLabel);
panel.add(area);
frame.add(panel);
FrameUtil.initFrame(frame, 800, 500);
}
菜单组件:
菜单条(JMenuBar) 菜单(JMenu) 菜单项(JMenuItem)
关系:菜单条添加菜单,菜单添加菜单项
复选菜单:菜单添加菜单,然后菜单再添加菜单项。
实现一个记事本:
public class notepad {
//窗体
JFrame frame=new JFrame("记事本");
//菜单条
JMenuBar bar=new JMenuBar();
//菜单
JMenu fileMenu=new JMenu("文件(F)");
JMenu editMenu=new JMenu("编辑(E)");
JMenu layoutMenu=new JMenu("格式(O)");
JMenu viewMenu=new JMenu("查看(V)");
JMenu helpMenu=new JMenu("帮助(H)");
//菜单项
JMenuItem save=new JMenuItem("保存(S)");
JMenuItem open=new JMenuItem("打开(O)");
JMenuItem copy=new JMenuItem("复制(C)");
JMenuItem paste=new JMenuItem("粘贴(P)");
JMenuItem about=new JMenuItem("关于(A)");
JMenuItem version=new JMenuItem("版本(V)");
//文本域
JTextArea area=new JTextArea(20,20);
//将组件组合起来
public void init() {
//将菜单添加到菜单条上
bar.add(fileMenu);
bar.add(editMenu);
//bar.add(helpMenu);
bar.add(layoutMenu);
bar.add(viewMenu);
//把菜单项添加到菜单上
fileMenu.add(open);
fileMenu.add(save);
editMenu.add(copy);
editMenu.add(paste);
//复选菜单。菜单添加到菜单上
editMenu.add(helpMenu);
//菜单添加菜单项
helpMenu.add(about);
helpMenu.add(version);
//把菜单条添加到窗体中
frame.add(bar,BorderLayout.NORTH);//上 北
frame.add(area);
FrameUtil.initFrame(frame, 600, 600);
}
public static void main(String[] args) {
new notepad().init();
}
}
(五)布局管理器
布局管理器:
布局管理器的作用是摆放组件。
每种不同的布局管理器都有不同的风格。
BorderLayout(边框布局管理器)
要注意的事项:
1.如果一个容器使用了BorderLayOut布局管理器,那么往该容器添加组件的时候如果没有指定具体的方位,那么默认在中间。
2.Frame默认使用的就是BorderLayout布局管理器。
3.东南西北哪个组件缺少了。那么中间组件就会占据其空缺位置。
public static void main(String[] args) {
JFrame frame=new JFrame("边框布局管理器");
//创建边框布局管理器
BorderLayout borderLayout=new BorderLayout();
//让窗体使用边框布局管理器
frame.setLayout(borderLayout);
frame.add(new JButton("北"),BorderLayout.NORTH);
frame.add(new JButton("南"),BorderLayout.SOUTH);
frame.add(new JButton("东"),BorderLayout.EAST);
frame.add(new JButton("西"),BorderLayout.WEST);
frame.add(new JButton("中"),BorderLayout.CENTER);
//初始化窗体
FrameUtil.initFrame(frame, 400, 400);
}
FlowLayout 流式布局管理器
注意事项:
1.使用FlowLayout默认是居中对齐。
2.panel默认使用的布局管理器就是FlowLayout布局管理器。
public static void main(String[] args) {
JFrame frame=new JFrame("窗体");
//面板
JPanel panel=new JPanel();
//创建一个流式布局管理器
FlowLayout flowLayout=new FlowLayout(FlowLayout.LEFT,10,0);//指定左对齐,水平间隔为10个像素
//让面板使用流式布局管理器
panel.setLayout(flowLayout);
frame.add(panel);
panel.add(new JButton("one"));
panel.add(new JButton("two"));
panel.add(new JButton("three"));
panel.add(new JButton("four"));
FrameUtil.initFrame(frame, 300, 300);
}
GridLayout 表格布局管理器:
如果添加的组件超过了表格的个数,那么会添加多一列进行处理。
public static void main(String[] args) {
JFrame frame=new JFrame();
//创建一个表格布局管理器
GridLayout gridLayout=new GridLayout(4,4);//表格可以摆放16个组件
frame.setLayout(gridLayout);
for(int i=0;i<10;i++) {
frame.add(new JButton(i+""));
}
frame.add(new JButton("+"));
frame.add(new JButton("-"));
frame.add(new JButton("*"));
frame.add(new JButton("/"));
frame.add(new JButton("="));
frame.add(new JButton("."));
frame.add(new JButton("?"));
FrameUtil.initFrame(frame, 400, 400);
}
(六)事件
事件:当某个组件发生了指定的动作时,会有相应的处理方案。
事件源 监听器 事件 处理方式
动作监听器:动作监听器对于鼠标点击和空格键都起作用。
public static void main(String[] args) {
//创建窗体
JFrame frame=new JFrame("窗体");
//创建一个按钮
JButton button=new JButton("点我");
//给按钮添加一个监听器,匿名对象
button.addActionListener(new ActionListener() {
//如果发生鼠标点击、按下空格键就会调用actionPerformed方法
//处理方式 ,参数是事件
@Override
public void actionPerformed(ActionEvent e) {
JButton button=(JButton)e.getSource();//获取事件源对象
String content=button.getText();
if("点我".equals(content)) {
button.setText("点它");
}else {
button.setText("点我");
}
}
});
frame.add(button);
FrameUtil.initFrame(frame,300, 300);
}
鼠标监听器
JFrame frame=new JFrame("窗体");
//创建一个按钮
JButton button=new JButton("点我");
//给按钮添加一个鼠标监听器
/*
button.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("鼠标松开...");
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("鼠标按下...");
}
@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("鼠标单击...");
}
});*/
/*MouseAdapter适配器 该类已经实现了MouseListener接口,但是实现的方法都是空实现
需要用到哪个方法再具体实现。
*/
//匿名内部类
button.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
//System.out.println("鼠标单击...");
if(e.getClickCount()==2) {
System.out.println("双击了...");
}
}
});
frame.add(button);
FrameUtil.initFrame(frame, 300, 300);
}
键盘监听器
public static void main(String[] args) {
JFrame frame=new JFrame("窗体");
//创建一个按钮
JButton button=new JButton("点我");
//给按钮添加一个键盘监听器
/*
button.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
System.out.println("键入某个键...");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("释放键...");
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("按下某个键...");
}
});
*/
//适配器,需要哪个方法再具体实现
button.addKeyListener(new KeyAdapter() {
//实现方法
public void keyPressed(KeyEvent e) {
System.out.println("按下的键:"+e.getKeyChar()+"键的code:"+e.getKeyCode());
}
});
frame.add(button);
FrameUtil.initFrame(frame, 300, 300);
}