OOP组件及事件处理(一)

主要内容

Java Swing概述 窗口 常用组件与布局 处理事件 使用MVC结构 对话框 发布GUI程序

一、Java Swing概述

Java的Swing工具包中包含了许多类来支持GUI(图形用户界面)设计。如:按钮、菜单、列表、文本框等组件类,同时它还包含窗口、面板等容器类。

JComponent类是java.awt包中Container类的一个直接子类、是java.awt包中Component类的一个间接子类,学习GUI编程主要是学习掌握使用Component类的一些重要子类及其使用方法。

GUI编程基本知识点

(1) Java把Component类的子类或间接子类创建的对象称为一个组件.

(2) Java把Container类的子类或间接子类创建的对象称为一个容器.

(3) 可以向容器添加组件。Container类提供了一个public方法:add( ),一个容器可以调用这个方法将组件添加到该容器中。

(4) 容器调用removeAll()方法可以移掉容器中的全部组件;调remove(Component c)方法可以移掉容器中参数c指定的组件。

(5)注意到容器本身也是一个组件,因此可以把一个容器添加到另一个容器中实现容器的嵌套。

(6)每当容器添加新的组件或移掉组件时,应当让容器调用validate()方法,以保证容器中的组件能正确显示出来

java 复制代码
例如:
    JFrame f=new JFrame();
    JButton  button=new JButton("确定")
    f.add(button);
    .......
    f.remove(button);

二、窗口

Java提供的JFrame类的实例是一个底层容器,即通常所称的窗口。其他组件必须被添加到底层容器中,以便借助这个地层容器和操作系统进行信息交互。

JFrame类是Container类的间接子类。当需要一个窗口时,可使用JFrame或其子类创建一个对象。

窗口也是一个容器,可以向窗口添加组件。需要注意的是,窗口默认地被系统添加到显示器屏幕上,因此不允许将一个窗口添加到另一个容器中。简单说就是 "窗口是独立显示的,不能嵌套进其他容器里"。其他容器(除了窗口)可以实现嵌套。

1、JFrame常用方法

JFrame构造方法:

JFrame() 创建一个无标题的窗口。

JFrame(String s) 创建标题为s的窗口。

常用方法:

  1. public void setBounds(int a,int b,int width,int height) 设置窗口的初始位置是(a,b),即距屏幕左面a个像素、距屏幕上方b个像素;窗口的宽是width,高是height。

  2. public void setSize(int width,int height) 设置窗口的大小。

  3. public void setLocation(int x,int y) 设置窗口的位置,默认位置是(0,0)。

  4. public void setVisible(boolean b) 设置窗口是否可见,窗口默认是不可见的。

  5. public void setResizable(boolean b) 设置窗口是否可调整大小,默认可调整大小。

  6. public void dispose() 撤消当前窗口,并释放当前窗口所使用的资源。

  7. public void setExtendedState(int state) 设置窗口的扩展状态.

  8. public void setDefaultCloseOperation(int operation) 该方法用来设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。如:EXIT_ON_CLOSE

9)public void setLayout(LayoutManager mgr) 设置此容器的布局管理器。

10)public Component add(Component comp) 将指定组件追加到此容器的尾部。

11)public void setMenuBar(MenuBar mb) 将此 frame 的菜单栏设置为指定的菜单栏。

12)public void validate() 使用 validate 方法会使容器再次布置其子组件。在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。

13)setTitle(s);//设置窗口标题

例子9_1用JFrame创建了两个窗口w1和w2

java 复制代码
import javax.swing.*;
import java.awt.*;

public class Example9_1 {
    static void main(String[] args) {
        JFrame w1 = new JFrame("第一个窗口");
        JFrame w2 = new JFrame("第二个窗口");
        //创建一个容器:Container类的子类或间接子类创建的对象称为一个容器
        Container con = w1.getContentPane();
        //设置窗口的背景色
        con.setBackground(Color.yellow);
        //设置窗口在屏幕上的位置及大小
        w1.setBounds(60,100,188,108);
        w2.setBounds(260,100,188,108);
        w1.setVisible(true);
        w1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        //释放当前窗口
        w2.setVisible(true);
        w2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出程序(和上面w1不一样)
    }
}

程序运行效果如图👇

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) 的意思是:

当关闭这个窗口时,只释放当前窗口的资源 (把这个窗口关掉),但不会结束整个程序

