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

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

先看下测试效果图:

收起图:

展开图:

完整源码:

  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要仔细研究发现东西也不少!

时间: 2025-01-11 04:25:08

Java Swing编程之仿js树状折叠菜单的相关文章

Atitit. 悬浮窗口的实现 java swing c# .net c++ js html 的实现

Atitit. 悬浮窗口的实现 java swing c# .net c++ js html 的实现 1. 建立悬浮窗口引用代码 1 1.1. 定义悬浮窗口,设置this主窗口引用,是为了在悬浮窗口中双击可缩小还还原主窗口.以及悬浮窗口右键菜单"显示主界面"中需要还原主窗 1 1.2. //设置主窗口关闭时,先关闭悬浮窗口.and系统托盘 1 1.3. 注入系统托盘图标,退出的时候儿也退出系统托盘 2 2. 悬浮窗口结构and重大的点 2 2.1. 要去掉标题栏: 2 2.2. Opa

java网络编程之UDP实例

package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { public static DatagramPacket toDatagram(String s, InetAddress destIA, int destPort) { byte[] buf = new byte[s.length() + 1]; s.getBytes(0, s.length(), b

java网络编程之TCP实例

Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { public static DatagramPacket toDatagram(String s, InetAddress destIA, int destPort) { byte[] buf = new byte[s.length() + 1]; s.getBytes(0, s.leng

黑马程序员——Java网络编程之UDP传输

网络编程 网络模型 通讯要素:InetAddress(对象):ip地址,网络中设备的标识,不可记忆,可用主机名,本地回环地址:127.0.0.1主机名localhost 端口号 传输协议:UDP,将数据的源及目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,无连接,是不可靠协议,不需要建立连接,速度快.力求速度,不求数据的准确性.比如聊天软件,网络会议. TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低. S

【转】JAVA网络编程之Socket用法

JAVA网络编程之Socket用法 分类: JAVA2012-08-24 15:56 710人阅读 评论(0) 收藏 举报 在客户/服务器通信模式中,客户端需要主动建立与服务器连接的Socket,服务器端收到客户端的连接请求,也会创建与客户端连接的Socket.Socket可以看做是通信连接两端的收发器,客户端和服务店都通过Socket来收发数据. 1.构造Socket public Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 public Socket(Str

java并发编程之Master-Worker模式

Master-Worker模式适合在一个任务可以拆分成多个小任务来进行的情况下使用. package cn.fcl.masterworker; import java.util.HashMap; import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; public c

Java并发编程之volatile的理解

Java并发编程之volatile关键字的理解 Java中每个线程都有自己的工作内存,类比于处理器的缓存,线程的工作内存中保存了被该线程使用到的变量的主内存的拷贝.线程读写变量都是直接在自己的工作内存中进行的,而何时刷新数据(指将修改的结果更新到主存或者把主存的变量读取覆盖掉工作内存中的值)是不确定的. volatile关键字是修饰字段的关键字,貌似是JDK1.5之后才有的,在多线程编程中,很大的几率会用到这个关键字,volatile修饰变量后该变量有这么一种效果:线程每一次读该变量都是直接从主

Java数据库编程之JDBC增删查改

前言 众多的ORM框架使我们从原生的JDBC编码摆脱出来,但在学习数据库编程之初,应该先掌握底层的JDBC编程,熟练应用后,学起框架才会更得心应手.就像金庸笔下的武侠人物,只要内功深厚,再去学习其他武功绝学,只不过是招式罢了.正所谓,温故而知新,本文回顾了最基础的JDBC增删查改操作. 连接数据库 在之前一篇随笔讲过如何连接数据库——<Java数据库编程之JDBC配置>. 数据库连接工具类 DBConnection package database; import java.sql.*; im

Java网络编程之Socket通信(二)

之前在前面已经介绍了Socket通信的一些基本原理,以及如何让客户端与服务器端建立通信,和实现通信的一些基本步骤(包括首先使得服务器端与客户端建立连接,建立连接之后,服务器端开始侦听客户端的请求,侦听到客户端的请求之后,通过输入输出流处理相关信息实现通信,最后通信完毕结束通信等一系列流程). 但是之前只是单个客户端与服务器进行通信,而我们实际应用中单个客户端的情况几乎不存在,都是多个客户端同时与服务器进行交互(这里同时交互就会出现并发性的问题,对于并发性的问题暂时还不是很懂,只知道有这个概念),