To liborb : Ide mi o to, aby bola statická.
A stale to nerieši problém na odvodených triedach, vypisovať bude meno základnej triedy.
Robím databázovú app, kde mám niekoľko entít, pričom pre každý entitný typ mám editor (JDialog)
Potom mám Dialogy kde sú zoznamy prehľady a pod.
Pre otvorenie okna kontkrétnej entity chcem použiť <Trieda entity>.showEditor( <id entity> ), napríklad:
Auto.showEditor( 10 );
Chcem aby, ak už je otvorený editor pre Auto-10, tak aby sa len na tento editor nastavil fokus, inak aby sa vytvorilo nové okno.
Momentálne mám pre každú entitu samostatnú classu odvodenú priamo od javax.swing.JDialog, kde celú funkcionalitu prepisujem odznova. Chcel by som preto vytvoriť base class pre všetky entity, pričom by vedela spraviťminimálne .showEditor( id ), kde by prehľadala zoznam všetkých otvorených okien, a zistila či editor už existuje a tak mu nastavila fokus, a ak neexistuje, tak ho vytvorila.
Práve pri prehľadávaní zoznamu všetkých otvorených okien potrebujem porovnávať, či sa trieda otvoreného okna a trieda, nad ktorou je statická metóda showEditor volaná zhodujú. Okrem toho porovnávam id entity.
public abstract class Entity extends javax.swing.JDialog
{
final private static ArrayList<Entity> openedEntities = new ArrayList<Entity>();
protected Long id;
public void showEditor(Long ID)
{
for(Entity opened : openedEntities)
{
if (opened.getClass() == __AKTUALNA_TRIEDA__ && ID.equals(opened.id))
{
opened.requestFocus(); // entita je uz otvorena, staci jej dat focus
return;
}
}
// entita nie je otvorena, treba vytvorit novu
final Entity newEntity = __AKTUALNA_TRIEDA_.newInstance( ID );
openedEntities.add(newEntity);
newEntity.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent evt) {
openedEntities.remove(newEntity);
}
});
}
protected Entity(Long id)
{
this.id = id;
...
}
}
final public class Auto extends Entity
{
// JDialog predstavujuci editor entity Auto
..
}
final public class Servis extends Entity
{
// JDialog predstavujuci editor entity Servis
..
}
pre otvorenie/aktivovanie entit tak staci spravit:
Auto.showEditor(5); // otvori nove okno
Servis.showEditor(2); // otvori nove okno
Auto.showEditor(5); // aktivuje uz otvorene okno