不管是AWT还是Swing,都把选择框分成两类:复选框和单选按钮,这两类控件无论是外观上还是功能上均有显著差异。例如,在外观方面,复选框是在方框内打勾,而单选按钮是在圆圈内画圆点;在功能方面,复选框允许多选,而同组的单选按钮只能选择其中一个。然而AWT的复选框和单选按钮统统采用Checkbox类型,区别之处在于是否加入了单选组CheckboxGroup。这不可避免又带来困惑,同样是Checkbox类型,代码该如何区分某个选择框到底是复选框还是单选按钮?显然AWT的控件设计很不合理,非常容易引起混淆,为此Swing干脆将它俩彻底分开,各自分配对应的控件类型,从此井水不犯河水,大家才能相安无事。
Swing给复选框起的名字叫JCheckBox,该控件与AWT的Checkbox用法相似,但在细节上存在下列差异:
1、对于JCheckBox来说,setLabel方法已经废弃,改为使用统一的setText方法来设置文本。同时获取控件文本的getLabel方法也改成了getText方法。
2、getState方法被直接取消了,JCheckBox改为调用isSelected方法判断当前复选框是否选中。同时设置选中状态的setState方法也改成了setSelected方法。
下面是利用JCheckBox点菜的代码例子:

     JPanel panelTop = new JPanel(); // 创建顶部面板JCheckBox ck1 = new JCheckBox("麻婆豆腐"); // 创建一个复选框JCheckBox ck3 = new JCheckBox("清蒸桂花鱼"); // 创建一个复选框JCheckBox ck2 = new JCheckBox("香辣小龙虾"); // 创建一个复选框panelTop.add(ck1); // 在顶部面板上添加复选框panelTop.add(ck2); // 在顶部面板上添加复选框panelTop.add(ck3); // 在顶部面板上添加复选框frame.add(panelTop, BorderLayout.NORTH); // 把顶部面板添加到窗口的北边(上方)JCheckBox[] boxArray = new JCheckBox[]{ck1, ck2, ck3}; // 构建复选框数组ck1.addItemListener(new ItemListener() { // 给复选框添加一个点击监听器public void itemStateChanged(ItemEvent e) { // 复选框的状态发生变化// getStateChange方法用于获取复选框的当前状态。1为勾选,0为取消勾选labelCenter.setText(String.format("您%s了%s",(e.getStateChange() == 1 ? "点" : "取消"), ck1.getText()));labelBottom.setText("当前已点菜肴包括:" + getCheckedItem(boxArray));}});ck2.addItemListener(new ItemListener() { // 给复选框添加一个点击监听器public void itemStateChanged(ItemEvent e) { // 复选框的状态发生变化// getStateChange方法用于获取复选框的当前状态。1为勾选,0为取消勾选labelCenter.setText(String.format("您%s了%s",(e.getStateChange() == 1 ? "点" : "取消"), ck2.getText()));labelBottom.setText("当前已点菜肴包括:" + getCheckedItem(boxArray));}});ck3.addItemListener(new ItemListener() { // 给复选框添加一个点击监听器public void itemStateChanged(ItemEvent e) { // 复选框的状态发生变化// getStateChange方法用于获取复选框的当前状态。1为勾选,0为取消勾选labelCenter.setText(String.format("您%s了%s",(e.getStateChange() == 1 ? "点" : "取消"), ck3.getText()));labelBottom.setText("当前已点菜肴包括:" + getCheckedItem(boxArray));}});

以上代码出现的getCheckedItem方法用来获取已经选定的菜单,该方法的定义代码示例如下:

   // 获取已经选定的菜单private static String getCheckedItem(JCheckBox[] boxArray) {String itemDesc = "";for (JCheckBox box : boxArray) { // 遍历复选框数组if (box.isSelected() == true) { // 复选框被选中了if (itemDesc.length() > 0) {itemDesc = itemDesc + "、";}itemDesc = itemDesc + box.getText(); // 菜单添加选定的菜肴}}return itemDesc;}

运行上述的复选框测试代码,弹出窗口的初始界面如下图所示。


从左往右依次勾选三个复选框,每次勾选后的界面效果分别如下列三张图片所示。


至于单选按钮,Swing给它分配了专门的控件类型名叫JRadioButton,该控件的自身方法类似于JCheckBox,一样引入了setText、getText、isSelected、setSelected等新方法替换AWT的旧方法。并且Swing给JRadioButton找了个按钮小组搭档,名叫ButtonGroup,只要多次调用小组对象的add方法,就能将若干个单选按钮加到同一小组。下面是与ButtonGroup有关的调用代码:

       ButtonGroup group = new ButtonGroup(); // 创建一个按钮小组group.add(rb1); // 把单选按钮1加入到按钮小组group.add(rb2); // 把单选按钮2加入到按钮小组group.add(rb3); // 把单选按钮3加入到按钮小组

