2010-12-19 24 views
1

我有一個包含用戶,角色和權限的數據庫。我希望能夠將其映射到前端(Java Swing),以便無法執行操作的用戶無法看到它。動態創建項目或在java swing中允許/禁止用戶操作

一個例子:

  • 角色AddressManager有權限create_address,edit_address和 remove_address。
  • 用戶A具有權限create_address和edit_address。
  • 用戶B具有權限remove_address。

我想要地址視圖的三個按鈕代表地址管理器中的角色,以及用戶A和B啓用/禁用按鈕。

問:是否有任何簡單的方法將數據庫表值映射到Swing組件(按鈕)?

一種方法是手動爲每個單獨組件分配啓用/禁用,但如果應用程序中有40個對話框,並且約200個必須具有權限的組件,則這是不實用的。

回答

1

你可以做的是編寫一個這樣的類,並在任何地方使用它。 在你的例子中,你會添加新的ActionContainer(「地址」);它將創建一個create_address,edit_address,delete_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); 
     } 
    } 
} 
+0

我們可以這樣做嗎?因此,對於給定的JPanel,添加一個ActionContainer?是的,是的,Jpanel可以有JPanel,但爲什麼這個對象必須是JPanel本身?這似乎很尷尬(?)。 – Thufir 2014-08-25 10:18:22

+0

@Thufir這個對象並不一定是JPanel,但可以是任何容器,甚至可以從外面拿一個容器。將它作爲JPanel本身的想法是,您有一個固定的組件,您可以將其用作一件事,並讓您的動作偵聽器一次添加到所有按鈕。你也可以遍歷所有的容器和他們的孩子,並在那裏添加你的動作監聽器,但是對於手頭的任務而言,這看起來過於複雜。如果您有不同的用例,則可能需要將其作爲自己的問題發佈,而不是發表評論。 – 2014-08-25 10:52:32

+0

我只是好奇。我認爲JPanel比普通容器更受青睞,但寧可想象一個小部件比這樣一個特定的類... – Thufir 2014-08-25 10:57:38