Java GUI 学习笔记(基础)

GUI

Java GUI 两大组件体系:AWT 和 Swing
AWT(java.awt)Swing(javax.swing)
AWT 组件直接绑定于本地图形用户界面的功能上,故对底层平台的依赖性比较强,也代表其移植性比较差Swing 组件直接用 Java 语言编写,故对本地底层平台的依赖性较低,也就更灵活、更稳定
它们各有千秋,Swing 不能完全取代 AWT

1.设计并创建界面外观

框架类 Frame 和 JFrame
FrameJFrame
属于 AWT 组件属于 Swing 组件,凡是以“J”开头的就是 Swing 组件
import javax.swing.*;
import java.awt.*;

public class TestFrame extends JFrame {
    public static void main(String[] args) {
        JFrame myframe = new JFrame("我的 GUI 程序");
        myframe.setSize(100, 200);
        //设置窗口尺寸
        myframe.setVisible(true);
        //设置窗口可见
        myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗口在关闭的同时退出此应用程序
    }
}

框架就是容器,即是各个组件的载体

Swing

JFrame 框架
JFrame 的窗口方法
格式效能
public void setSize(int width, int height)设置窗口的大小
public void setLocation(int x, int y)设置窗口的出现位置,默认位置是(0, 0)
public void setBounds(int a, int b, int width, int height)设置窗口的初始位置是(a, b),且窗口的宽是width,高是height
public void setVisible(boolean b)设置窗口是否可见,默认值是false
public void setResizable(boolean b)设置窗口是否可调整大小,默认可调
public void dispose()撤销当前窗口,并释放当前窗口所占用的资源
public void setExtendedState(int state)设置窗口的扩展状态
public void setDefaultCloseOperation(int operation)设置点击窗体右上角的关闭图标后的程序反应

注意:GUI的 右 和 下 是正半轴,而原点是左上角

JDialog 弹窗

它是从一个窗体弹出来的另外一个窗体,即弹窗。

注意:JDialog可以当成JFrame使用,但必须从属于JFrame

简单组件的简单使用

