《Java核心技术I》Swing用户界面组件

news2024/12/17 18:31:22

Swing和模型-视图-控制器设计模式

用户界面组件各个组成部分,如按钮,复选框,文本框或复杂的树控件,每个组件都有三个特征:
  • 内容,如按钮的状态,文本域中的文本。
  • 外观,颜色,大小等。
  • 行为,对事件的反映。
Swing设计者采用了一种很有名的设计模式:MVC
  • 模型(model):存储内容。
  • 视图(view):显示内容。
ButtonModel接口属性
  • actionCommand,与按钮关联的动作命令字符串
  • mnemonic,按钮的助记快捷键
  • armed,按钮按下且鼠标仍在按钮上则为true
  • enabled,按下按钮钮时可选择的则为true
  • pressed,按钮按下且鼠标按键没释放则为true
  • rollover,鼠标在按钮上则为true
  • selected,按钮已经被选择(复选框和单选按钮),则为true。
每个JButton对象都存储着一个按钮对象:
var button = new JButton("Blue");
ButtonModel model = button.getModel();
JButton继承自JComponent,包含DefaultButtonModel对象,BasicButtonUI对象。
package swing;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class ButtonModelTest {

    public static void main(String[] args) {
        
        JFrame frame = new JFrame("ButtonModel");
        JPanel buttonPanel = new JPanel();
        JLabel jLabel = new JLabel("ButtonModel",JLabel.CENTER);
        JButton jButton = new JButton("操作按钮");
        frame.add(jLabel,BorderLayout.CENTER);
        buttonPanel.add(jButton);
        frame.add(buttonPanel,BorderLayout.SOUTH);
        ButtonModel bm =  jButton.getModel();
        jButton.addMouseListener(new MouseListener() {
            
            @Override
            public void mouseReleased(MouseEvent e) {
                System.out.println("松开鼠标!");
            }
            
            @Override
            public void mousePressed(MouseEvent e) {
//                System.out.println("按下鼠标!");
                if(bm.isArmed()) {
                    System.out.println("按钮按下且鼠标仍在按钮上!");
                }
                if(bm.isPressed()) {
                    System.out.println("按钮按下且鼠标按键没释放!");
                }
            }
            
            @Override
            public void mouseExited(MouseEvent e) {
                
            }
            
            @Override
            public void mouseEntered(MouseEvent e) {
//                System.out.println("鼠标进入按钮区域!");
                if(bm.isRollover()) {
                    System.out.println("鼠标在按钮上!");
                }
                
            }
            
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("单击鼠标!");
            }
        });
        
        frame.setSize(600, 400);
        //初始打开为屏幕中央
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension screenSize = toolkit.getScreenSize();
        int screenWidth = (int) screenSize.getWidth();
        int screenHeight = (int) screenSize.getHeight();
        //计算窗口位置
        int x = (screenWidth - frame.getWidth())/2;
        int y = (screenHeight - frame.getHeight())/2;
        frame.setLocation(x, y);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何通过递延型指标预测项目的长期成果?

递延型指标(Deferred Metrics)是指那些并不立即反映或直接影响当前操作、决策或行为的指标,而是随着时间的推移,才逐渐显现出影响效果的指标。这类指标通常会在一段时间后反映出来,或者需要一定的周期才能展现其成果或…

uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!

**提要:**近段时间我们收到多个康复机构用户,咨询AI运动识别插件是否可以应用于肢力运动受限患者的康复锻炼中来,插件是可以应用到AI康复锻炼中的,今天小编就为您介绍一下AI运动识别插件在康腹锻炼中的应用场景。 一、康复机构的应…

C++(十八)

前言: 本文依据上一篇,继续对C中的函数进行学习。 一,内联函数。 再执行函数代码时,比不使用函数花费了更多时间,因为总结步骤,传递参数和返回值都很花费时间。 因此,在调试小型函数时&…

如何在 Ubuntu 上安装 NodeBB 并使用 Nginx 反向代理

简介 NodeBB 是一款基于 Node.js 的开源论坛软件,为在线社区提供了现代化和响应式的解决方案。在 Ubuntu Linux 上运行的 NodeBB 利用了操作系统的强大性和灵活性,以提供高性能和可扩展性。它结合了 MongoDB 或 Redis 进行数据库管理,使其能…

【UE5 C++课程系列笔记】09——多播委托的基本使用

目录 多播委托——申明委托 一、DECLARE_MULTICAST_DELEGATE 二、DECLARE_DYNAMIC_MULTICAST_DELEGATE 多播委托——绑定委托 一、Add 二、AddStatic 三、AddRaw 四、AddSP 五、AddUObject 六、Remove 七、RemoveAll 多播委托——执行 上一篇:【UE5 C课程…

车牌识别OCR授权:助力国产化升级,全面提升道路监控效率

政策背景:国产化升级,推动道路监控产业转型 随着国家对信息安全的重视,国内各大公安、政企机构已进入全面升级国产化平台的实施阶段。根据最新的政策要求,公安和政府部门必须在未来三年内完成平台的国产化替换工作。这一举措不仅…

无人机推流直播平台EasyDSS视频技术如何助力冬季森林防火

冬季天干物燥,大风天气频繁,是森林火灾的高发期。相比传统的人力巡查,无人机具有更高的灵敏度和准确性,尤其在夜间或浓雾天气中,依然能有效地监测潜在火源。 无人机可以提供高空视角和实时图像传输,帮助巡…

linux下查看nginx的安装路径

一般会安装在默认位置下:/usr/local/openresty/nginx 或/usr/local/nginx 查看nginx运行进程,mast process 后面一般是nginx 的安装目录 ps -aux|grep nginx执行ls -l /proc/进程号/exe 会打印出安装/运行位置 ps -aux|grep nginx ls -l /proc/进程号/ex…

Python随机抽取Excel数据并在处理后整合为一个文件

本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件,随机从其中选取一部分数据,并将全部文件中随机获取的数据合并为一个新的Excel表格文件的方法。 首先,我们来明确一下本文的具体需求。…

网络基础 - TCP/IP 五层模型

文章目录 一、OSI 参考模型中各个分层的作用1、应用层2、表示层3、会话层4、传输层5、网络层6、数据链路层7、物理层 二、OSI 参考模型通信处理示例三、TCP/IP1、定义2、规范 - RFC(Request For Comment) 一、OSI 参考模型中各个分层的作用 1、应用层 2、表示层 负责设备固有数…

探索Web3:从去中心化应用到全球数字化未来

Web3 是互联网发展的下一步,它通过去中心化的理念重新定义了数字世界。与传统的Web2相比,Web3将数据主权交还给用户,让每个人都可以在没有中介的情况下安全地交换信息和价值。本文将探索Web3的基本概念,去中心化应用(D…

pydub AudioSegment实现音频重采样 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…

uniapp/HBuilder X引入weex报错weex is not defined

出现错误: ‍[⁠ReferenceError⁠]‍ {message: "weex is not defined"} 在www.iconfont.cn把想要的图标放进个人项目中并且下载css文件: 进入HBuilder自己创建的项目中添加一个目录common,添加一个文件free-icon.css 把刚才下载…

音频进阶学习八——傅里叶变换的介绍

文章目录 前言一、傅里叶变换1.傅里叶变换的发展2.常见的傅里叶变换3.频域 二、欧拉公式1.实数、虚数、复数2.对虚数和复数的理解3.复平面4.复数和三角函数5.复数的运算6.欧拉公式 三、积分运算1.定积分2.不定积分3.基本的积分公式4.积分规则线性替换法分部积分法 5.定积分计算…

ActiveMQ 反序列化漏洞CVE-2015-5254复现

文章目录 一、产生原因二、利用条件三、利用过程四、PoC(概念验证)五、poc环境验证使用find搜索vulhub已安装目录打开activeMQ组件查看配置文件端口启动镜像-文件配置好后对于Docker 镜像下载问题及解决办法设置好镜像源地址,进行重启docker查…

主成分分析法大全(包括stata+matlab)

数据简介:主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。在实际课题中,为了…

qt中tr的使用

在 Qt 中使用 tr 函数对字符串进行翻译时,通常会通过 Qt Linguist 工具来处理翻译。以下是一个基本的步骤说明,展示如何将 QPushButton *btnnew QPushButton(tr("Hello World"),this); 翻译成其他语言,比如中文: 1.创建…

【Unity3D】报错libil2cpp.so找不到问题

mainTemplate.gradle文件末尾添加: **IL_CPP_BUILD_SETUP** 此报错发生在低版本的Unity升级到高版本后,例如Unity2019升级到Unity2021,而Unity2019默认创建的mainTemplate.gradle文件是不包含**IL_CPP_BUILD_SETUP** 因此会导致libil2cpp.so…

GLM4模型详解 - 智谱AI开源大模型全面解析

📚 2024年6月5日,智谱AI在开发者大会上正式开源GLM-4-9B系列大模型。本文将全面解析GLM4的技术特点、部署方案和应用场景。 GLM-4-9B 模型具备了更强大的推理性能、更长的上下文处理能力、多语言、多模态和 All Tools 等突出能力。 “All Tools” 一、模型概述 1.…

嵌入式驱动开发详解17(CAN驱动开发)

文章目录 前言CAN简介CAN收发器CAN协议讲解电气特性传输协议数据帧遥控帧错误帧过载帧帧间隔 同步矫正 CAN控制器CAN控制器模式CAN接收器CAN波特率 CAN设备树分析CAN测试后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发,但是由于部分模块的驱动框架过于复…