Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    come si visualizza una stringa in un pannello

    Sto studiando da autodidatta e mi sono fermato davanti a questo problema che dovrebbe essere banale ma che io non riesco a risolvere.
    Ho una classe col metodo main che crea una finestra la quale crea un pannello e lo aggiunge. Fino a qui nessun problema. Poi ho un'altra classe che gestisce i numeri dell'estrazione e anche qui va tutto bene.(non l'ho inserita nel codice per semplificare)
    I guai iniziano quando, premendo il pulsante del pannello dovrei vedere i numeri (che poi sono stringhe) scritti sul pannello stesso ma in realtà non c'è niente.
    Datemi una mano perchè non risco a dormire
    Ecco qui il codice:
    codice:
    import javax.swing.*;
     import java.awt.*;
     import java.awt.event.*;
     import java.util.*;
     public class NumCas
     {
     	public static void main(String[]args)
     	{
     		Finestra finestra = new Finestra();
     		finestra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     		finestra.setVisible(true);
     	}
     }
     
    class Finestra extends JFrame
    {
    	public static final int LARGHEZZA = 400;
    	public static final int ALTEZZA = 300;
    	public Finestra()
    	{
    		this.setTitle("CasualNumber");
    		this.setSize(LARGHEZZA,ALTEZZA);
    				
    		Pannello pannello = new Pannello();
    		Container pannelloContenitore = this.getContentPane();
    		pannelloContenitore.add(pannello);
    	}
    }
    
    class Pannello extends JPanel
    {
    	private ArrayList<String>listaNumeri;
    
    	public Pannello()
    	{
    		listaNumeri = new ArrayList<String>();
    		JButton bottEstraiNumeri = new JButton("Estrai Numeri");
    		this.add(bottEstraiNumeri);
    		AzioneEstraiNumeri aEN = new AzioneEstraiNumeri();
    		bottEstraiNumeri.addActionListener(aEN);
    	}
    	public void paintComponent(Graphics g)
    	{
    		//NON RIESCO A CAPIRE PERCHE' NON VIENE SCRITTO NIENTE SULLA FINESTRA
    		super.paintComponent(g);
    		int x = 20;
    		int y = 100;
    		for(int i = 0; i < listaNumeri.size(); i++)
    		{
    			g.drawString(listaNumeri.get(i),x,y);
    			x+=20;//serve per scrivere il numero successivo più spostato rispetto al precedente
    		}
    	}
    	
    	private class AzioneEstraiNumeri implements ActionListener
    	{
    		public AzioneEstraiNumeri()
    		{
    		}
    		public void actionPerformed(ActionEvent e)
    		{
    			listaNumeri.add(5+"");//giusto per esempio
    			listaNumeri.add(6+"");//giusto per esempio
    		}
    	}
    }

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

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

    Re: come si visualizza una stringa in un pannello

    Originariamente inviato da miticogilles
    I guai iniziano quando, premendo il pulsante del pannello dovrei vedere i numeri (che poi sono stringhe) scritti sul pannello stesso ma in realtà non c'è niente.
    Se però ridimensioni la finestra ecco che li vedi.
    La questione è questa: solo perché hai modificato una struttura dati (aggiungendo elementi in quel ArrayList) che è un campo interno alla classe del pannello .... non vuol dire nulla su ciò che accade a video!! Non c'è alcun meccanismo per cui modificando una variabile o struttura dati allora Swing "sa" che in automatico deve ridisegnare "qualcosa".

    Se vuoi che avvenga qualcosa a video devi richiederlo tu. E per questo esiste repaint().

    codice:
    public void actionPerformed(ActionEvent e) {
        listaNumeri.add(5+"");//giusto per esempio
        listaNumeri.add(6+"");//giusto per esempio
        repaint();
    }
    Allora in questo caso viene richiesto il repaint del tuo componente. Una volta terminato il actionPerformed il framework in brevissimo tempo scoprirà che c'è stata una richiesta di repaint e inizierà la procedura di ridisegno, invocando poi ad un certo punto anche il tuo paintComponent() che fa parte del ciclo di disegno.

    Ed è così, in generale, che deve funzionare. Modifichi lo "stato" del tuo componente (sia dall'interno come nel tuo caso, sia dall'esterno tramite metodi "setter" o altri) e nel tuo componente usi una delle varianti di repaint per chiedere che avvenga un ridisegno.

    Due note finali:
    - Il paintComponent tienilo 'protected' ... non 'public'. Non c'è alcun motivo per averlo public!!
    - Generalmente non è una buona cosa usare un pannello (un "contenitore" detto in generale) per contenere componenti e fare del painting sul Graphics. Tipicamente o si usa un contenitore solo per contenere altri componenti o lo si usa solo per disegnarci sopra.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie per il consiglio... molto esauriente!!!! Se non ci foste voi!!!
    C'è però un problema: ho testato l'esempio e funziona ma non so per quale motivo mi appare un bottone disegnato a sinistra del pannello.


    Perchè??? Capita solo a me??

    In base a quanto mi hai detto sul repaint() ho provato a toglierlo da:
    codice:
    public void actionPerformed(ActionEvent e)
    		{
    			listaNumeri.add(5+"");
    			listaNumeri.add(6+"");
    			//repaint();
    		}
    e a metterlo come prima istruzione del metodo paintComponent così:
    codice:
    public void paintComponent(Graphics g)
    	{
    		repaint();
    		int x = 20;
    		int y = 100;
    		if(listaNumeri.size()>=1)
    		{
    			for(int i = 0; i < listaNumeri.size(); i++)
    			{
    				g.drawString(listaNumeri.get(i),x,y);
    				x+=20;
    			}
    		}
    	}
    e mi sono accorto che tutto funziona perfettamente!!!

    Avrei risolto il problema ma mi interesserebbe sapere per quale motivo succede ciò.
    Grazie!

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Il metodo repaint() va chiamato dove ti ha scritto andbin, non dal paintComponent stesso.

    Quando crei il JFrame, prima di richiamare il setVisible, dovresti chiamare il metodo pack() di JFrame.
    al volante son nervoso

  5. #5
    come funziona il metodo pack() di JFrame.
    Ho letto la doc ma non mi è chiara.
    Ho provato a mettere il metodo pack() prima di setVisible() ma il risultato è che adesso vedo una finestrella piccola contente il solo Bottone. Dalla documentazione mi sembra di capire che bisogna fare qualcosa con le dimensioni... ma non sò cosa e se ho capito giusto....
    Chiedo aiuto

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Dunque, il metodo pack() di JFrame "guarda" quello che la finestra deve contenere, ne calcola le dimensioni, la posizione, e decide la dimensione della finestra e di tutto quello che contiene.

    Vedi la finestra piccola perché il JPanel Pannello contiene solo quel pulsante.

    Potresti aggiungere il pulsante alla parte NORTH di JFrame (ha un BorderLayout di default, il suo ContentPane intendo) e un pannello dove disegni nella parte CENTER.
    Tale pannello deve "impostarsi" delle dimensioni, setPreferredsize, in modo che BorderLayout, che rispetta le dimensioni preferite dei componenti, te lo disegni come vuoi tu, almeno inizialmente.
    E questo JPanel lo potresti mettere in un JScrollPane, così da averlo con le barre di scorrimento.
    al volante son nervoso

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.