Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    82

    Come acccedere ad una classe annidata?

    sto costruendo una gui che diventerà relativamente complessa, per i miei canoni, cioè piena di tabelle, tasti, e simili

    così ho realizzato il programma in modo che la logica del sw sia in un file, la GUI sia descritta in un altro e vorrei ulteriormente separare la cosa mettendo tutti insieme in un unico file i molteplici gestori degli eventi (window, mouse, keyboard e action)

    per provare ho creato una classe statica Eventi nello stesso package 'lib' della GUI.
    questa contiene al suo interno una classe statica che fa da windowsadapter, giusto per ricevere il 'quit' tramite la X della finestra

    ecco il codice della classe eventi

    codice:
    package lib;
    
    static class Eventi {
    
      static class Finestra extends WindowAdapter {
        public void windowClosing ( WindowEvent evt) { 
          System.exit(0) ) ; 
        }
      }
    
    }
    sto cercando, nella classe GUI di agganciare l'adapter in questo modo

    codice:
       addWindowListener( new Eventi.Finestra() );
    ma il compilatore mi dice

    codice:
    .\lib\GUI.java:24: package Eventi does not exist
        addWindowListener( new Eventi.Finestra() );
    come faccio per 'accedere' ad una static inner class !?
    la classe gui è nello stesso package 'lib' della classe Eventi, ed è nella stessa cartella su disco, a scanso di equivoci

    EDIT: Sto cercando di replicare quanto letto in questo tutorial sun ufficiale sulle nested class

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Innanzitutto dovresti avere le idee un po' più chiare circa la gestione degli eventi.

    Tipicamente la gestione degli eventi è una cosa che va fatta in maniera molto "intima" con la classe (frame, pannello o altro che sia) che contiene i componenti "sorgente" di questi eventi.

    Mi spiego con un esempio: una classe XYZ che estende JPanel e che contiene diversi pulsanti. La gestione degli eventi relativi a questi pulsanti, tipicamente (e ripeto sempre "tipicamente" per stare sul generico) andrebbe fatta dentro la classe XYZ. Che poi sia implementata direttamente da XYZ (cioè XYZ che implementa UnQualcheListener) o con una nested-class o una "regular" inner-class o una "anonymous" inner-class o ancora (caso più strano e atipico) con una "local" inner-class ..... cambia poco dal punto di vista concettuale, è solo una scelta tecnica.

    Quindi non stare a cercare o inseguire chissà quale architettura pensando magari di "spostare" la gestione di tutti gli eventi in un'altra classe completamente slegata da quelle dove ci sono i componenti. Perché rischieresti solo di dover "esporre" troppo (più di quanto serva) i componenti o altri metodi.

    Piuttosto cerca di "incapsulare" e raggruppare meglio le cose a livello delle funzionalità. In Swing la principale abilità sta nel sapere sfruttare i layout manager "inscatolando" componenti dentro contenitori, eventualmente dentro altri contenitori, ecc...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    82
    ho ascoltato il tuo suggerimento, anche se sul libro avevo letto che i layout e la gestione degli eventi era meglio separarli,

    Mi chiedo come fare allorchè, effettivamente, diventerà una classe di grosse dimensioni

    volevo solo chiarirmi una cosa:

    è meglio avere una classe e creare le classi listener AL SUO INTERNO nello stesso file e proprio 'dentro' ad essa (inner class) oppure si crea nello stesso file la classe gui e SOTTO, al termine della classe ma nello stesso file, creare le classi listener !?

    mi interessa molto non 'incasinare' il codice, è per quello che volevo separare in un altro file la gestione degli eventi, ma se me lo sconsigli, accetto volentieri il suggerimento

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    82
    questo è il codice attuale, non chiedermi perchè uso un metodo a parte solo per fare il qui, ovviamente li dentro ci starà molto altro codice di verifica, salvataggio e poi la chiusura

    effettivamente il codice così si compila, ma quando avrò 30 menu diversi, che faranno trenta cose diverse, e una toolbar con 15 pulsanti che però useranno lo stesso codice dei menu, come faccio a rendere leggibile il codice ?!?!

    codice:
    package lib;
    
    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.*;
    
    public final class GUI 
      extends JFrame {
    
      // Elementi della GUI
      public JButton quit = new JButton("Quit");
      
      public GUI() {
        super("JContab v0.01 by Realtebo ");                                                                        
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setSize(300,300);
        setResizable(false);
        centra(this);   
        // Impostazione degli eventi
        quit.addActionListener( new MgrPulsanti() );       
        addWindowListener( new MgrFinestra() );
        // Posizionamento degli elementi della GUI
        JPanel panel = new JPanel();
        panel.add(quit);
        add(panel);
      }
      
      
      // ************************ UTILITY *********************************
      
      private static void centra(JFrame frame) { 
        java.awt.Dimension dimension = 
                java.awt.Toolkit.getDefaultToolkit().getScreenSize(); 
        int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2); 
        int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2); 
        frame.setLocation(x, y); 
      } 
    
      // ******************* CLASSI LISTENER ***************************
     
      class MgrFinestra extends WindowAdapter {
        public void windowClosing ( WindowEvent evt) {
          onQuit()  ; 
        }
      }
      
      class MgrPulsanti implements ActionListener {
      
        // Action demultiplexer  
        public void actionPerformed(ActionEvent evt) {
          onQuit();
        }
    
      }
      
      // ******************* METODI USATI DAGLI EVENTI ****************
      
      private void onQuit() {
        dispose();
        System.exit(0);  
      }
    
      
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.