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

    Sostituire JPanel dinamicamente

    Ciao a tutti
    Sto facendo una semplice interfaccia Java


    Ho fatto diverse classi che estendono JPanel una per ogni funzionalità dell'applicazione
    Vorrei cambiare dinamicamente il pannello in cui sta scritto "Seleziona un'operazione da effettuare" inserendo un oggetto appropriato a quella funzione. Ad esempio se si clicca su Visualizza Posizione Corrente vorrei sostituire al pannello funzione (quello che contiene la scritta seleziona operazione) un pannello di tipo VisualizzaPosizioneCorrente

    Il bottone 1 "Visualizza Posizione Corrente" è creato come segue:
    codice:
    Button button= new Button("Visualizza Posizione Corrente");
    		button.addActionListener(new Ascoltatore());
    		button.setActionCommand("1");
    		menu.add(button); //menu è il pannello che contiene i bottoni
    Se si preme il bottone 1 si attiva questo action listener
    codice:
    public class Ascoltatore implements ActionListener
    	{
    	public void actionPerformed(ActionEvent e) {
    		int j = Integer.parseInt(e.getActionCommand());
    
    			
    		switch(j){
    		
    		case 1: funzione=new VisualizzaPosizioneCorrente();
    		        break;
    		case 2:
    		case 3:
    		
    		
    		}
    
    		}
    	}
    La classe VisualizzaPosizioneCorrente è la seguente:
    codice:
    public class VisualizzaPosizioneCorrente extends JPanel {
    
    	Label lat=new Label("Latitudine:10");
    	Label lon=new Label("Longitudine:50");
    	public VisualizzaPosizioneCorrente() {
    		
    		
    		setSize(400, 400);
    		setLayout(new GridLayout(6,1));		
    		Label titoloFunz1=new Label("Posizione attuale dell'utente Utente 10");
    		this.add(titoloFunz1);	
    		this.add(lat);
    		this.add(lon);
    
    	}
    
    }
    Ora, se premo il pulsante non succede niente VVoVe: VVoVe:
    So che magari alcuni di voi mi potrebbero suggerire di inserire il codice di tutti i pannelli nella classe della JFrame e cambiarli con l'invisibilità, ma non posso che fare così con diverse classi poichè l'applicazione deve essere modulare (una classe per ogni funzione)

    Qualche suggerimento?
    Grazie mille

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

    Re: Sostituire JPanel dinamicamente

    Originariamente inviato da Andrechan
    Ora, se premo il pulsante non succede niente
    Quando in una certa area si vuole poter mostrare solo 1 al massimo tra N componenti ci sono svariate possibilità:

    a) Usare un CardLayout. Si crea un componente (generalmente un pannello JPanel) con il CardLayout e si inseriscono tutti i componenti dentro. Poi di volta in volta si seleziona il componente desiderato con show() di CardLayout. Altre info qui sul tutorial della Sun.

    b) Usare il componente JTabbedPane (il classico blocchetto con le "linguette"). Altre info qui sul tutorial della Sun.

    c) Soluzione "fai-da-te". Si rimuove il vecchio componente dal "contenitore" e se ne aggiunge un altro (questo comporta il doversi tenere il riferimento al componente corrente). E c'è da tenere presente che quando si aggiungono/rimuovono componenti in un contenitore già visibile, il layout va nuovamente "validato". Generalmente basta un validate() sul contenitore ma dipende anche dal layout manager (se non si usa un layout manager basta repaint() ).

    Sia per la soluzione a) che c) cosa mostrare e gestire per cambiare il componente è assolutamente a discrezione del programmatore (pulsanti, combo-box, voci di menù ... altro).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie, credo che proverò il Card Layout

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.