Ciao andmin,
grazie mille per l'aiuto...
Scusa la domanda iniziale: ma JOptionPane non ti bastava? (cioè mettere un pannello come "message" del JOptionPane).
a dire la verità non avevo pensato ad un JOptionPane, anche perchè in effetti non avevo mai provato ad inserire un pannello come message....
comunque sia, l'idea della classe astratta nasceva anche in previsione di poterla modificare o renderla più complessa in futuro....
Ma valuterò di sicuro la tua alternativa. 
Di per sé, concettualmente, non fa una piega ma .... c'è un "piccolo" dettaglio che va considerato in questi casi: chi invoca getCentralPane? Lo invoca il costruttore della classe base astratta? Se così bisogna stare mooooolto attenti!
Beh, a dire il vero non è invocato "direttamente" dal costruttore... ma dato che il costruttore in questione chiama un metodo che invoca a sua volta getCentralPane,credo che il problema ricada in questo caso.
Mostrando un po' di codice:
Questa è l'abstract class
codice:
public abstract class AbsDialogOK_ANN extends JDialog{
/**
*
*/
private static final long serialVersionUID = 1L;
// pannelli
private JPanel _pann = null;
protected JPanel centerJP = null;
private JPanel sud = null;
// JButton
private JButton _ok = null;
private JButton _annulla = null;
//
protected boolean flag = false;
public AbsDialogOK_ANN(String title){
super(new JFrame(),title, true);
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
this.setResizable(false);
this.setContentPane(this.getJCP());
final Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(new Dimension(screenSize.width / 2,screenSize.height / 2));
this.setLocation((screenSize.width - this.getWidth()) / 2,(screenSize.height - this.getHeight()) / 2);
this.setVisible(true);
}
private JPanel getJCP() {
if (this._pann == null) {
this._pann = new JPanel();
this._pann.setLayout(new BorderLayout());
// this._pann.add(this.getNorthPan(), BorderLayout.NORTH);
this._pann.add(this.getCenterPan(), BorderLayout.CENTER);
this._pann.add(this.getSudPan(), BorderLayout.SOUTH);
}
return this._pann;
}
protected JPanel getCenterPan() {
if (this.centerJP == null) {
this.centerJP = new JPanel();
}
return this.centerJP;
}
private JPanel getSudPan() {
if (this.sud == null) {
this.sud = new JPanel();
this.sud.setLayout(new FlowLayout());
this.sud.add(this.getAnnBut());
this.sud.add(this.getOKBut());
}
return this.sud;
}
private JButton getOKBut() {
if(this._ok == null){
this._ok = new JButton("Ok");
this._ok.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
AbsDialogOK_ANN.this.actionOkButton();
}});
}
return this._ok;
}
protected void actionOkButton(){
flag=true;
dispose();
}
private JButton getAnnBut() {
if(this._annulla == null){
this._annulla = new JButton("Annulla");
this._annulla.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
dispose();
}});
}
return this._annulla;
}
protected boolean isFlag() {
return flag;
}
}
..da qui la mia idea era di creare altre classi, alle quali bastava sovrascrivere i metodi protected...
Tuttavia, oltre al problema delle dimensioni, come hai già compreso, ne ho anche altri, infatti... dopo il dispose di una delle sottoclassi, tutti i metodi getXx mi restituiscono null.
Es, costruendo una classe in questo modo....
codice:
// ti riporto solo le parti "interessanti"
public class LogInGUI extends AbsDialogOK_ANN
/...
@Override
public JPanel getCenterPan() {
if (this.centerJP == null) {
this.centerJP = new JPanel();
// ometto la costruz del layout //
build.addLabel("UserName", CC.xy(2, 2));
build.add(this.getUsernametxt(), CC.xy(4, 2));
build.addLabel("Psw", CC.xy(2, 4));
build.add(this.getPswtxt(), CC.xy(4, 4));
this.centerJP = build.getPanel();
this.centerJP.setBorder(BorderFactory.createTitledBorder("User"));
}
return this.centerJP;
}
@Override
protected void actionOkButton() {
this.credenziali = new String[2];
this.credenziali[0] = this.usernametxt.getText();
this.credenziali[1] = this.getPsw();
super.actionOkButton();
}
public String[] getCredenziali(){
return this.credenziali;
}
nel main.... ottengo una NullPointerException.
codice:
public static void main(String[] args) {
LogInGUI lg = new LogInGUI();
String[] cred = null;
if(lg.isFlag()){
cred = lg.getCredenziali();
System.out.println("user: " + cred[0]);
}
Detto in generale: un costruttore non dovrebbe mai invocare un metodo che può essere ridefinito in una sotto-classe. E se proprio è necessario farlo, chi scrive le sotto-classi (e in particolare quel metodo ridefinito) deve essere ben a conoscenza di questo aspetto e scrivere la sottoclasse in modo da non causare problemi.
.. quindi come posso riadattare le cose in base alle mie esigenze?
Ovviamente se abbandono l'idea della classe astratta e inglobo tutto, non ho alcun problema...