Динамически создавать элементы или разрешить / запретить действия пользователя в Java Swing
-
11-10-2019 - |
Вопрос
У меня есть база данных, которая содержит пользователей, роли и разрешения. Я хочу иметь возможность сопоставить это с передней частью (java swing), чтобы пользователь, который не может сделать действие, не видит этого.
Пример:
- Роль AddressManager имеет разрешения create_address, edit_address и remove_address.
- Пользователь A имеет разрешения create_address и edit_address.
- У пользователя B есть разрешение remove_address.
Я хочу, чтобы три кнопки для представления адреса, которые представляют роли от AddressManager, и для пользователей A и B, чтобы включить / отключить кнопки.
Вопрос: Есть ли простой способ отображения значений таблицы баз данных для компонентов качания (кнопки)?
Одним из способов является назначение включения/отключения вручную каждому отдельному компоненту, но это непрактично, если в приложении есть 40 диалогов с примерно 200 компонентами, которые должны иметь разрешение.
Решение
Что вы можете сделать, так это написать такой класс и использовать его везде. В вашем примере вы добавите его с новым 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);
}
}
}