接着把JRadioButton与ButtonGroup整合在一起,打算实现简单的点餐功能,完整的调用代码如下所示:

       JPanel panelTop = new JPanel(); // 创建顶部面板// 创建单选按钮,并且默认未选中JRadioButton rb1 = new JRadioButton("鱼香肉丝饭", false);// 创建单选按钮,并且默认已选中JRadioButton rb2 = new JRadioButton("香菇滑鸡饭", true);// 创建单选按钮,并且默认未选中JRadioButton rb3 = new JRadioButton("黑椒牛排饭", false);panelTop.add(rb1); // 在顶部面板上添加单选按钮panelTop.add(rb2); // 在顶部面板上添加单选按钮panelTop.add(rb3); // 在顶部面板上添加单选按钮frame.add(panelTop, BorderLayout.NORTH); // 把顶部面板添加到窗口的北边(上方)ButtonGroup group = new ButtonGroup(); // 创建一个按钮小组group.add(rb1); // 把单选按钮1加入到按钮小组group.add(rb2); // 把单选按钮2加入到按钮小组group.add(rb3); // 把单选按钮3加入到按钮小组rb1.addItemListener(new ItemListener() { // 给单选按钮添加一个点击监听器public void itemStateChanged(ItemEvent e) { // 单选按钮被选中label.setText("您点了" + rb1.getText()); // 在标签上显示当前选中的单选按钮文本}});rb2.addItemListener(new ItemListener() { // 给单选按钮添加一个点击监听器public void itemStateChanged(ItemEvent e) { // 单选按钮被选中label.setText("您点了" + rb2.getText()); // 在标签上显示当前选中的单选按钮文本}});rb3.addItemListener(new ItemListener() { // 给单选按钮添加一个点击监听器public void itemStateChanged(ItemEvent e) { // 单选按钮被选中label.setText("您点了" + rb3.getText()); // 在标签上显示当前选中的单选按钮文本}});

运行上面的单选按钮测试代码,弹出窗口的初始界面如下图所示。

然后从左往右依次单击三个按钮,每次单击后的界面效果分别如下列三张图片所示。


更多Java技术文章参见《Java开发笔记(序)章节目录》

转载于:https://www.cnblogs.com/pinlantu/p/11266839.html

Java开发笔记(一百三十)Swing的选择框相关推荐

  1. Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作"字符流I/O",其中字母I代表输 ...

  2. Java开发笔记(五十)几种开放性修饰符

    前面介绍子类继承父类的时候,提到了public(公共)和private(私有)两个修饰符,其中public表示它所修饰的实体是允许外部访问的:而private表示它所修饰的实体不允许外部访问,只能在当 ...

  3. Java学习笔记(三十五)

    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度.现在将跟着视频做的笔记进行整理.本篇博客是整理Java知识点的第三十五 ...

  4. Java开发笔记(三十三)字符包装类型

    正如整型int有对应的包装整型Integer那样,字符型char也有对应的包装字符型Character.初始化字符包装变量也有三种方式,分别是:直接用等号赋值.调用包装类型的valueOf方法.使用关 ...

  5. Java开发笔记(五十六)利用枚举类型实现高级常量

    前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...

  6. Java开发笔记(八十八)文件字节I/O流

    前面介绍了如何使用字符流读写文件,并指出字符流工具的处理局限,进而给出随机文件工具加以改进.随机文件工具除了支持访问文件内部的任意位置,更关键的一点是通过字节数组读写文件数据,采取字节方式比起字符方式 ...

  7. Android开发笔记(三十八)列表类视图

    AdapterView AdapterView顾名思义是适配器视图,Spinner.ListView和GridView都间接继承自AdapterView,这三个视图都存在多个元素并排展示的情况,所以需 ...

  8. Android开发笔记(三十六)展示类控件

    View/ViewGroup View是单个视图,所有的控件类都是从它派生出来:而ViewGroup是个视图组织,所有的布局视图类都是从它派生出来.由于View和ViewGroup是基类,因此很少会直 ...

  9. Android开发笔记(三十五)页面布局视图

    布局视图的类别 布局视图有五类,分别是线性布局LinearLayout.相对布局RelativeLayout.框架布局FrameLayout.绝对布局AbsoluteLayout.表格布局TableL ...

  10. Android开发笔记(三十四)Excel文件的读写

    Android中操作Excel文件的场合较少见,主要是一些专业领域导入导出报表时使用,所以处理Excel读写的开源代码也很稀缺.目前读写Excel主要采用开源库jxl,这个是韩国人写的excel操作工 ...

最新文章

  1. 微软警告称Flame病毒利用Windows漏洞
  2. 简单python画圣诞树图片-python圣诞树编写实例详解
  3. snowflake算法 php,Snowflake —— 分布式全局唯一 id 生成算法
  4. 第三次学JAVA再学不好就吃翔(part101)--IO流
  5. SAP Spartacus里的converter实例化逻辑
  6. AtCoder 4169 [ARC100D] Colorful Sequences(dp)
  7. 改丝印的假华强北三代1562A,用芯良苦!
  8. 基于Jquery-ui的自动补全
  9. 使用 typescript ,提升 vue 项目的开发体验(2)
  10. qt的qmap根据key进行归类,汇总
  11. java执行bat代码
  12. 杭州电子科技大学 计算机专硕复试分数线,2020杭州电子科技大学考研复试分数线已公布...
  13. 安利一款SOLIDWORKS插件,可一键帮你分离配置那种!
  14. 如何导出计算机硬盘重数据,硬盘对拷教程,100%保存原硬盘数据
  15. 数据结构——2-3树
  16. linux 命令行高亮显示
  17. UG10.0四五轴立加卧加后处理制作教程
  18. PYNQ中的纯PL端开发
  19. 查找算法之元二分搜索|单边二分搜索
  20. HTB-Forest

热门文章

  1. axure实现复选框全选_表格设置一键全选按钮,这样的打√方式,只需要三步搞定...
  2. 网络信号_如何用有线电视线传输网络信号
  3. 第九章(三)多阶段决策问题
  4. Collections 常用方法
  5. 关于 in与exist , not in与not exist 的区别
  6. Centos7 Kubernetes(k8s) 开发服务器(单服务器)部署 mariadb/mysql 数据库
  7. 1.6.PHP7.1 狐教程-【版本库客户端 git SourceTree安装配置使用】
  8. java泛型为类类型_Java泛型:仅定义为返回类型的通用类型
  9. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_24-CMS前端页面查询开发-使用钩子方法实现立即查询...
  10. Qt + OpenSenceGraph(osg) 加载OSG模型