Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [JAVA]gestione eventi

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136

    [JAVA]gestione eventi

    Salve,
    sto imparando l'interfaccia grafica e la gestione degli eventi.Prendendo spunto da un esempio sul libro ho provato a programmare un frame con tre bottoni ognuno dei quali all'atto del click dovrebbe visualizzare una stringa a secondo del bottone cliccato ma ciò non accade o meglio accade nel modo sbagliato.

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class ButtonTest{
    	public static void main(String[] args){
    		ButtonFrame frame = new ButtonFrame();
    		//frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
    }
    
    class ButtonFrame extends JFrame{
    	public ButtonFrame(){
    		setTitle("Button Test"); 
    		setSize(DEF_W,DEF_H);
    		setVisible(true);
    
    		//aggiungi panello al frame
    		ButtonPanel panel = new ButtonPanel();
    		//Container contentPane = getContentPane();
    		//contentPane.
    		add(panel);
    		WindowListener term = new Terminator();
    	        
    		this.addWindowListener(term);
    
    	}
    	private class Terminator extends WindowAdapter{
    		public void windowClosing(WindowEvent event){
    			System.out.println("Chiudo programma");
    			System.exit(0);
    		}
    	}
    
    	public static final int DEF_W = 300;
    	public static final int DEF_H = 200;
    }
    /** 
      Panello con tre pulsanti 
     **/
    class ButtonPanel extends JPanel{
    	public ButtonPanel(){
    		//crea pulsanti
    		makeButton("Yellow","YELLOW BUTTON");
    		makeButton("Red","RED BUTTON");
    		makeButton("Blue","BLUE BUTTON");
    	}
    	public void makeButton(String name,final String string){
    		JButton button = new JButton(name);
    		add(button);
    		button.addActionListener(new ActionListener(){
    				public void actionPerformed(ActionEvent event){
    				JLabel label=new JLabel(string);
    				label.setLocation(75,100);
    				add(label);
    				System.out.println("sono qui");
    				}
    				});
    	}
    
    }
    Compilato ed eseguito le stringhe sono visibile solo se ridimensiono il frame dopo aver cliccato sul bottone.Dove sbaglio?Saluti.

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

    Re: [JAVA]gestione eventi

    Originariamente inviato da and77
    Compilato ed eseguito le stringhe sono visibile solo se ridimensiono il frame dopo aver cliccato sul bottone.Dove sbaglio?
    Il punto è che con la add(label) nel actionPerformed tu vai a modificare (aggiungendo un componente) il "contenitore" (che è la istanza del ButtonPanel) dopo che il contenitore è già visibile.

    E visto che viene usato un layout manager (quello di default di JPanel che è FlowLayout), bisogna ri-validare il layout. Basta che dopo la add metti un validate();


    P.S. Posta il codice tra i tag CODE
    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 desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Innanzitutto, come da regolamento quando posti del codice utilizza gli appositi tag "CODE" (trovi il pulsante corrispondente nella toolbar dell'editor di un nuovo post): lo rende più leggibile e diventa più facile aiutarti.

    I problemi che riscontri derivano dal fatto che non aggiorni esplicitamente il layout.
    Dopo aver aggiunto la nuova label (via add(label) ) invoca:

    codice:
    revalidate();
    repaint();
    (in realtà la prima istruzione potrebbe essere sufficiente).

    Ti segnalo inoltre che, sempre per gli stessi motivi di aggiornamento, l'istruzione setVisible(true) dovrebbe essere eseguita solo al completamento delle operazioni di costruzione del JFrame: nel tuo caso, come ultima istruzione del costruttore.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da desa
    codice:
    revalidate();
    repaint();
    (in realtà la prima istruzione potrebbe essere sufficiente).
    Infatti il repaint() in questo caso non serve. Il revalidate() tecnicamente funziona ma fa "di più" (riguarda il primo "validateRoot" che trova andando in sù nella gerarchia di contenimento e che, se trovato, ri-valida lui e tutti i discendenti).

    In questo caso ripeto che basta validate().
    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
    Registrato dal
    Dec 2007
    Messaggi
    136
    Ok,
    perfetti come al solito.Rimane ancora un piccolo problema.Come faccio a far comparire una singola stringa alla volta?In questo caso ogni volta che schiaccio un pulsante le varie stringhe si accodano comparendo tutte.Vi ringrazio per questo ulteriore consiglio.


    P.S.dove posso trovare info?
    P.P.S. ho usato il tag [CODE] ma nell'anteprima la situazione sembrava peggiore.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da and77
    Come faccio a far comparire una singola stringa alla volta?In questo caso ogni volta che schiaccio un pulsante le varie stringhe si accodano comparendo tutte.
    Allora devi cambiare proprio approccio!

    Almeno 2 le soluzioni: crei e aggiungi all'inizio (quando aggiungi i pulsanti) un unico JLabel e poi ti limiti solamente a cambiarne il testo di volta in volta con setText() (e non c'è bisogno di altro, nemmeno validate).

    Oppure aggiungi fisicamente la label come hai fatto ma devi tenerne il reference da qualche parte, così prima di aggiungerne un'altra vai a rimuovere dal contenitore quella precedente. Qui continua ad essere necessario il validate() visto che aggiungi e oltretutto rimuovi.

    Originariamente inviato da and77
    P.S.dove posso trovare info?
    Su queste questioni dei layout manager? Sul tutorial Sun ufficiale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da and77
    P.P.S. ho usato il tag [CODE] ma nell'anteprima la situazione sembrava peggiore.
    L'anteprima non tiene conto delle formattazioni del codice.
    Posta sempre usando i tag CODE, come espressamente richiesto dal regolamento interno.

    Sistemo io il tuo post (così puoi osservare che, in realtà, si legge meglio).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.