目录
GUI(Graphical User Interface)
图形用户界面——Java提供的图形用户界面
UI——用户界面
图形界面是方便用户操作的
swing
javax.swing包
包含了Java主要的图形界面的实现类
组件
容器组件——窗口,面板,对话框
功能组件——按钮 输入框,菜单……
容器的add()向容器中添加组件
窗口(JFrame)
需继承JFrame
创建窗口的常用方法
setTitle(String title):设置窗口的标题。
setSize(int width, int height):设置窗口的大小。
setLocation(int x, int y):设置窗口的位置。
setResizable(boolean resizable):设置窗口是否可调整大小。
setDefaultCloseOperation(int operation):设置窗口关闭时的操作。
add(Component comp):添加组件。
setVisible(boolean visible):设置窗口是否可见。
dispose():释放当前窗口
public class DemoFrame extends JFrame {
public DemoFrame() throws HeadlessException {
this.setTitle("小世界");//名称
this.setSize(300,300);//设置宽和高
//this.setLocation(200,400);//自定义坐标位置
this.setLocationRelativeTo(null);//水平垂直居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时退出程序
this.setResizable(false);//禁止窗口拖拽调整大小
this.setVisible(true);//让窗口显示 放在设置的最后一行
}
public static void main(String[] args) {
new DemoFrame();//创建一个窗口
}
}
面板(JPanel)
面板组件可以设置布局管理方式:布局管理器
流水布局(FlowLayout)
面板默认的布局方式
把组件放在一排,从左到右排放,一行占满后,重新开启一行
面板默认流式布局是水平居中的
JPanel jPanel = new JPanel(new FlowLayout());自动居中
JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));左对齐
JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.LEFT,10,30));设置组件之间水平,垂直间距
jPanel.setBackground(new Color(255, 153, 2, 255));设置背景颜色
JPanel jPanel = new JPanel(new FlowLayout());//自动居中 默认是水平居中,上下左右为5个像素间距
jPanel.setBackground(new Color(255, 153, 2, 255));//设置面板背景颜色
JButton jButton1 = new JButton("按钮1");//创建一个按钮组件
JButton jButton2 = new JButton("按钮2");
jPanel.add(jButton1);
jPanel.add(jButton2);
//把面板添加到窗口上
this.add(jPanel);
边界布局(BorderLayout)
共五个区域,每个区域可以放置一个组件,并且占满整个区域
中间区域是必须的,其他区域可以根据需要使用
添加组件时,可以指定组件的位置,如果不指定,默认添加到中间区域
JPanel jPanel = new JPanel(new BorderLayout());
JButton jButton1 = new JButton("按钮1");
JButton jButton2 = new JButton("按钮2");
JButton jButton3 = new JButton("按钮3");
JButton jButton4 = new JButton("按钮4");
JButton jButton5 = new JButton("按钮5");
jPanel.add(jButton1,BorderLayout.NORTH);//上
jPanel.add(jButton2,BorderLayout.SOUTH);//下
jPanel.add(jButton3,BorderLayout.EAST);//右
jPanel.add(jButton4,BorderLayout.WEST);//左
jPanel.add(jButton5,BorderLayout.CENTER);//中
this.add(jPanel);
网格布局(GridLayout)
网格类似于一个表格,可以设置行数和列数
每个网格中只能放一个组件,占满整个区域
从第一行开始摆放,第一行占满后,再开启第二行
构造时先行后列
JPanel jPanel = new JPanel(new GridLayout(2,2));
JButton jButton1 = new JButton("按钮1");
JButton jButton2 = new JButton("按钮2");
JButton jButton3 = new JButton("按钮3");
JButton jButton4 = new JButton("按钮4");
jPanel.add(jButton1);
jPanel.add(jButton2);
jPanel.add(jButton3);
jPanel.add(jButton4);
this.add(jPanel);
按钮(JButton)
创建一个按钮组件
JButton jButton = new JButton("登录");
禁用按钮
jButton.setEnabled(false);
在按钮上进行提示
jButton.setToolTipText("点击登录");
标签组件,用来设置文字(JLabel)
JLabel jLabel = new JLabel("账号");
jLabel.setFont(new Font("楷体", Font.BOLD,20));//设置字体
jLabel.setForeground(new Color(20,10,10));//设置字体颜色
单行文本框组件(JTextField)
columns设置列数 列宽
JTextField jTextField = new JTextField(15);
获取文本框中输入的内容
jTextField.getText();
jPanel.add(jTextField);
多行文本框组件(文本域)
JTextArea jTextArea = new JTextArea(5,20);
设置强制换行,当文本域的一行满后自动换行
jTextArea.setLineWrap(true);
设置文本域不可编辑
jTextArea..setEditable(false);
带滚动条的面板
把多行文本框加进来,若不加入,在输入超过指定的行数后,会使文本域变大
JScrollPane jsp = new JScrollPane(jTextArea);
jPanel.add(jsp);
密码框(JPasswordField)
JLabel jLabel = new JLabel("密码");
JPasswordField jPasswordField = new JPasswordField(15);
char[] word = jPasswordField.getPassword();//获得输入的密码 char[]类型
添加密码框
jPanel.add(jPasswordField);
菜单栏 菜单 菜单项
菜单栏(JMenuBar)
JMenuBar jMenuBar = new JMenuBar();//创建菜单栏
菜单(JMenu)
创建的是早期的菜单,有立体效果
构造方法
JMenu jMenu = new JMenu("文件");
菜单项(JMenuItem)
构造方法
JMenuItem jMenuitem1 = new JMenuItem("打开");
把菜单项添加到菜单上
jMenu.add(jMenuitem);
把菜单添加到菜单栏上
jMenuBar.add(jMenu);
把菜单栏添加到窗口
this.setJMenuBar(jMenuBar);
监听器(ActionListener)
监听器 监听组件有没有事件产生
一旦点击了某个按钮产生事件,监听器就捕获到这次事件 从而去调用对应的事件处理程序
ActionListener是一个接口,使用监听有不同的用法
1.另一个类(需传入参数,使用麻烦)
2.内部类
使用内部类比另一个类更加合适,内部类中可以直接使用外部类的成员
class A implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
}
}
3.new 接口 创建一个匿名内部类,简化语法
为组件添加事件处理程序
addActionListener
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(jTextField.getText());
}
});
为文本框添加事件监听
键盘处理事件
addKeyListener
按键按下keyPressed
jTextField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("按键按下了"+e.getKeyChar()+":"+e.getKeyCode());
jButton.setEnabled(true);
}
});
为组件添加事件处理程序
鼠标处理事件 共五种
addMouseListener
jButton.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标点击");
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("鼠标按下");
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("鼠标释放(鼠标按键抬起)");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("鼠标移入到标签上");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("鼠标从标签移出");
}
});
为窗口添加事件监听
addWindowListener
关闭的监听
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
int res = JOptionPane.showConfirmDialog(null, "是否退出","提示操作",JOptionPane.OK_CANCEL_OPTION);
if(res==0){
//点击确定
//打开登录窗口
new LogonFrame();
dispose();//释放聊天窗口
}
}
});
对话框
消息框
JOptionPane.showMessageDialog()
无返回值
ERROR_MESSAGE 错误
WARNING_MESSAGE 警告
jButton.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标点击");
String s = jTextField.getText();
if(s.length()==0){
JOptionPane.showMessageDialog(null, "请输入账号","操作提供",JOptionPane.WARNING_MESSAGE);
}
}
});
选择对话框
JOptionPane.showConfirmDialog()
有int类型的返回值
JOptionPane.showConfirmDialog(null, "你确定要登录吗?");
JOptionPane.showConfirmDialog(null, "你确定要登录吗?");
int res = JOptionPane.showConfirmDialog(null, "你确定要登录吗?","标题",JOptionPane.OK_CANCEL_OPTION);
//点击确定返回0,点击取消返回2
if(res ==0){
//执行登录操作
}
JOptionPane.OK_CANCEL_OPTION,对话框只有确定和取消
输入对话框
JOptionPane.showInputDialog(null,"请输入姓名");
有String类型的返回值
内部类
在一个类的内部定义的类称为内部类,内部类也是外部类的成员
为什么要使用内部类
1.内部类可以直接访问外部类的成员,无论成员是不是private
2.内部类只服务于当前的外部类,其他地方用不到此类
匿名内部类
new 接口/抽象类
不是new接口/抽象类的对象,为接口或抽象类创建一个匿名内部类来实现继承他们,省去创建一个类简化语法
内部类的意义
内部类编译后的字节码
A$B.class
类C中需要用到类中的成员,类C是一个外部类,无法使用到类A中成员 就可以把类C定义到类A中去, 类C只服务于类A,其他类中用不到类C,此种情况下也可以将类C定义为类A的内部类