Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di tapu
    Registrato dal
    May 2008
    Messaggi
    885

    consigli su implementazioni JButton, JLabel su JFrame

    ciao a tutti...
    vi richiedo consiglio sul da farsi.

    Dopo aver pensato alla logica del mio applicativo standalone mi sto lanciando a creare la grafica...

    ho letto un pò in giro su vari manualetti swing.

    io ho creato una finestra

    codice:
    public class Window extends JFrame {
    
    	public static final int LARGHEZZA = 800;
    	public static final int ALTEZZA = 600;
    	static JFrame window = new JFrame("Window");
    
            public Window() {}
    
            public static void startApplication (){
    		window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		window.setSize(400, 300);
    		window.setBackground(Color.blue);
    		window.setBounds(0, 0, LARGHEZZA, ALTEZZA);
    
                    // Conferma in fase di chiusura
    		window.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    		window.addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosing(WindowEvent e) {
    				int answer = JOptionPane.showConfirmDialog(e.getWindow(),
    						"Vuoi veramente chiudere la finestra?",
    						"Conferma chiusura", JOptionPane.YES_NO_OPTION);
    				if (answer == JOptionPane.YES_OPTION) {
    					e.getWindow().dispose();
    				}
    			}
    		});
                    //Carico il tasto
    window.getContentPane().add(TastiPrincipali.BottoniStart(),BorderLayout.WEST); 
    		window.setVisible(true);
    codice del segmento rosso
    codice:
    public class TastiPrincipali {
    
    	//istanzio degli oggetti
    	Prodotti prodotto = new Prodotti();
    	
    	public TastiPrincipali(){}
    
    	public static Component BottoniStart(){
    		/*Rudimentale scelta*/
    		JPanel panInsert = new JPanel();
    		JButton bottoneInsertProdotto = new JButton("Inserire Prodotto");
    		
    		
    		LayoutManager layoutInsert = new FlowLayout(FlowLayout.LEFT);
    		panInsert.setLayout(layoutInsert);
    		panInsert.add(bottoneInsertProdotto);
    		panInsert.add(bottoneInsertProdotto);
    		
    	    return panInsert;
            }
    }
    Quello che vi chiedo e se potete correggermi la logica se sbaglio.

    Nel primo pezzo di codice ho creato un Jframe, che sarà la finestra principale del mio applicativo.

    poi ho creato il tasto di conferma per l'uscita del programma(in realtà ho preso solo 'spunto').
    1- sarebbe meglio separare l'evento dell'uscita creando una classe apposta ?
    Ho notato che potrei creare una classe per ogni evento dove al suo interno ci stano i metodi di quel specifico evento.
    ne deduco che per ogni evento ci vorrà una classe corretto?

    nella sezione colorta in rosso faccio un richiamo all'oggetto "BottoniStart()" della classe TastiPrincipali che ritorna il componente JLabel.
    Vado a prendermi il componente e poi lo carico all'interno della mia finestra 'di lavoro'.

    1-Posso agganciare un evento qualsiasi all'oggetto che poi verra richiamato all'interno del JFrame principale?
    2-Se volessi potrei usare la stessa classe BottoniStart() (magari con un ciclo) per istanziare più bottoni?

    Scusate le domande che per chi ci lavora sono semplici .... ma ripeto, la logica non si acquisisce senza comunicazione

    Grazie, ciao

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: consigli su implementazioni JButton, JLabel su JFrame

    Originariamente inviato da tapu
    codice:
    public class Window extends JFrame {
    
    	public static final int LARGHEZZA = 800;
    	public static final int ALTEZZA = 600;
    	static JFrame window = new JFrame("Window");
    No, alt. Già qui ci sarebbe da discutere. Se la tua classe Windows è-un JFrame .... perché devi avere un campo (oltretutto statico!!) window con un altro nuovo JFrame??

    Istanzia ... il tuo Window.
    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 L'avatar di tapu
    Registrato dal
    May 2008
    Messaggi
    885
    Ok,

    Mi stai dicendo che avendo una classe che estende JFrame è altamente inutile avere un nuovo JFrame istanziato all'interno della stessa classe!



    Quindi mi stai anche consigliando di inserire tutto il JFrame con i suoi vari richiami nel costruttore
    public Window(){
    }
    al posto di avere un metodo startApplication(){}

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tapu
    Mi stai dicendo che avendo una classe che estende JFrame è altamente inutile avere un nuovo JFrame istanziato all'interno della stessa classe!

    Quindi mi stai anche consigliando di inserire tutto il JFrame con i suoi vari richiami nel costruttore
    codice:
    public class Window extends JFrame {
        // ......
    
        public Window() {
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            setSize(400, 300);
    
            // .......
        }
    
    ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di tapu
    Registrato dal
    May 2008
    Messaggi
    885
    ok,
    Era esattamente come avevo capito...
    però mi sorge un quesito, perchè è meglio mettere il tutto nel costruttore e non creare un metodo tipo startApplication()?

    e poi avevo pensato di mettere i metodi in static per non dover andare a creare una nuova istanza ogni volta...

    mi sembrava un'ideona

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tapu
    però mi sorge un quesito, perchè è meglio mettere il tutto nel costruttore e non creare un metodo tipo startApplication()?
    Nessuno ti vieta di avere un metodo del genere. Ma a questo punto il "ciclo di vita" dell'oggetto diventa specifico, tuo. Mentre il costruttore è un qualcosa di ben chiaro e noto: serve per "costruire" l'oggetto e quindi è il posto più logico e pulito per fare le inizializzazioni che servono.

    Originariamente inviato da tapu
    e poi avevo pensato di mettere i metodi in static per non dover andare a creare una nuova istanza ogni volta...

    mi sembrava un'ideona
    No.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di tapu
    Registrato dal
    May 2008
    Messaggi
    885
    heheheheh

    ti ringrazio, i tuoi suggerimenti sono stati chiari (sopratutto in NO secco)

    quindi, ogni volta che vorro creare un bottone con eventi o altri JPanel mi basterà creare l'istanza dell'oggetto Evento() e poi tramite il puntatore richiamare il mio metodo ... , dopo di chè gli darò la posizione all'interno del costruttore Window()...

    Gentile e conciso

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tapu
    ogni volta che vorro creare un bottone con eventi o altri JPanel mi basterà creare l'istanza dell'oggetto Evento() e poi tramite il puntatore richiamare il mio metodo ... , dopo di chè gli darò la posizione all'interno del costruttore Window()...
    Che vuol dire? Detto così non è molto chiaro ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it L'avatar di tapu
    Registrato dal
    May 2008
    Messaggi
    885
    io ho il costruttore di Window cosi:
    codice:
    public window(){
           setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    	setSize(400, 300);
    	setBackground(Color.blue);
    	setBounds(0, 0, LARGHEZZA, ALTEZZA);
            //....
            getContentPane().add(tastiDefault.BottoniStart() , BorderLayout.WEST);
    	setVisible(true);
    }
    ora ogni volta che vorrò un qualcosa mi basterà istanziare la classe e tramite il puntatore richiamare il metodo.
    codice:
    tastiDefault.BottoniStart()//Questo si trova in una classe TastiPrincipali (fatto Tastiprincipali = new TastiPrincipali();) all'inizio della classe
    il main conterrà solo l'istanza di Window.

    fin qui penso di aver capito ... anche se a "tastiera" mi esprimo con i "piedi"

    Ma se io volessi creare degli eventi a dei tasti, devo creare un metodo per ogni tasto e una classe per ogni evento(se diversi un dall'altro)?

  10. #10
    Utente di HTML.it L'avatar di tapu
    Registrato dal
    May 2008
    Messaggi
    885
    ciao.

    io ho un main
    codice:
    public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				Window win = new Window();
    			}
    		});
    }
    che carica il mio frame principale che si trova nella classe Window
    codice:
     public class Window extends JFrame {
    
    	public static final int LARGHEZZA = 800;
    	public static final int ALTEZZA = 600;
    	
    	public Window() {
    		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		setSize(400, 300);
    		setBackground(Color.blue);
    		setBounds(0, 0, LARGHEZZA, ALTEZZA);
                   setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    		addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosing(WindowEvent e) {
    				int answer = JOptionPane.showConfirmDialog(e.getWindow(),
    						"Vuoi veramente chiudere la finestra?",
    						"Conferma chiusura", JOptionPane.YES_NO_OPTION);
    				if (answer == JOptionPane.YES_OPTION) {
    					e.getWindow().dispose();
    				}
    			}
    		});
    TastiPrincipali visualizza = new TastiPrincipali(); 		add(visualizza.VistaProdotti()); 
    		setVisible(true);
    	}
    questa mostra solo un frame vuoto con un evento in fase di chiusura, ossia chiede conferma
    Poi ho creato un oggetto (TastiPrincipali) dove saranno presenti tutti i bottoni

    codice:
    public class TastiPrincipali {
    
    	//istanzio degli oggetti
    	Prodotti prodotto = new Prodotti();
    	
    	JPanel pannello = new JPanel();
    	JButton bottoneInsertProdotto = new JButton("Inserire Prodotto");
    	JButton bottoneVistaProdotto = new JButton("Vista Prodotto");
    	
    	public TastiPrincipali(){}
            
            public Component VistaProdotti(){
    		LayoutManager layoutInsert = new FlowLayout(FlowLayout.LEFT);
    		pannello.setLayout(layoutInsert);
    		pannello.add(bottoneVistaProdotto);
    		return pannello;
    	}
    	
    }
    il metodo restituisce un Component che non è altro che un bottone all'interno di un contenitore JPanel

    il mio problema è che alla pressione di questo tasto vorrei creare una tabella dinamica.
    solo che questa tabella vorrei che stesse in una classe (tipo Tabella) e passandogli un arrayList mi crei righe e colonne.

    Riesco a creare un nuovo JFrame con la tabella Statica, ma solo se la carico all'interno di questo tasto...
    non capisco come posso far tornare a Window la mia tabella...

    qualche consiglio?

    mi conviene creare l'evento all'interno del metodo VistaProdotti?
    grazie!

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.