Java Swing编程之仿js树状折叠菜单

摘要:
最近,我们需要完成一个需求:使用swing制作一个树菜单,包括一个二级菜单。单击主菜单以展开次菜单。如果辅助菜单的数量超过预览视图,将显示滚动条。Swing需要仔细学习,找到很多东西!

最近要完成一个需求:用swing做个树状菜单,含二级菜单,点击一级菜单展开二级菜单,且二级菜单数目超过预览视图会出现滚动条。由于swing研究的少,花了不少精力!

先看下测试效果图:

收起图:

Java Swing编程之仿js树状折叠菜单第1张

展开图:

Java Swing编程之仿js树状折叠菜单第2张

完整源码:

  1 package com.xuwei.test2;
  2 
  3 import java.awt.BorderLayout;
  4 import java.awt.Color;
  5 import java.awt.GridLayout;
  6 import java.awt.event.ActionEvent;
  7 import java.awt.event.ActionListener;
  8 
  9 import javax.swing.JButton;
 10 import javax.swing.JFrame;
 11 import javax.swing.JPanel;
 12 import javax.swing.JScrollPane;
 13 
 14 
 15 public class TestFrm4 extends JFrame{
 16     private JButton btn1,btn2,btn3,btn4,btn5;
 17     private JPanel pNorth,pSouth,subMenuContainer;
 18     private JScrollPane pCenter;
 19     private JButton[] btn = null;
 20     private static boolean expand=false;
 21     
 22     public TestFrm4(){
 23         btn1=new JButton("Grade1 menu1");
 24         btn1.setBackground(Color.CYAN);
 25         btn2=new JButton("Grade1 menu2");
 26         btn2.setBackground(Color.CYAN);
 27         btn3=new JButton("Grade1 menu3");
 28         btn3.setBackground(Color.CYAN);
 29         btn3.addActionListener(new ActionHandler());
 30         
 31         btn4=new JButton("Grade1 menu4");
 32         btn4.setBackground(Color.CYAN);
 33         btn5=new JButton("Grade1 menu5");
 34         btn5.setBackground(Color.CYAN);
 35         pNorth=new JPanel();
 36         pNorth.setLayout(new GridLayout(3,1));
 37         pSouth=new JPanel();
 38         pSouth.setLayout(new GridLayout(2,1));
 39         subMenuContainer=new JPanel();
 40         subMenuContainer.setLayout(new GridLayout(25,1));
 41      
 42         btn=new JButton[25];        
 43         for(int i=0;i<btn.length;i++){
 44             btn[i]=new JButton("[菜单"+i+"]");
 45             btn[i].setBackground(Color.WHITE);
 46         }
 47         
 48         this.setLayout(new BorderLayout());
 49         
 50         pNorth.add(btn1); pNorth.add(btn2); pNorth.add(btn3); 
 51         for(int i=0;i<btn.length;i++){
 52             subMenuContainer.add(btn[i]);
 53         }
 54         pCenter=new JScrollPane(subMenuContainer);
 55         
 56         pSouth.add(btn4);pSouth.add(btn5);
 57         this.add(pNorth,"North");
 58         this.add(pCenter,"Center");
 59         this.add(pSouth,"South");
 60        
 61         this.setVisible(true);
 62         this.setSize(500,600);
 63         this.setResizable(false);
 64         this.setLocationRelativeTo(null);
 65         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 66         
 67     }
 68     
 69     
 70     
 71     private class ActionHandler implements ActionListener{
 72 
 73         @Override
 74         public void actionPerformed(ActionEvent e) {
 75             if(btn3==e.getSource()){
 76                 if(expand){//折叠
 77                    pNorth.setLayout(new GridLayout(3,1));
 78                    pNorth.remove(btn4);pNorth.remove(btn5);
 79                    pSouth.add(btn4);pSouth.add(btn5);
 80                    for(int i=0;i<btn.length;i++){
 81                        subMenuContainer.add(btn[i]);
 82                    }     
 83                    validate();
 84                    getContentPane().repaint();
 85                    expand=false;
 86                 }else{//展开
 87                     for(int i=0;i<btn.length;i++){
 88                         subMenuContainer.remove(btn[i]);
 89                     }
 90                     pSouth.removeAll();
 91                     pNorth.setLayout(new GridLayout(5,1));
 92                     pNorth.add(btn4);
 93                     pNorth.add(btn5);
 94                     pNorth.repaint();
 95                     pCenter.repaint();
 96                     pSouth.repaint();
 97                     validate();
 98                     getContentPane().repaint();
 99                     expand=true;
100                 }
101             }
102         }
103         
104     }
105     
106     public static void main(String[] args) {
107        
108         new TestFrm4();
109     }
110 
111 }

这里频繁添加删除组件需要及时刷新界面,swing有几个方法要反复调用:

repaint(),validate(),invalidate(),doLayout().

之前我由于没调用validate()导致界面刷新出现很多问题!

swing要仔细研究发现东西也不少!

免责声明:文章转载自《Java Swing编程之仿js树状折叠菜单》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于Eclipse插件开发(四)-------给视图加下拉菜单和按钮和加入编辑器.2017.06.29数据挖掘基础概念第二.三章下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

通过Url Protocol实现web调用本地exe,兼容谷歌IE,并实现本地验证

1.随便在网上找个注册码写入,web调用方法为<a href="openLayerManager:">调用</a> 一定要注意后面的冒号 2.这样调用的话你会发现,如果本地没有该程序,那么你怎么点击都不会有反应,这样就需要本地exe程序有无验证 3.验证,首先需要下载两个大神写的js文件example.js和protocolchec...

js打印隐藏的div,可自定义样式

这里是全部代码,可以直接运行。js需要自行导入 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script src="js/...

js外部调用layui.use中的函数的写法

layui模块化的写法固然不错,但也有让人不适应的一些地方 外部调用函数的写法就让人不太舒服 需要在函数名前面加上window这个前缀,就不太舒服 补充:window前缀,是全局变量的声明方式 如下: //监听输入框的name window._nameFormat = function(){ var length = $('#nam...

中文前端UI框架Kit(十三)使用RequireJs托管你的类库和js代码

号外:kitjs官方讨论QQ群建立了,QQ群号88093625,欢迎大家加入,讨论前端相关话题 kit内置支持requireJs托管,可以使用requireJs加载和管理KitJs框架内的所有组件和类库 最近园子里有很多讨论requireJs(http://requirejs.org/)的兄弟,requireJs托管js代码的好处有 1.通过闭包提供了一个...

JS实现div的抖动:缓动式抖动

代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Title</title> <style> #di...

js中的6中继承方式

oo语言支持两种继承:接口继承和实现继承,js中函数没有方法签名,所以只支持实现继承 1.原型链继承 实现思想:原型对象也是对象,将原型对象的prototype指向父类的原型(将父对象的实例赋给子对象的原型),即可实现继承 <script type="text/javascript"> //原型链实现继承 //父类...