public class TestFrameComponent {
    public static void main(String[] args) {
        JFrame jf = new JFrame("我是标题");
        //创建 jf 框架
        jf.getContentPane().setLayout(new FlowLayout());//设置一个布局管理器
        //想一想,如果没有设置布局管理器那么多个按钮(组件)会怎么分布?
        jf.getContentPane().add(new JButton("按钮示例"));
        jf.getContentPane().add(new JButton("电子木鱼"));
        //通过 getContentPane 方法拿到 jf 的 Container,并在其中添加一个按钮

        jf.setSize(100, 200);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
布局管理器
名称说明方法
FlowLayout最简单的布局管理器,默认布局规则是将组件按照添加顺序从左到右排列在容器中

public FlowLayout(int align, int hGap, int vGap)

align 指定组件在容器中的对齐方式

hGap 指定水平排列的组件之间的间距

cGap 指定垂直排列的组件之间的间距

默认是水平对齐,水平间距/垂直间距是 5 个像素

BorderLayout将容器划分为五个部分:东区、南区、西区、北区以及中央

public BorderLayout(int hGap, int vGap)

hGap 指定水平排列的组件之间的间距

cGap 指定垂直排列的组件之间的间距

注意!默认没有水平间距和垂直间距

add(Component comp, int index) 

comp 指定需要添加到容器的组件

index 指定将组件添加到哪个区域中

GridLayout将容器划分成若干个行和若干个列的网格,组件按照添加顺序从左到右排列,即一行排满,就到下一行接着排列

public GridLayout(int rows, int columns, int hGap, int vGap)

前两者参数指定网格的行数和列数,后两者参数指定水平间距和垂直间距

 JLabel 标签
标签使用示例:
public class WoodenFish extends JFrame implements ActionListener {
    private JButton jb = new JButton("按钮示例");
    private JButton jbWoodenFish = new JButton("电子木鱼");
    private JLabel jl = new JLabel ("标签示例", SwingConstants.RIGHT);
    Icon iconCS = new ImageIcon("D:\\hecn\\Code\\new_java\\java_web\\src\\main\\resources\\images\\top.jpg");
    private JLabel jlCS = new JLabel(iconCS);
    public WoodenFish(String title) {
        super(title);
        //初始化 jf 框架及标题
        this.getContentPane().setLayout(new FlowLayout());//设置一个布局管理器
        //想一想,如果没有设置布局管理器那么多个按钮(组件)会怎么分布?
        getContentPane().add(jb);
        getContentPane().add(jbWoodenFish);
        getContentPane().add(jl);
        getContentPane().add(jlCS);
        //通过 getContentPane 方法拿到 jf 的 Container,并在其中添加组件
        jb.addActionListener(this);
        jbWoodenFish.addActionListener(this);
        //为按钮注册监听器
    }
    public static void main(String[] args) {
        WoodenFish WF = new WoodenFish("电子木鱼程序");
        WF.jlCS.setText("CS top 图片");
        WF.setSize(1000, 500);
        WF.pack();
        WF.setVisible(true);
        WF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    @Override
    public void actionPerformed(ActionEvent e) {//事件处理方法,在事件发生时调用
        if (e.getSource() == jb){
            System.out.println("示例按钮被点击了");
        }
        else if (e.getSource() == jbWoodenFish){
            System.out.println("功德 + 1!");
        }
    }
}
标签常用的方法
public void setText(String text)设置标签上的文本
public String getText()获取标签上的文本
public void setIcon(Icon icon)设置标签上的图标
public Icon getIcon()获取标签上的图标

JButton 按钮
public class WoodenFish extends JFrame implements ActionListener {
    private JButton jb = new JButton("按钮示例");
    private JButton jbWoodenFish = new JButton("电子木鱼");
    private JLabel jl = new JLabel ("标签示例", SwingConstants.RIGHT);
    Icon iconCS = new ImageIcon("D:\\hecn\\Code\\new_java\\java_web\\src\\main\\resources\\images\\top.jpg");
    private JLabel jlCS = new JLabel(iconCS);
    private int count = 0;
    public WoodenFish(String title) {
        super(title);
        //初始化 jf 框架及标题
        this.getContentPane().setLayout(new FlowLayout());//设置一个布局管理器
        //想一想,如果没有设置布局管理器那么多个按钮(组件)会怎么分布?
        getContentPane().add(jb);
        getContentPane().add(jbWoodenFish);
        getContentPane().add(jl);
        getContentPane().add(jlCS);
        //通过 getContentPane 方法拿到 jf 的 Container,并在其中添加组件
        jb.addActionListener(this);
        jbWoodenFish.addActionListener(this);
        //为按钮注册监听器
    }
    public static void main(String[] args) {
        WoodenFish WF = new WoodenFish("电子木鱼程序");
        WF.setSize(1000, 500);
        WF.pack();
        WF.setVisible(true);
        WF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        WF.jlCS.setText("CS top 图片");
    }
    @Override
    public void actionPerformed(ActionEvent e) {//事件处理方法,在事件发生时调用
        if (e.getSource() == jb){
            System.out.println("示例按钮被点击了");
        }
        else if (e.getSource() == jbWoodenFish){
            System.out.println("功德 + 1!");
            count++;
            jl.setText("增加功德数:" + count + "次");
        }
    }
}

按钮常用的方法
public void setMnemonic(int mnemonic)设置按钮的快捷键。例如setMnemonic('P') = Alt + P
public void setToolTipText(String text)获取按钮的提示信息
public void setText(String text)设置按钮上的文本
public void setIcon(Icon icon)设置按钮上的图标
public Icon getIcon()获取按钮上的图标
setTooltipText(String text)设置提示文字
setBorderPainted()设置边界是否提示
setEnabled()设置按钮是否可用

JTextField 文本域(文本框)
用户登录界面,暂略

JTextField 文本框的常用方法
public String getText()获取文本框中的文本
public void setText(String text)将给定字符串写入文本框中
public void setEditable(boolean editable)设置文本框的可编辑属性,默认为true(可编辑)
public void setColumns(int col)设置文本框的列数(文本框的长度可变)
 JTextArea 文本区 

上面的 JTextField 只能处理单行文本,而 JTextArea 用来处理多行文本

记事本,暂略

public String getText()获取文本区中的文本
public void setText(String text)将给定字符串写入文本区中
public void setEditable(boolean editable)设置文本区的可编辑性,默认为 true
public void setColumns(int col)设置文本区的列数
public void setRows(int rows)设置文本区的行数
public void insert(String s, int pos)将字符串 s 插入文本区 pos 指定的位置
public void append(String s)将字符串 s 添加到文本的末尾
public replaceRange(String s, int start, int end)用字符串 s 替换文本区中从位置 start 到 end 的文字

JPanel 面板和复杂组件

由于一个图形界面中可能会有许多个组件,但将所有组件都放在一个容器中就不好布局(因为一个容器中的布局方式只能有一种),为了实现复杂的界面可以借助面板,它是一种透明的可嵌套容器组件,用来将各种组件分类

计算器,暂略

(JPanel 默认布局是 FlowLayout,而 JFrame 默认布局是 BorderLayout) 

JRadioButton 单选按钮

public boolean isSelected() 获取单选按钮的选择状态

用户登录界面升级板,暂略

(需要按钮组 ButtonGroup,只有加到一组内的单选按钮才能实现单选效果) 

 JCheckBox 多选按钮
用户登录,暂略

(单选按钮在其一组 ButtonGroup 中,只能选择一个。而复选框没有组的限制,可以多选)

JComboBox 下拉列表框组件

 暂略

JMenuBar 菜单栏组件

2.实现界面的交互功能

在绘制图形界面后,需要程序对用户的操作进行反馈,这就是交互能力。 

事件处理模型

Java 使用事件处理方式来实现交互,采用的事件处理机制称为委托事件处理模型。在用户操作程序的某个组件时产生了一个代表此操作的一个信号(事件 Event),产生信号的组件称为信号源(事件源),然后让监听器来接收此信号(事件)并对其进行处理。

事件源 VS 事件
用户行为事件源事件类型
单击按钮JButtonActionEvent
在文本域回车JTextFieldActionEvent
改变文本域JTextFieldTextEvent
改变文本区JTextAreaTextEvent
窗口打开、关闭、最小化、还原或正在关闭WindowWindowEvent
在容器中添加或删除组件ContainerContainerEvent
组件移动、修改大小、隐藏或显示ComponentComponentEvent
组件获取或失去焦点ComponentFocuseEvent
按下或释放按键ComponentKeyEvent
鼠标按下、释放、点击、进入或离开组件、移动或拖动ComponentMouseEvent

(委托事件处理模型图)

事件 VS 监听器
事件类监听接口监听器中的事件处理方法
ActionEventActionListeneractionPerformed (ActionEvent e)
AdjustmentEventAdjustmentListeneradjustmentValueChanged (AdjustmentEvent e)
ItemEventItemListeneritemStateChanged (ItemEvente)
TextEventTextListenertextValueChanged (TextEvent e)
WindowEventWindowListenerwindowOpened (WindowEvent e)
windowActivated (WindowEvente)
windowDeactivated (WindowEvente)
windowIconified (WindowEvente)
windowDeiconified (WindowEvente)
windowClosing (WindowEvent e)
windowClosed (WindowEvent e)
ContainerEventContainerListenercomponentAdded (ContainerEvent e)
componentRemoved (ContainerEvent e)
ComponentEventComponentListenercomponentMoved (ComponentEvent e)
componentHidden (ComponentEvent e)
componentResized (ComponentEvent e)
componentShown (ComponentEvent e)
FocuseEventFocusListenerfocusGained (FocusEvent e)
focusLost (FocusEvent e)
KeyEventKeyListenerkeyPressed (KeyEvent e)
keyReleased (KeyEvent e)
keyTyped (KeyEvente)
MouseEventMouseListener

mousePressed (MouseEvent e)

mouseReleased (MouseEvent e)

mouseEntered (MouseEvent e)

mouseExited (MouseEvent e)

mouseClicked (MouseEvent e)

MouseMotionListener

mouseDragged (MouseEvent e)

mouseMoved (MouseEvent e)

注册/处理
动作事件处理
ActionEventActionListener

  • public Object getSource()
  • 得到事件源引用,通常用来区分事件源

  • public String getActionCommand()
  • 得到动作命令,每个事件源产生动作事件时都会为此事件赋予一个字符串类型的标签 = 动作命令,默认就是按钮上显示的标签
  • public void addActionListener(ActionListener listener)
  • 给事件源注册一个动作事件监听器

  • public void actionPerformed(ActionEvent e)
  • 事件处理方法
事件处理示例:
public class WoodenFish extends JFrame implements ActionListener {
    private JButton jb = new JButton("按钮示例");
    private JButton jbWoodenFish = new JButton("电子木鱼");
    public WoodenFish(String title) {
        super(title);
        //初始化 jf 框架及标题
        this.getContentPane().setLayout(new FlowLayout());//设置一个布局管理器
        //想一想,如果没有设置布局管理器那么多个按钮(组件)会怎么分布?
        getContentPane().add(jb);
        getContentPane().add(jbWoodenFish);
        //通过 getContentPane 方法拿到 jf 的 Container,并在其中添加按钮
        jb.addActionListener(this);
        jbWoodenFish.addActionListener(this);
        //为按钮注册监听器
    }
    public static void main(String[] args) {
        WoodenFish WF = new WoodenFish("电子木鱼程序");
            WF.setSize(500, 200);
            WF.setVisible(true);
            WF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    @Override
    public void actionPerformed(ActionEvent e) {//事件处理方法,在事件发生时调用
        if (e.getSource() == jb){
            System.out.println("示例按钮被点击了");
        }
        else if (e.getSource() == jbWoodenFish){
            System.out.println("功德 + 1!");
        }
    }
}

处理进阶

 多多益善!

鼠标事件

 暂略

键盘事件 

暂略

3.扩展

getContentPane() 是获取容器的方法

setLocation() 设置窗口位置的方法

setVisible() 设置窗口是否可见的方法

setDefaultColseOperation(JFrame.EXIT_ON_CLOSE) 设置窗口被关闭时退出程序

setResizable() 设置窗口能否被改变大小

组件

setEditable() 设置文本能否被编辑

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值