Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    49

    Problema javabean con jpanel

    Ciao sono nuovo del forum e avrei bisogno, se possibile di un aiuto.
    Sto realizzando su linux con eclipse un progetto per una gui in java. Ho creato una classe che estende il jpanel, all'interno ci sono 4 bottoni e una textarea. Quando compilo vengono generati non solo il file class normale ma ne vengono creati altri 5 con nomeclasse$i.class con i ke va da 1 a 5. Riesco ad eseguire il tutto solo da eclipse dando run as javabean perchè se provo con java nomeclass chiaramente mi da errore perchè manca il main. Come faccio ad eseguirlo da shell?

    Secondo problema: dopo avere fatto una serie di iterazioni voglio che siano eliminati dal pannello i bottoni e inizi a disegnare un istogramma: avevo pensato a richiamare dal bottone attraverso i suoi eventi una funzione che tramite un oggetto graphics mi disegni il tutto: il problema è ke lo disegna ma se sposto la finestra o ne modifico le caratteristiche mi cancella ciò che c'era disegnato. come potrei fare? Scusate per la lunghezza delle richieste. vi ringrazio in anticipo ciao

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

    Re: Problema javabean con jpanel

    Originariamente inviato da xela86
    Ho creato una classe che estende il jpanel, all'interno ci sono 4 bottoni e una textarea.
    La classe che estende JPanel però da sola non serve a molto. Devi comunque metterla in un JFrame o JDialog.

    Originariamente inviato da xela86
    Quando compilo vengono generati non solo il file class normale ma ne vengono creati altri 5 con nomeclasse$i.class con i ke va da 1 a 5.
    Sono delle "anonymous class", presumo per via della implementazione di vari listener.

    Originariamente inviato da xela86
    Riesco ad eseguire il tutto solo da eclipse dando run as javabean perchè se provo con java nomeclass chiaramente mi da errore perchè manca il main. Come faccio ad eseguirlo da shell?
    Ma hai una classe che ha il main() e che si preoccupa di creare la interfaccia grafica?? (in genere è bene farlo nel contesto del EDT)

    Originariamente inviato da xela86
    tramite un oggetto graphics mi disegni il tutto: il problema è ke lo disegna ma se sposto la finestra o ne modifico le caratteristiche mi cancella ciò che c'era disegnato. come potrei fare?
    Quasi sicuramente non hai gestito il painting in modo corretto. Bisognerebbe vedere il codice.
    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
    May 2008
    Messaggi
    49
    Allora siccome non sono pratico della programmazione di gui mi sono aiutato tramite il jformdesigner che mi ha autogenerato il codice per inserire i vari bottoni e generare il layout, quindi poi aggiungo io quello che mi serve. Non ha generato il main, il che effettivamente potrebbe essere molto strano, però vedo che con eclipse dando run as javabean esegue il tutto. Infatti un mio problema sarebbe quello di riuscire ad eseguire il tutto tramite il comando java che chiaramente mi da errore perchè non trova la definizione del main.

    Aggiungo per sommi capi il codice
    codice:
    public class panne extends JPanel {
    	public static final int NUMEL = 10;
    
    	public panne() {
    		initComponents();
    		
    					}
    	//abbozzo della funzione di disegno
    	public void disegna(Graphics g){
    		g.drawRect(x, y, width, height);
    	}
    	
    	private void button1MouseClicked(MouseEvent e) {
    		if (counter < NUMEL - 1) {
                                //faccio alcune cose semplici su classi mie e incremento il contatore
    						}
    		else{
    			textField1.setVisible(false);
    			button1.setVisible(false);
    			this.remove(textField1);
    			//qui vorrei chiamare la funzione che mi disegni una sorta di istogramma 
                           //pensando di farla così
    			disegna(this.getGraphics());
    	}}
    
    	private void initComponents() {
    		textField1 = new JTextField();
    		button1 = new JButton();
    		//inizializzo le varie classi mie
    		
    		setBorder(new javax.swing.border.CompoundBorder(
    				new javax.swing.border.TitledBorder(
    						new javax.swing.border.EmptyBorder(0, 0, 0, 0),
    						"Prova",
    						javax.swing.border.TitledBorder.CENTER,
    						javax.swing.border.TitledBorder.BOTTOM,
    						new java.awt.Font("Dialog", java.awt.Font.BOLD, 12),
    						java.awt.Color.red), getBorder()));
    
    		addPropertyChangeListener(new java.beans.PropertyChangeListener() {
    			public void propertyChange(java.beans.PropertyChangeEvent e) {
    				if ("border".equals(e.getPropertyName()))
    					throw new RuntimeException();
    			}
    		});
    
    		setLayout(null);
    
    		// ---- textField1 ----
    		textField1.setFont(new Font("SansSerif", Font.BOLD, 16));
    		textField1.setForeground(Color.blue);
    		add(textField1);
    		textField1
    				.setBounds(85, 185, 310, textField1.getPreferredSize().height);
    
    		// ---- button1 ----
    		button1.setText("Bottone1");
    		button1.setBackground(new Color(51, 51, 255));
    		button1.setForeground(Color.white);
    		button1.setFont(new Font("SansSerif", Font.PLAIN, 16));
    		button1.addMouseListener(new MouseAdapter() {
    
    			public void mouseClicked(MouseEvent e) {
    				button1MouseClicked(e);
    			}
    		});
    		add(button1);
    		button1.setBounds(565, 50, 225, button1.getPreferredSize().height);
    
    		}
    	
    	private JTextField textField1;
    	private JButton button1;
    	
    }
    Quello che succede è che una volta disegnato non appena muovo la finestra e la ridimensiono il disegno scompare, probabilmente non sto usando la modalità corretta di disegno. Comunque può andare eventualmente un uso così del singolo JPanel?
    Cmq grazie anticipatamente. Ciao

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da xela86
    Allora siccome non sono pratico della programmazione di gui mi sono aiutato tramite il jformdesigner che mi ha autogenerato il codice per inserire i vari bottoni e generare il layout
    Male .... il solito codice prolisso e penoso generato in automatico.
    Sarebbe molto meglio imparare bene l'uso dei componenti e dei layout manager, piuttosto che "farsi fare" del codice così, di cui magari può anche darsi che non lo comprendi appieno.

    Originariamente inviato da xela86
    Non ha generato il main, il che effettivamente potrebbe essere molto strano
    Non so che dirti .... un main() ci vuole per lanciare una applicazione Java. Se l'ambiente che usi fa i suoi "truschini" per avviare comunque una applicazione, sappi che quella non è la strada generale e corretta.

    Originariamente inviato da xela86
    Quello che succede è che una volta disegnato non appena muovo la finestra e la ridimensiono il disegno scompare, probabilmente non sto usando la modalità corretta di disegno.
    Infatti non è l'approccio corretto. Perché stai disegnando "al volo". Prendi il Graphics (con getGraphics) e disegni immediatamente quello che ti serve. Ma poi sparisce, perché non rimane un "contesto" di ciò che hai disegnato.

    Le interfacce utente AWT/Swing (come molte altre) sono gestite ad "eventi". Non sei tu che stabilisci sempre quando disegnare. Ma è il sistema/framework. Quindi devi disegnare solo quando il framework ti dice: "ok componente ... ora devi disegnarti!".
    È quindi necessario fare l'override di un certo metodo per poter disegnare quando è necessario.

    Vedi un mio esempio di painting in un panel in questo mio post.

    E vedi anche: Lesson: Performing Custom Painting

    Originariamente inviato da xela86
    Comunque può andare eventualmente un uso così del singolo JPanel?
    Probabilmente no, visto che nel pannello hai anche (almeno per un certo periodo di tempo) dei componenti. Quindi non è, almeno secondo la mia opinione, una buona cosa mischiare painting e componenti, anche se tecnicamente sarebbe fattibile con i dovuti accorgimenti.
    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
    May 2008
    Messaggi
    49
    ok grazie ma comunque non è che avevo intenzione di conoscere la programmazione di gui, era solo per realizzare un qualcosa che mi serviva in modo veloce, ecco perchè mi sono affidato al programma.

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    49
    Ho modificato quello che stavo realizzando in modo da ottenere il main; ora il problema nasce dal fatto che ho un frame all'interno del quale c'è un panel che contiene i vari bottoni. Io vorrei far si che dopo un tot di clic, io possa eliminare il pannello dei bottoni per aggiungere un altro pannello nel quale effettuare l'istogramma attraverso l'oggetto Graphics. Posto un riassunto del codice

    codice:
    public class Pannello {
        
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
        
        private static void createAndShowGUI() {
            JFrame f = new JFrame("Prova");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(1000,600);
            f.setVisible(true);
            MyPanel m = new MyPanel();
            f.add(m);
         					}
        }
    
    
    class MyPanel extends JPanel{
    	public MyPanel() {
            setBorder(BorderFactory.createLineBorder(Color.BLUE));
            inizializzaoggetti();
            setLayout(null);
            add(button1);
            button1.setBounds(565, 50, 225, button1.getPreferredSize().height);
            textField1.setText(parole[counter].getNome());		
            button1.addMouseListener(new MouseAdapter() {
    
    			public void mouseClicked(MouseEvent e) {
    				button1MouseClicked(e);
    			}
    		});
    
         }
    
        public Dimension getPreferredSize() {
            return new Dimension(250,200);
        									}
        
        private void button1MouseClicked(MouseEvent e) {
    		if (counter < NUMEL - 1) {
    			//faccio alcune cose su classi
    						}
    		else{
         		//qui vorrei far si che possa generare l'istogramma penso aggiungendo al frame il pannello opportuno
    	}}
    
    
      
        private void inizializzaoggetti(){
        	
        	//bottone1
        	button1 = new JButton();
        	button1.setText("Bottone1");
    	button1.setBackground(new Color(51, 51, 255));
    	button1.setForeground(Color.white);
    	button1.setFont(new Font("SansSerif", Font.PLAIN, 16));
    
    	//text field
    	textField1 = new JTextField();
    	textField1.setFont(new Font("SansSerif", Font.BOLD, 16));
    	textField1.setForeground(Color.blue);
    	textField1.setBounds(85, 185, 310, textField1.getPreferredSize().height);
        								}
            
          private JTextField textField1;
     	private JButton button1;
    							}
    
    class Istogramma extends JPanel{
    	public void paint(Graphics gr){
    		//è in questo pannello che voglio realizzare l'istogramma
    						}
              				}


    grazie in anticipo per eventuali aiuti ciao

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    In generale, se si vuole aggiungere/rimuovere componenti in un "container" basta usare i soliti add()/remove() sul container. Avendo però cura che se il container è già visibile, il layout va rivalidato.

    Ecco un esempio:
    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class TestFrame extends JFrame
    {
        private Container contentPane;
        private JButton button;
        private int counter;
    
        public TestFrame ()
        {
            super ("Test");
            setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
            setSize (200, 200);
    
            contentPane = getContentPane();
            button = new JButton ("Prova");
            contentPane.add (button);
    
            button.addActionListener (new ActionListener ()
            {
                public void actionPerformed (ActionEvent e)
                {
                    if (++counter == 3)
                    {
                        contentPane.remove (button);
    
                        JPanel panel = new JPanel ();
                        panel.setBackground (Color.RED);
    
                        contentPane.add (panel);
                        contentPane.validate ();
                    }
                }
            });
        }
    
        public static void main (String[] args)
        {
            SwingUtilities.invokeLater (new Runnable ()
            {
                public void run ()
                {
                    TestFrame f = new TestFrame ();
                    f.setVisible (true);
                }
            });
        }
    }
    Clicca per 3 volte sul pulsante, poi viene rimosso il pulsante e al suo posto apparirà un JPanel rosso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    49
    ok. il problema mio nasce dal fatto che la rimozione ed aggiunta di un nuovo pannello la dovrei richiamare all'interno dell'handler dell'evento del bottone che è nel jpanel interno al frame. in sostanza dovrei dopo un tot di clic togliere dal frame il pannello che contiene il bottone, e aggiungere nel frame il pannello nuovo.

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da xela86
    ok. il problema mio nasce dal fatto che la rimozione ed aggiunta di un nuovo pannello la dovrei richiamare all'interno dell'handler dell'evento del bottone che è nel jpanel interno al frame. in sostanza dovrei dopo un tot di clic togliere dal frame il pannello che contiene il bottone, e aggiungere nel frame il pannello nuovo.
    Ok ma è praticamente quasi come l'esempio che ho postato io!!!!
    La piccola differenza è che nel mio esempio il pulsante l'ho aggiunto direttamente nel content pane mentre da quanto dici, tu nel content pane hai un jpanel al cui interno c'è il pulsante. Nel mio esempio rimuovo il pulsante, nel tuo caso rimuoveresti il jpanel che contiene il pulsante.

    Ma il concetto non cambia!!
    Nel mio esempio e nella mia descrizione sopra ho ben spiegato ed evidenziato che non ci sono particolari problemi a togliere/aggiungere componenti ad un container. È una cosa perfettamente fattibile tramite i metodi add()/remove(). Purché se il container è già visibile prima delle modifiche, si ha cura poi di validare nuovamente il container che è stato modificato.

    Tutto qua. Ripeto ancora una volta che il concetto è solo questo. Poi cosa aggiungi o rimuovi sono questioni tue.

    Se provi il mio esempio sopra, funziona perfettamente. Ma prova a togliere il contentPane.validate() e vedrai che succede una cosa molto strana. Al terzo click "sembra" che il pulsante esista ancora perché c'è ancora il suo disegno mentre il nuovo pannello rosso non è ancora visibile. Ma se provi a ridimensionare la finestra, allora ecco che compare il pannello rosso. Insomma ... il layout non è stato aggiornato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    49
    ho capito quello che spieghi, solo che ho pure capito qual è il mio problema. per potere disporre in maniera opportuna gli oggetti e settare le giuste dimensioni faccio una chiamata alla setLayout(null) del frame, ma così facendo si blocca al momento in cui dovrei eliminare il bottone e non va avanti. se però non chiamo questa setLayout non riesco ad ottenere il layout che voglio

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.