Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaSwing中动态创建项或允许/不允许用户操作_Java_Swing_Permissions_Autocreate - Fatal编程技术网

在JavaSwing中动态创建项或允许/不允许用户操作

在JavaSwing中动态创建项或允许/不允许用户操作,java,swing,permissions,autocreate,Java,Swing,Permissions,Autocreate,我有一个包含用户、角色和权限的数据库。我希望能够将其映射到前端(JavaSwing),这样无法执行操作的用户就看不到它 例如: 角色AddressManager具有创建\u地址、编辑\u地址和 删除您的地址 用户A具有创建和编辑地址的权限 用户B具有删除\u地址的权限 我希望地址视图有三个按钮,代表AddressManager中的角色,用户A和B需要启用/禁用这些按钮 问题:有没有简单的方法将数据库表值映射到Swing组件(按钮)上 一种方法是手动为每个组件分配启用/禁用,但如果应用程序中有

我有一个包含用户、角色和权限的数据库。我希望能够将其映射到前端(JavaSwing),这样无法执行操作的用户就看不到它

例如:

  • 角色AddressManager具有创建\u地址、编辑\u地址和 删除您的地址
  • 用户A具有创建和编辑地址的权限
  • 用户B具有删除\u地址的权限
我希望地址视图有三个按钮,代表AddressManager中的角色,用户A和B需要启用/禁用这些按钮

问题:有没有简单的方法将数据库表值映射到Swing组件(按钮)上


一种方法是手动为每个组件分配启用/禁用,但如果应用程序中有40个对话框,其中大约有200个组件必须具有权限,那么这是不实际的。

您可以编写这样的类并在任何地方使用它。 在您的示例中,您可以将其添加到新的ActionContainer(“Address”);它将创建一个创建地址、编辑地址、删除地址按钮,如果用户拥有匹配权限,这些按钮将被启用

package de.steamnet.samples;

// This class is a Panel that renders buttons based on rights.

import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JPanel;

public class ActionContainer extends JPanel {
    List<JButton> buttons = new ArrayList<JButton>();

    public ActionContainer(String rightBase) {
        List<String> rights = database.getRightsStartingWith(rightBase);
        for(String nextRight : rights) {
            JButton next = new JButton(nextRight);
            buttons.add(next);
            if(user.hasRight(nextRight)) {
                next.setEnabled(true);
            } else {
                next.setEnabled(false);
            }
            add(next);
        }
    }

    public void addActionListener(ActionListener al) {
        for(JButton next: buttons) {
            next.addActionListener(al);
        }
    }
}
package de.steamnet.samples;
//此类是基于权限呈现按钮的面板。
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JButton;
导入javax.swing.JPanel;
公共类ActionContainer扩展了JPanel{
列表按钮=新建ArrayList();
公共ActionContainer(字符串rightBase){
列表权限=database.getRightsStartingWith(rightBase);
for(字符串nextRight:rights){
JButton next=新JButton(nextRight);
按钮。添加(下一步);
if(user.hasRight(nextRight)){
next.setEnabled(true);
}否则{
next.setEnabled(false);
}
添加(下一个);
}
}
public void addActionListener(ActionListener al){
for(JButton下一步:按钮){
addActionListener(al);
}
}
}

您可以编写这样的类并在任何地方使用它。 在您的示例中,您可以将其添加到新的ActionContainer(“Address”);它将创建一个创建地址、编辑地址、删除地址按钮,如果用户拥有匹配权限,这些按钮将被启用

package de.steamnet.samples;

// This class is a Panel that renders buttons based on rights.

import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JPanel;

public class ActionContainer extends JPanel {
    List<JButton> buttons = new ArrayList<JButton>();

    public ActionContainer(String rightBase) {
        List<String> rights = database.getRightsStartingWith(rightBase);
        for(String nextRight : rights) {
            JButton next = new JButton(nextRight);
            buttons.add(next);
            if(user.hasRight(nextRight)) {
                next.setEnabled(true);
            } else {
                next.setEnabled(false);
            }
            add(next);
        }
    }

    public void addActionListener(ActionListener al) {
        for(JButton next: buttons) {
            next.addActionListener(al);
        }
    }
}
package de.steamnet.samples;
//此类是基于权限呈现按钮的面板。
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JButton;
导入javax.swing.JPanel;
公共类ActionContainer扩展了JPanel{
列表按钮=新建ArrayList();
公共ActionContainer(字符串rightBase){
列表权限=database.getRightsStartingWith(rightBase);
for(字符串nextRight:rights){
JButton next=新JButton(nextRight);
按钮。添加(下一步);
if(user.hasRight(nextRight)){
next.setEnabled(true);
}否则{
next.setEnabled(false);
}
添加(下一个);
}
}
public void addActionListener(ActionListener al){
for(JButton下一步:按钮){
addActionListener(al);
}
}
}

我们可以通过合成来实现这一点吗?那么,对于给定的JPanel,添加一个ActionContainer?是的,是的,Jpanel可以有Jpanel,但是为什么这个对象必须是Jpanel本身呢?这看起来很尴尬(?)@Thufir这个对象严格来说不需要是JPanel,但可以是任何容器,甚至可以从外部取一个容器。将其作为JPanel本身的想法是,您有一个固定组件,可以将其作为一件事使用,并将您的动作侦听器一次添加到所有按钮。您还可以迭代所有容器及其子容器,并在其中添加操作侦听器,但对于手头的任务来说,这似乎过于复杂。如果你有一个不同的用例,你可能想把它作为自己的问题而不是评论发布。我只是好奇。我认为JPanel比一般容器更可取,但我更愿意想象一个小部件而不是这样一个特定的类……我们可以用组合来实现吗?那么,对于给定的JPanel,添加一个ActionContainer?是的,是的,Jpanel可以有Jpanel,但是为什么这个对象必须是Jpanel本身呢?这看起来很尴尬(?)@Thufir这个对象严格来说不需要是JPanel,但可以是任何容器,甚至可以从外部取一个容器。将其作为JPanel本身的想法是,您有一个固定组件,可以将其作为一件事使用,并将您的动作侦听器一次添加到所有按钮。您还可以迭代所有容器及其子容器,并在其中添加操作侦听器,但对于手头的任务来说,这似乎过于复杂。如果你有一个不同的用例,你可能想把它作为自己的问题而不是评论发布。我只是好奇。我认为JPanel比一般容器更可取,但更愿意想象一个小部件而不是这样一个特定的类。。。