E' possibile far aprire più pannelli all'interno di una form?
E' possibile far aprire più pannelli all'interno di una form?
Giuseppe SPECCHIO
in che linguaggio???
è una domanda un po vaga...cmq in java si, basta aggiungere più pannelli ad un frame e gestirli con i metodi setvisible()
il linguaggio non l'ho speicificato poiché mi sembrava superfluo essendo nel forum di Java! Comunque la mia questione fa riferimento all'uso di un JButton che in base al valore scelto in una casella di scelta multipla mi deve aprire un pannello:
nell'ActionListener di generaButton vorrei far aprire il pannello associato al valore di faceCombo.getSelectedItem()codice://aggiunge un pannello al frame contentPane = getContentPane(); //*** pannello Menu menuPanel mpanel = new menuPanel(); //menu algoritmi faceCombo = new JComboBox(); faceCombo.addItem("Gabriel Network"); faceCombo.addItem("Relative Neighborhood Network"); faceCombo.addItem("Clump Network"); faceCombo.addItem("Minimun Spanning Tree"); mpanel.add(faceCombo); //etichetta numero nodi mpanel.add(new JLabel("Numero Nodi:", SwingConstants.RIGHT)); //campo numero nodi nNodeField = new IntTextField(nNode,3); mpanel.add(nNodeField); [...] //crea pulsante JButton generaButton = new JButton("Genera"); //associa un evento al bottone generaButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event){ System.out.println("***DEBUG hai scelto "+ faceCombo.getSelectedItem() ); if(faceCombo.getSelectedItem()=="Gabriel Network"){ ggpanel = new ggPanel(HEIGHT, WIDTH, nNode, v); contentPane.add(ggpanel, BorderLayout.CENTER); } System.out.println("***DEBUG hai inserito "+ nNodeField.getValue() +" nodi."); }//actionPerformed });//ActionListener //aggiunge il pulsante al pannello mpanel.add(generaButton); //inserisce il pannello del menu a nord del frame contentPane.add(mpanel, BorderLayout.NORTH);
Giuseppe SPECCHIO
come ti ho detto una soluzione potrebbe essere creare tutti i pannelli che ti servono, metterli uno sopra l'altro e poi visualizzare solo quello che serve con il metodo nomePannello.setVisible(true). Gli altri pannelli dovrai nasconderli con il metodo nomePannello.setvisible(false).
Ho provato a modificare la gestione dell'evento nella seguente maniera:
Ma mi visualizza solo il grafo del Minimum Spanning Tree mentre se seleziono un altro grafo dall'elenco non mi visualizza nulla.codice://crea pulsante JButton generaButton = new JButton("Genera"); ggpanel = new ggPanel(HEIGHT, WIDTH, nNode, v); ggpanel.setVisible(true); contentPane.add(ggpanel, BorderLayout.CENTER); rngpanel = new rngPanel(HEIGHT, WIDTH, nNode, v); rngpanel.setVisible(true); contentPane.add(rngpanel, BorderLayout.CENTER); clumppanel = new clumpPanel(HEIGHT, WIDTH, nNode, v); clumppanel.setVisible(true); contentPane.add(clumppanel, BorderLayout.CENTER); mstapanel = new mstaPanel(HEIGHT, WIDTH, nNode, v); mstapanel.setVisible(true); contentPane.add(mstapanel, BorderLayout.CENTER); //associa un evento al bottone generaButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event){ System.out.println("***DEBUG hai scelto "+ faceCombo.getSelectedItem() ); if(faceCombo.getSelectedItem()=="Gabriel Network"){ rngpanel.setVisible(false); clumppanel.setVisible(false); mstapanel.setVisible(false); ggpanel.setVisible(true); } if(faceCombo.getSelectedItem()=="Relative Neighborhood Network"){ ggpanel.setVisible(false); clumppanel.setVisible(false); mstapanel.setVisible(false); rngpanel.setVisible(true); } if(faceCombo.getSelectedItem()=="Clump Network"){ ggpanel.setVisible(false); rngpanel.setVisible(false); mstapanel.setVisible(false); clumppanel.setVisible(true); } if(faceCombo.getSelectedItem()=="Minimun Spanning Tree"){ ggpanel.setVisible(false); rngpanel.setVisible(false); clumppanel.setVisible(false); mstapanel.setVisible(true); } System.out.println("***DEBUG hai inserito "+ nNodeField.getValue() +" nodi."); }//actionPerformed });//ActionListener![]()
Giuseppe SPECCHIO
il border layout nn penso sia quello più adatto, o setti il layout a null, crei una pannello contenitore e ci sbatti dentro tutti i pannelli, o il CardLayout
che ti permette di mettere gli el uno sopra l'altro e di visualizzarne solo uno alla volta...
Ho risolto in parte il problema con il JTabbedPane, in quanto riesco a far visualizzare tutti i grafi con una singola istanza, però ciò avviene sono quando avvio il programma con i valori di default.
Ora vorrei farli cambiare in base ai valori inseriti nel pannello del menù, per fare ciò credo che debba gestire l'avento sul JButton Genera. Io ho cercato di definire le seguenti regole:
ma quando vado a compilare mi viene visualizzato il seguente messaggio di errore:codice://crea pulsante JButton generaButton = new JButton("Genera"); //associa un evento al bottone generaButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event){ int k; System.out.println("***DEBUG hai inserito:\n"+ "minP = " + minPField.getValue() + "\n" + "maxP = " + maxPField.getValue() + "\n" + "minV = " + minVField.getValue() + "\n" + "maxV = " + maxVField.getValue() + "\n" + "Nodi = " + nNodeField.getValue() ); //creo l'area di simulazione arena = new SimulationArena((alt-100), (lun-100)); for(k=0; k<nNodeField.getValue(); k++){ n = new RWMHost(k, minPField.getValue(), maxPField.getValue(), minVField.getValue(), maxVField.getValue()); n.setId(); if(k==0) n.setStato(true); arena.addNode(n); //inserisce un oggetto nella lista }//for k //avvio la simulazione per 10 sec arena.startSimulation(10000); //acquisico la sequenza di nodi nodes = arena.getNodes(); //fermo la simulazione arena.stopSimulation(); for(k=0; k<nodes.length; k++){ //inserisce un oggetto nella lista v.add(nodes[k]); }//for k }//actionPerformed });//ActionListener //aggiunge il pulsante al pannello mpanel.add(generaButton);
Che vuol dire che la variabile deve essere definita final?codice:C:\Documents and Settings\Giuseppe\Documenti\Java Source\it\specchio\mra\JTabbedPane2.java:145: local variable v is accessed from within inner class; needs to be declared final v.add(nodes[k]); ^ 1 error Compilation interrupted
L'ho fatto ma il problema si ripresenta! Inoltre si consideri che il Vector v l'ho instanziato tra le variabili di classe.
Giuseppe SPECCHIO
è un problema con la classe inner, la variabile deve essere final
From the JLS (§8.1.2):
"Any local variable, formal method parameter or exception handler parameter
used but not declared in an inner class must be declared final, and must be
definitely assigned (§16) before the body of the inner class."
When using local inner classes, any variables local to the method that are accessed from within the inner class must be declared final.
ok ricevuto il messaggio:
ma la risposta è sempre la stessa:codice:public class JTabbedPane2 extends JFrame { [...] private final SimulationArena arena; //lista dei nodi private final Vector v = new Vector(); [...] public JTabbedPane2(int l, int a, int Np, Vector v){ super("JTabbedPaneExample"); [...] //crea pulsante JButton generaButton = new JButton("Genera"); //associa un evento al bottone generaButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event){ int k; System.out.println("***DEBUG hai inserito:\n"+ "minP = " + minPField.getValue() + "\n" + "maxP = " + maxPField.getValue() + "\n" + "minV = " + minVField.getValue() + "\n" + "maxV = " + maxVField.getValue() + "\n" + "Nodi = " + nNodeField.getValue() ); //creo l'area di simulazione arena = new SimulationArena((alt-100), (lun-100)); for(k=0; k<nNodeField.getValue(); k++){ n = new RWMHost(k, minPField.getValue(), maxPField.getValue(), minVField.getValue(), maxVField.getValue()); n.setId(); if(k==0) n.setStato(true); arena.addNode(n); //inserisce un oggetto nella lista }//for k //avvio la simulazione per 10 sec arena.startSimulation(10000); //acquisico la sequenza di nodi nodes = arena.getNodes(); //fermo la simulazione arena.stopSimulation(); for(k=0; k<nodes.length; k++){ //inserisce un oggetto nella lista v.add(nodes[k]); }//for k }//actionPerformed });//ActionListener //aggiunge il pulsante al pannello mpanel.add(generaButton); [...] }
codice:c:\j2sdk1.4.2_04\bin\javac.exe -sourcepath "C:\Documents and Settings\Giuseppe\Documenti\Java Source" "C:\Documents and Settings\Giuseppe\Documenti\Java Source\it\specchio\mra\JTabbedPane2.java" C:\Documents and Settings\Giuseppe\Documenti\Java Source\it\specchio\mra\JTabbedPane2.java:120: cannot assign a value to final variable arena arena = new SimulationArena((alt-100), (lun-100)); ^ C:\Documents and Settings\Giuseppe\Documenti\Java Source\it\specchio\mra\JTabbedPane2.java:120: local variable alt is accessed from within inner class; needs to be declared final arena = new SimulationArena((alt-100), (lun-100)); ^ C:\Documents and Settings\Giuseppe\Documenti\Java Source\it\specchio\mra\JTabbedPane2.java:120: local variable lun is accessed from within inner class; needs to be declared final arena = new SimulationArena((alt-100), (lun-100)); ^ C:\Documents and Settings\Giuseppe\Documenti\Java Source\it\specchio\mra\JTabbedPane2.java:144: local variable v is accessed from within inner class; needs to be declared final v.add(nodes[k]); ^ 4 errors Compilation interrupted
Giuseppe SPECCHIO
le variabili final sono costanti non possono essere modificate, devi trovare un'altra soluzione se nn vuoi questi errori, magari usare una classe normale e nn una inner...