现在开了 2 个窗口(w1w2),当关闭其中一个时,另一个窗口还在运行(程序没结束);只有把两个窗口都关闭,程序才会退出。

如果想让 "关闭任意一个窗口就结束整个程序",可以把这两行改成:

java 复制代码
w1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
w2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

2、菜单条、菜单、菜单项

菜单条(MenuBar)

JComponent类的子类JMenubar负责创建菜单条,JFrame类有一个将菜单条放置到窗口中的方法:setJMenuBar(JMenuBar bar);该方法将菜单条添加到窗口的顶端。

菜单条JMenuBar类构造方法:JMenuBar(); JMenuBar Mbar=new JMenuBar()

菜单(Menu)

JComponent类的子类JMenu负责创建菜单。

菜单JMenu类构造方法:JMenu() ; JMenu(String s) ; JMenu m=new JMenu();

常用方法:

public void add(JMenuItem item) 向菜单增加由参数item指定的菜单项

public JMenuItem getItem(int n) 得到指定索引处的菜单选项。

public int getItemCount() 得到菜单选项的数目。

菜单项(MenuItem)

JComponent类的子类JMenuItem负责创建菜单项,JMenuItem类的主要方法有以下几种:

JMenuItem(String s) 构造有标题的菜单项。

JMenuItem(String text, Icon icon) 构造有标题和图标的菜单项

public void setAccelerator(KeyStroke keyStroke)为菜单项设置快捷键

例子9_2

java 复制代码
import javax.swing.*;
import java.awt.*;

public class Example9_2 {
    public static void main(String[] args) {
        WindowMenu win = new WindowMenu("带菜单的窗口",20,30,600,290);
    }
}
/*
因为 JFrame 是 Java Swing 里用来创建窗口的类,
所以WindowMenu类相当于 "一个自定义的窗口类",
后续可以用它来创建窗口对象。
核心是利用 "继承" 特性复用 JFrame 的窗口功能,同时定制自己需要的窗口逻辑
在WindowMenu类里,
你能加自己的代码(比如设置窗口大小、添加按钮、定义点击按钮的行为),
让这个窗口变成你想要的样子;
 */
