Un alternativa è quella, ma se i componenti sono molti esce molto brutto oltre che non molto efficiente.
Un alternativa che preferisco è la seguente
codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Permesso {
public static int AMMINISTRAZIONE = 0;
public static int UTENTE = 1;
private Permesso() {}
}
class Utente {
private int permesso;
private String nome;
Utente(String nome, int permesso) throws Exception {
if(permesso != Permesso.AMMINISTRAZIONE && permesso != Permesso.UTENTE) throw new Exception();
this.nome = nome;
this.permesso = permesso;
}
int getPermesso() {
return permesso;
}
String getNome() {
return nome;
}
}
class PannelloAdmin extends JPanel {
PannelloAdmin() {
JLabel label = new JLabel("Amministrazione");
add(label);
}
}
class PannelloUtente extends JPanel {
PannelloUtente() {
JLabel label = new JLabel("Utente");
add(label);
}
}
class MyFrame extends JFrame {
private PannelloAdmin pa;
private PannelloUtente pu;
private JMenuItem esci;
// Questo dato potresti averlo grazie ad esempio
// all'immissione di dati in un campo di testo per
// la convalida dei dati (magari il programma verifica
// i dati nel DB; in quel caso crei Utente con i dati ed il permesso)
private Utente utente;
MyFrame() {
try {
// In questo caso è l'admin
utente = new Utente("root",Permesso.AMMINISTRAZIONE);
// In questo utente
//utente = new Utente("utente",Permesso.UTENTE);
} catch(Exception e) {e.printStackTrace();}
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu file = new JMenu("File");
esci = new JMenuItem("Esci");
file.add(esci);
menuBar.add(file);
if(utente.getPermesso() == Permesso.AMMINISTRAZIONE) {
pa = new PannelloAdmin();
getContentPane().add(pa);
} else {
pu = new PannelloUtente();
getContentPane().add(pu);
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void makeGUI() {
MyFrame mf = new MyFrame();
mf.setSize(500,500);
mf.setVisible(true);
}
public static void main(String[] args) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
makeGUI();
}
});
} catch(Exception e) {}
}
}
Hai i riferimenti ai 2 pannelli, e poi in base ai permessi che ha l'utente, istanzi il pannello corretto.
Nell'esempio qui sopra, commentando:
codice:
utente = new Utente("root",Permesso.AMMINISTRAZIONE);
// Oppure (come di default)
utente = new Utente("utente",Permesso.UTENTE);
avrai o un pannello Amministrazione o un Utente.
Tieni presente che il mio esempio è stato scritto in 15 minuti... proprio per mostrarti l'idea che sta alla base. ^^
Domanda: nel caso di sola lettura non potrei mettere i componenti di input dentro un subpannello che rendo "freeze".. in modo da disabilitare tutti i suoi componenti con una mossa sola?
Devi comunque fare "textField.setEditable(false);" su ogni singolo campo di testo, piuttosto che un setEnabled(false); su ogni bottone. La cosa più comoda e semplice credo sia quella mostrata li sopra... al momento non ho altre idee.