如何统一管理所有页面的控件

crl_lxy 2008-07-17 09:11:39
我用swing做了一个系统,也做好了相关角色权限的管控,但我不想在每个页面调用方法来判断用户所属的角色是否有操作权限,而是希望在用户登陆后便判断并控制。

用户登陆后,出现一个新窗体,左边是Jtree,用户有访问某页面的权限时,该节点可有效点击,没有访问权限,该节点为灰色,点击无效。目前访问的权限我都控制好了,但增删改的权限就不好控制了,我期望的效果是如用户没有某页面的增加数据权限,则该页面执行添加的JButton按钮不显示,如有权限则显示,删除和修改也一样,有权限显示相关按钮,没有则不显示。

如果在每个页面去判断的话,当然简单了,就是有权限,按钮设为setVisible(true),没有则为setVisible(false),但那样一来,我需要去修改很多页面,比较麻烦,所以,我分析,如果我将所有按钮名字统一化,例如所有页面执行添加的按钮名为Add,删除的就为Del,然后统一控制,这样就好办了,但如何去实现呢,有点无从下手了,请高手们指点,感激万分!
...全文
468 72 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
72 条回复
切换为时间正序
请发表友善的回复…
发表回复
crl_lxy 2008-07-28
  • 打赏
  • 举报
回复
[Quote=引用 71 楼 dawn023 的回复:]
可以提供一个Interface,该Interface中有一个函数CheckPrivilege判断是否有什么样的权限,然后各个Page实现该接口,在这个接口中根据权限进行处理。而你只要管理这些接口就可以了。
[/Quote]

我現在就是這樣判斷權限的,但這還是不能統一管理哦。。。我得去修改很多界面代碼
dawn023 2008-07-25
  • 打赏
  • 举报
回复
可以提供一个Interface,该Interface中有一个函数CheckPrivilege判断是否有什么样的权限,然后各个Page实现该接口,在这个接口中根据权限进行处理。而你只要管理这些接口就可以了。
crl_lxy 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 61 楼 tq0f9d4 的回复:]
用我的方法,可以做到楼主所希望的,不过你的架构可能要大改…………还是不说了,不过如果楼主不惜这样做的话,再问我好了
[/Quote]


呵呵,謝謝哈,我沒想過要大改,如果要改架構的話比較麻煩。。。
crl_lxy 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 62 楼 sagezk 的回复:]
我更晕,那我刚才问你“右面是用 JDesktopPane 组织你的“页面”窗体的吗?”你说是!
[/Quote]

呵呵,我后面不是說了么。。。
sagezk 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 crl_lxy 的回复:]
引用 52 楼 sagezk 的回复:
你左面用的是 JTree 右面是用 JDesktopPane 组织你的“页面”窗体的吗?

是的,右邊是JPane的界面
[/Quote]

[Quote=引用 59 楼 crl_lxy 的回复:]
引用 57 楼 sagezk 的回复:
引用 54 楼 crl_lxy 的回复:
引用 52 楼 sagezk 的回复:
你左面用的是 JTree 右面是用 JDesktopPane 组织你的“页面”窗体的吗?

是的,右邊是 JPanel 的界面

早说清楚问题早解决了,
再不厌其烦地问一下,你右面是用的 JDesktopPane 组织一堆 JInternalFrame 来实现“页面”的,还是向 JPanel 里面加入了一堆对应于每一个“页面”的 JPanel 或其它组件来实现的?

暈了,界面都是分開的啦。。每個界面都是JPanel的
[/Quote]

我更晕,那我刚才问你“右面是用 JDesktopPane 组织你的“页面”窗体的吗?”你说是!
tq0f9d4 2008-07-24
  • 打赏
  • 举报
回复
用我的方法,可以做到楼主所希望的,不过你的架构可能要大改…………还是不说了,不过如果楼主不惜这样做的话,再问我好了
crl_lxy 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 finalzhzhk 的回复:]
我们的权限控制是这样做的.
1.组件定义权值
2.权值与管理员对应保存.(授权界面处理)
4.管理员登陆时会获取其相应的权限
3.继承swing基础组件,例JButton, JList,JComboBox等等,复写add(JComponent comp)方法,在这里判断其权值
不符合的可以setEnabled(false);或不加载
[/Quote]


我這個系統沒辦法這樣做,因為不能預知有多少個角色,都是產線那邊在用系統,不同的產線要的權限都不一樣,而且我不愿意在每個頁面去寫判斷,想在用戶登錄時統一遍歷控制...
crl_lxy 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 sagezk 的回复:]
引用 54 楼 crl_lxy 的回复:
引用 52 楼 sagezk 的回复:
你左面用的是 JTree 右面是用 JDesktopPane 组织你的“页面”窗体的吗?

是的,右邊是 JPanel 的界面


早说清楚问题早解决了,
再不厌其烦地问一下,你右面是用的 JDesktopPane 组织一堆 JInternalFrame 来实现“页面”的,还是向 JPanel 里面加入了一堆对应于每一个“页面”的 JPanel 或其它组件来实现的?
[/Quote]


暈了,界面都是分開的啦。。每個界面都是JPanel的
finalzhzhk 2008-07-24
  • 打赏
  • 举报
回复
我们的权限控制是这样做的.
1.组件定义权值
2.权值与管理员对应保存.(授权界面处理)
4.管理员登陆时会获取其相应的权限
3.继承swing基础组件,例JButton, JList,JComboBox等等,复写add(JComponent comp)方法,在这里判断其权值
不符合的可以setEnabled(false);或不加载

sagezk 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 crl_lxy 的回复:]
引用 52 楼 sagezk 的回复:
你左面用的是 JTree 右面是用 JDesktopPane 组织你的“页面”窗体的吗?