class WindowMenu extends JFrame{
    //菜单条
    JMenuBar menubar;
    //菜单1
    JMenu menuFruit;
    //菜单项1
    JMenuItem bananaItem,pearItem;
    //菜单2
    JMenu appleMenu;
    //菜单项2
    JMenuItem greenAppleItem,redAppleItem;
    //构造器
    public WindowMenu() {
    }
    //方法1:设置基本的东西
    public WindowMenu(String s,int x,int y,int w,int h){
        //方法2
        init(s);
        //父类JFrame方法
        setLocation(x,y);
        setSize(w,h);
        setVisible(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
    //方法2:设置菜单
    void init(String s){
        //设置窗口标题
        setTitle(s);
        //创建菜单条
        menubar = new JMenuBar();
        //用menufruit做根菜单
        menuFruit = new JMenu("水果菜单");//根菜单
        //创建菜单1的菜单项
        bananaItem = new JMenuItem("香蕉");
        bananaItem.setIcon(new ImageIcon("banana.png"));
        pearItem = new JMenuItem("甜梨");
        pearItem.setIcon(new ImageIcon("pear.png"));

        appleMenu = new JMenu("苹果");//分支菜单?
        //创建菜单2的菜单项
        greenAppleItem = new JMenuItem("绿苹果");
        greenAppleItem.setIcon(new ImageIcon("greenApple.png"));
        redAppleItem = new JMenuItem("红苹果");
        redAppleItem.setIcon(new ImageIcon("redApple.png"));

        menuFruit.add(bananaItem);//为菜单添加菜单项
        menuFruit.add(pearItem);//为菜单添加菜单项
        //为菜单添加分隔线
        menuFruit.addSeparator();
        //用菜单也可以添加菜单
        menuFruit.add(appleMenu);
        appleMenu.add(greenAppleItem);
        appleMenu.add(redAppleItem);
        //在菜单条中添加menuFruit菜单
        menubar.add(menuFruit);
        //在窗口中放置菜单条
        setJMenuBar(menubar);
    }
}

三、常用组件与布局

菜单条可以使用JComponent的子类JTextField创建各种组件。利用组件可以完成应用程序与用户的交互及事件处理等。

1、常用组件

  1. 文本框:由JComponent的子类JTextField创建文本框。

(1)构造函数:JTextField( ) ; JTextField(int columns) ;

(2)常用方法:

public String getText();

public void setText(String t);

  1. 文本区:由JComponent的子类JTexArea创建文本区。

(1)构造函数:JTextArea() ;JTextArea(int rows, int columns)

(2)常用方法:

public String getText();

public void setText(String t);

  1. 按钮:由JComponent的子类JButton类用来创建按钮。

(1)构造函数:JButton() ; JButton(String text) ;

(2)常用方法:public void addActionListener(ActionListener l);

  1. 标签:由JComponent的子类JLabel类用来创建标签。

(1)构造函数:JLabel() ; JLabel(String text) ; JLabel(Icon image) ;

(2)常用方法:

public String getText();

public void setText(String t);

  1. 选择框:由JComponent的子类JCheckBox类用来创建选择框。

(1)构造函数: JCheckBox() ; JCheckBox(String text) ;

(2)常用方法:

public void addItemListener(ItemListener l)

public void addActionListener(ActionListener l)

ItemListener接口中:Object getItemSelectable()相当于getSource();

public int getStateChange(); 若被选中SELECTED/DESEELCTED

  1. 单选按钮:由JComponent的子类JRadioButton类用来创建单项选择框。

(1)构造函数: JRadioButton() ; JRadioButton(String text) ;

(2)常用方法: public void addItemListener(ItemListener l)

7.下拉列表:由JComponent的子类JComboBox类用来创建下拉列表。

(1)构造函数:JComboBox() ; JComboBox(Object[] items)

(2)常用方法: public void addItemListener(ItemListener l)

public Object getSelectedItem();

public int getSelectedIndex()

  1. 密码框:由JComponent的子类JPasswordField创建密码框.

(1)构造函数:JPasswordField() ; JPasswordField(int columns)

(2)常用方法:

public String getText();

public void setText(String t);

public void setEchoChar(char c)使用该方法重新设置回显字符.

public char[] getPassword()方法可以返回实际的密码

例子9_3(Example9_3.java , ComponentInWindow.java )包含有上面提到的常用组件。

java 复制代码
import javax.swing.*;
import java.awt.*;

public class Example9_3 {
    public static void main(String[] args) {
        componentInWindow Window = new componentInWindow();
        Window.setBounds(100,100,450,260);
        Window.setTitle("常用组件");
    }
}
class componentInWindow extends JFrame{
    //复选框
    JCheckBox checkBox1,checkBox2;
    //单选按钮
    JRadioButton radioM,radioF;
    ButtonGroup group;
    //下拉列表
    JComboBox<String> comBox;
    public componentInWindow(){
        init();
        setVisible(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
    void init(){
        setLayout(new FlowLayout());
        comBox = new JComboBox<String>();
        checkBox1 = new JCheckBox("喜欢音乐");
        checkBox2 = new JCheckBox("喜欢旅游");
        group = new ButtonGroup();
        radioM = new JRadioButton("男");
        radioF = new JRadioButton("女");
        group.add(radioM);
        group.add(radioF);
        add(checkBox1);
        add(checkBox2);
        add(radioM);
        add(radioF);
        comBox.addItem("音乐天地");
        comBox.addItem("武术天地");
        add(comBox);
    }
}

运行结果👇

相关推荐
南棱笑笑生4 小时前
20251215给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后调通typeC1接口
linux·c语言·开发语言·rockchip
无名之辈J4 小时前
IDEA插件
java
金牌归来发现妻女流落街头4 小时前
【阻塞队列的等待唤醒机制】
java·开发语言·阻塞队列
骚戴4 小时前
深入解析:Gemini 3.0 Pro 的 SSE 流式响应与跨区域延迟优化实践
java·人工智能·python·大模型·llm
毕设源码-朱学姐4 小时前
【开题答辩全过程】以 基于Java技术的羽毛球积分赛管理系统的设计与实现 为例,包含答辩的问题和答案
java·开发语言
2501_941982054 小时前
Go 进阶:发送文件/图片消息的流程与实现
开发语言·后端·golang
疾风sxp4 小时前
nl2sql技术实现自动sql生成之Spring AI Alibaba Nl2sql
java·人工智能
BullSmall4 小时前
Tomcat11证书配置全指南
java·运维·tomcat