是的,右邊是 JPanel 的界面
[/Quote]

早说清楚问题早解决了,
再不厌其烦地问一下,你右面是用的 JDesktopPane 组织一堆 JInternalFrame 来实现“页面”的,还是向 JPanel 里面加入了一堆对应于每一个“页面”的 JPanel 或其它组件来实现的?
小宏 2008-07-24
  • 打赏
  • 举报
回复
学习
crl_lxy 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 TinyJimmy 的回复:]
依据权限创建界面,看上去不复杂呀? 没明白..
[/Quote]

不是依權限創建界面,而是控制按鈕。。。
crl_lxy 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 sagezk 的回复:]
你左面用的是 JTree 右面是用 JDesktopPane 组织你的“页面”窗体的吗?
[/Quote]

是的,右邊是JPane的界面
crl_lxy 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 68 楼 sagezk 的回复:]
你的 JTree 事件监听器应该只有一个吧,在那里调用就行。另外就算每个页面都调用一次也麻烦不到那儿去,你的每个页面不都得 new 吗,new 时外面包上一层 initPage(new ...) 就行了。
[/Quote]

嗯,JTree的事件監聽都是以前的同事寫好了,JTree的節點都是從數據庫中讀出來的,同事寫的代碼邏輯好像有點復雜,也沒有注釋,挺暈的,找個時間我好好研究下。。。你的方案我會試下,謝謝你!
crl_lxy 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 67 楼 finalzhzhk 的回复:]
角色是可以添加的,在添加的时候,通过授权界面把组件的权值赋给角色,保存到数据库中(还可以修改权值)
[/Quote]

嗯,明白你的意思了,請問有具體解決方案可參考么?
sagezk 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 66 楼 crl_lxy 的回复:]
謝謝65樓的朋友,那么,依你的意思,我是不是還需到每個頁面去調用JPanel initPage(JPanel page)?
[/Quote]

你的 JTree 事件监听器应该只有一个吧,在那里调用就行。另外就算每个页面都调用一次也麻烦不到那儿去,你的每个页面不都得 new 吗,new 时外面包上一层 initPage(new ...) 就行了。
finalzhzhk 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 60 楼 crl_lxy 的回复:]
引用 58 楼 finalzhzhk 的回复:
我们的权限控制是这样做的.
1.组件定义权值
2.权值与管理员对应保存.(授权界面处理)
4.管理员登陆时会获取其相应的权限
3.继承swing基础组件,例JButton, JList,JComboBox等等,复写add(JComponent comp)方法,在这里判断其权值
不符合的可以setEnabled(false);或不加载

我這個系統沒辦法這樣做,因為不能預知有多少個角色,都是產線那邊在用系統,不同的產線要的權限都不一樣,而且我不…
[/Quote]
角色是可以添加的,在添加的时候,通过授权界面把组件的权值赋给角色,保存到数据库中(还可以修改权值)
crl_lxy 2008-07-24
  • 打赏
  • 举报
回复
謝謝65樓的朋友,那么,依你的意思,我是不是還需到每個頁面去調用JPanel initPage(JPanel page)?
sagezk 2008-07-24
  • 打赏
  • 举报
回复
如果如你所说:

1. 操作流程:登录窗体(验证登录用户身份获取用户权限) -> 根据权限显示主窗体
2. 主窗体布局为左右两栏,左面显示 JTree,右面根据 JTree 中选择的条目显示相应的 JPanel(里面有一堆按钮)来完成操作
3. 右面那些 JPanel 是当选中 JTree 中条目时动态 new 出来的

那解决方法如下:

import java.util.List;
import java.util.LinkedList;
import java.awt.Component;
import java.awt.Container;

/**
* SwingUtil - Swing Tool Methods.
* @author SageZk(张长弓)
* @version 0.6
*/
public class SwingUtil {

private SwingUtil() { /*禁止创建此类的实例*/ }

/**
* 递归获取指定容器内的所有指定类型的组件。
* @param con 要搜索的容器
* @param cls 搜索的组件类型
* @return 搜索到的组件列表
*/
private static List<Component> getAllComponents(Container con, Class cls) {
if (con == null || con.getComponentCount() == 0) return null;
List<Component> coms = new LinkedList<Component>();
List<Container> cons = new LinkedList<Container>();
Component[] cs = con.getComponents();
for (Component c : cs) {
if (c.getClass() == cls) {
coms.add(c);
} else {
cons.add((Container) c);
}
}
for (Container c : cons) {
List<Component> list = getAllComponents(c, cls);
if (list != null) coms.addAll(list);
}
return coms;
}

/**
* 获取指定的容器内的所有指定类型的组件。
* @param con 要搜索的容器
* @param cls 搜索的组件类型
* @return 搜索到的组件数组
*/
public static Component[] getFrameComponents(Container con, Class cls) {
if (con == null || cls == null) throw new NullPointerException("con or cls is null");
List<Component> list = getAllComponents(con, cls);
if (list == null) return new Component[0];
return list.toArray(new Component[list.size()]);
}

}


1. 自己写个方法用于初始化 JPanel 页面,比如:
public static JPanel initPage(JPanel page) {
Component[] cs = getFrameComponents(page, JButton.class); //搜索页面中所有 JButton
for (int i = 0; i < cs.length; ++i) {
JButton btn = (JButton) cs[i];
//根据权限启用或禁用按钮
}
return page;
}


2. 在 JTree 条目选中事件处理代码中 new 页面时作初始化处理:
JPanel page = initPage(new PageJPanel());  //PageJPanel 是你自己的页面类
crl_lxy 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 sagezk 的回复:]
你的“页面”到底是如何实现的?界面整体布局和操作流程什么样?
[/Quote]

用swing做的呀,我在主貼里都有寫的。。。
加载更多回复(50)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