Torna indietro   Hardware Upgrade Forum > Software > Programmazione

PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-01-2011, 13:07   #1
Garet Jax
Senior Member
 
Iscritto dal: Nov 2001
Città: Lainate (MI)
Messaggi: 831
[JAVA] Problema con le finestre

Ciao a tutti,

sto scrivendo una GUI per un progetto dell'università e mi sono imbattuto in questo problema che non riesco a risolvere.

In pratica ho due finestre che contengono una lista, in pratica la prima finestra (quella principale) visualizza l'elenco attuale, mentre la seconda serve per inserire nuovi elementi nella lista. Tutto procede bene fino a quando non passo daal finestra secondaria a quella pricipale: in pratica non riesco più a visualizzare la lista.

Le ho provate tutte con i metodi validate, revalidate, paint e repaint su form contenitori e ogni possibile componente ma nulla da fare.

Vi posto qui un esempio giocattolo per rendere l'idea cosa ho bisogno che faccia il programma.

La prima finestra ha un pulsante che apre l'altra; la seconda finestra ha due bottoni: il primo per aggiungere gli elementi in un vector tampone, il secondo per inserire il tutto nella lista e chiudere la finestra corrente.

Il motivo è che le modifihce non sono effettuate fino a quando l'utente non conferma col secondo pulsante.

La cosa SNERVANTE è che se riapro la finestra secondaria dalla principale DOPO le modifiche, i nuovi elementi sono presenti.

Se mi potete dare una mano, ve ne sarei grato.
Codice:
//FINESTRA PRINCIPALE

package finestre;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Testform extends JFrame {
	// elementi
	private JList lista = null;
	private JButton bottone = null;
	private JScrollPane scroll = null;
	private DefaultListModel modello = null;
	private JPanel pannello = null;

	// metodi
	public Testform() {
		super("Test");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// creo oggetti della finestra
		bottone = new JButton("Apri");
		modello = new DefaultListModel();
		lista = new JList(modello);
		scroll = new JScrollPane(lista);
		
		//eventi
		ApriAction azione = new ApriAction();
		bottone.addActionListener(azione);

		// layout e contenitori
		pannello = new JPanel();
		pannello.add(bottone);

		// posizionamento oggetti nella finestra
		this.add(scroll, BorderLayout.CENTER);
		this.add(pannello, BorderLayout.EAST);
	}// end costruttore

	private class ApriAction implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {
			// TODO Auto-generated method stub
			TestForm2 t2 = new TestForm2(lista, Testform.this);
			t2.pack();
			t2.setVisible(true);
			Testform.this.setVisible(false);

		}// enn actionPerformed

	}// end inner class
}// end finestra di test

//FINESTRA SECONDARIA
package finestre;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TestForm2 extends JFrame {
	// oggetti
	private JList lista = null;
	private JScrollPane scroll = null;
	private JButton aggiungi = null;
	private JButton ok = null;
	private Testform finestra = null;
	private Vector<String> elementi = null;

	// contenitori
	private JPanel pannelloEst = null;
	private JPanel pannelloSud = null;

	public TestForm2(JList elenco, Testform win) {
		super("Test 2");
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		lista = elenco;
		finestra = win;

		// disegno la form

		// oggetti
		elementi = new Vector<String>();
		scroll = new JScrollPane(lista);
		aggiungi = new JButton("Aggiungi");
		ok = new JButton("Ok");

		// eventi
		AggiungiAction aggAz = new AggiungiAction();
		OkAction okaz = new OkAction();
		aggiungi.addActionListener(aggAz);
		ok.addActionListener(okaz);

		// layout e contenitori
		pannelloEst = new JPanel();
		pannelloSud = new JPanel();

		// aggiunta oggetti
		pannelloEst.add(aggiungi);
		pannelloSud.add(ok);
		this.add(scroll, BorderLayout.CENTER);
		this.add(pannelloEst, BorderLayout.EAST);
		this.add(pannelloSud, BorderLayout.SOUTH);
	}// end costruttore

	private class AggiungiAction implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {
			// TODO Auto-generated method stub
			elementi.add("Nuovo Elemento");
			JOptionPane.showMessageDialog(TestForm2.this,
					"Aggiunto nuovo elemento", "Attenzione",
					JOptionPane.INFORMATION_MESSAGE);
		}// end actionPerformed
	}// end inner class AggiungiAction

	private class OkAction implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {
			// TODO Auto-generated method stub
			DefaultListModel modello = (DefaultListModel) lista.getModel();
			for (int i = 0; i < elementi.size(); i++) {
				modello.addElement(elementi.get(i));
			}// end for
                                       finestra.validate();
			finestra.setVisible(true);
			TestForm2.this.dispose();
		}// actionPerformed 
	}// end OkAction
}// end TestForm2
__________________
Alea iacta est.
Che io deceda se recedo
Garet Jax è offline   Rispondi citando il messaggio o parte di esso
Old 12-01-2011, 15:29   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Passa alla seconda finestra il modello (DefaultListModel) invece della JList.
Nel costruttore della seconda finestra costuirai un'altra JList con il model passato.
Nella action della seconda finestra esegui gli inserimenti direttamente sul model passato.

Grosso modo, ApriAction diventa:
Codice:
private class ApriAction implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {
			TestForm2 t2 = new TestForm2(modello, TestForm.this);
			t2.pack();
			t2.setVisible(true);
			TestForm.this.setVisible(false);

		}// enn actionPerformed

	}// end inner class
E in TestForm2, elimini il membro JList e aggiungi un membro DefaultListModel:
Codice:
class TestForm2 extends JFrame {
	// oggetti
	private DefaultListModel modello = null;
	private JScrollPane scroll = null;
	private JButton aggiungi = null;
	private JButton ok = null;
	private TestForm finestra = null;
        ...
Di conseguenza cambia il costruttore:
Codice:
public TestForm2(DefaultListModel mod, TestForm win) {
		super("Test 2");
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                modello = mod;
		JList lista = new JList(modello);
		finestra = win;
                ...
e OkAction:
Codice:
private class OkAction implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {
                        // riga eliminata
			for (int i = 0; i < elementi.size(); i++) {
				modello.addElement(elementi.get(i));
			}// end for
			finestra.setVisible(true);
			TestForm2.this.dispose();
		}// actionPerformed
	}// end OkAction
Qui trovi un tutorial ufficiale su JList:
http://download.oracle.com/javase/tu...t.html#mutable

E se bazzichi da poco nelle Swing e vuoi una guida base, guarda il link che ho in firma.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 12-01-2011, 19:47   #3
Garet Jax
Senior Member
 
Iscritto dal: Nov 2001
Città: Lainate (MI)
Messaggi: 831


Quanto tempo ci ho perso?!?! 3 giorni?!

Effettivamente se volevo modificare la serie di elementi, avrei dovuto lavorare sul modello e non sulla lista

Comunque, ti ringrazio per i link, avevo già scoperto "googlando" la guida sul GridBagLayout di PGI-Bis e avere quella sullo Swing non guasta.

Ho, però, un altro un altro effetto simpatico su cui i mitici (o meglio inutili) metodi validate e compagnia bella non funzionano.

In questo caso ho bisogno di creare dei pulsati a comando nella parte centrale di una finestra e in posizioni ben precise. Per fare questo uso un GridBagLayout in cui inserisco dei pannello vuoti (verdi) per avere una specie di inizializzazione. Poi quando premo un bottone viene inserito un nuovo pulsante nella posizione voluta.

Ora, la prima versione del codice prevedeva di inserire i bottoni direttamente; l'effetto era che NON venivano disegnati fino a quando non ci passavo sopra col cursore del mouse.

Nella seconda versione, quella che ti posto, ho aggiunto l'uso del metodo remove del pannello scoperto spulciando la documentazione. Il motivo per cui il primo pannello è arancione è che avevo bisogno di verificare che remove andasse a prendere il pannello verde corretto.

Comunque, in questo caso il risultato è ancora più stupefacente: alcuni bottoni me li disegna, altri no...

Al momento mi tengo i bottoni fantasma che appaiono al passare del puntatore, non è proprio bellissimo ma almeno i bottoni ci sono

Grazie per l'aiuto (e la comprensione)

Codice:
package finestre;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Testform extends JFrame {

	// elementi
	private int contatore = 0;
	private JButton bottone = null;
	private JPanel panneloEst = null;
	private JPanel pannelloCent = null;
	private GridBagConstraints vincoli = null;
	private GridBagLayout layout = null;

	// metodi
	public Testform() {
		super("Test");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// oggetti
		bottone = new JButton("inserisci");
		vincoli = new GridBagConstraints();

		// eventi
		Azione a = new Azione();
		bottone.addActionListener(a);

		// layout e contenitore est
		panneloEst = new JPanel();

		// layout e pannello centrali
		layout = new GridBagLayout();
		pannelloCent = new JPanel(layout);

		// aggiunta oggetti pannello est
		panneloEst.add(bottone);

		// aggiunta oggetti pannello cent
		inizializzaCentro(9);
		
		pannelloCent.getComponent(contatore).setBackground(Color.ORANGE);
		
		// aggiunta oggetti alla form
		this.add(panneloEst, BorderLayout.EAST);
		this.add(pannelloCent, BorderLayout.CENTER);
	}// end costruttore

	private void inizializzaCentro(int max) {
		for (int i = 0; i < max; i++) {
			vincoli.gridx = i % 3;
			vincoli.gridy = i / 3;
			vincoli.weightx = 1;
			vincoli.weighty = 1;
			vincoli.anchor = GridBagConstraints.CENTER;
			vincoli.fill = GridBagConstraints.BOTH;
			vincoli.insets = new Insets(10, 10, 10, 10);
			JPanel pan = new JPanel();
			pan.setBackground(Color.GREEN);
			layout.setConstraints(pan, vincoli);
			pannelloCent.add(pan);
		}// end for
	}// end inizializzaCentro

	private class Azione implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {
			// TODO Auto-generated method stub
			JButton nuovoBottone = new JButton("Bottone" + (contatore + 1));
			vincoli.gridx = contatore % 3;
			vincoli.gridy = contatore / 3;
			vincoli.fill = GridBagConstraints.BOTH;
			vincoli.anchor = GridBagConstraints.CENTER;
			vincoli.insets = new Insets(10, 10, 10, 10);
			layout.setConstraints(nuovoBottone, vincoli);
			pannelloCent.remove(contatore);
			pannelloCent.add(nuovoBottone);
			pannelloCent.validate();
			pannelloCent.revalidate();
			pannelloCent.repaint();
			Testform.this.repaint();
			contatore++;
		}// end actionPerformed

	}// end inner class Azione
	
}// end finestra di test
__________________
Alea iacta est.
Che io deceda se recedo
Garet Jax è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2011, 09:31   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quando rimuovi/aggiungi un component da/a un container il cui stato è displayable devi chiamare validate.
L'errore sta nel fatto che per sostituire il componente ad un certo indice nel codice postato rimuovi il vecchio componente che si trova a quell'indice e poi aggiungi quello nuovo (il bottone) senza specificare l'indice.

Modifica Action così:
Codice:
private class Azione implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {
			// TODO Auto-generated method stub
			JButton nuovoBottone = new JButton("Bottone" + (contatore + 1));
			vincoli.gridx = contatore % 3;
			vincoli.gridy = contatore / 3;
			vincoli.fill = GridBagConstraints.BOTH;
			vincoli.anchor = GridBagConstraints.CENTER;
			vincoli.insets = new Insets(10, 10, 10, 10);
			layout.setConstraints(nuovoBottone, vincoli);
			pannelloCent.remove(contatore);
                        pannelloCent.add(nuovoBottone, contatore);
                        pannelloCent.validate();
			contatore++;
		}// end actionPerformed

	}// end inner class Azione
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2011, 12:47   #5
Garet Jax
Senior Member
 
Iscritto dal: Nov 2001
Città: Lainate (MI)
Messaggi: 831
Capisco. In sostanza non erano i metodi validate che non andavano, ma semplicemente andava in confusione perché non gli indicavo quale componente sostituire.

Grazie mille, mi hai aiutato tantissimo.
__________________
Alea iacta est.
Che io deceda se recedo
Garet Jax è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Perplexity lancia Comet per iOS: il brow...
La nuova generazione del Samsung Galaxy ...
PayPal in Italia, tra la sfida del Buy N...
Super Micro nei guai: ecco come spedivan...
Amazon Haul: sconti fino al 40%, ecco co...
Exodus si mostra in un primo video gamep...
La VPN integrata in Firefox sarà ...
Frigorifero LG multidoor slim a 746€ su ...
C'è un altro Galaxy S26 in arrivo...
Horizon Worlds non chiude su Quest: Meta...
Cloudflare contesta Piracy Shield: &egra...
Ecco gli smartphone sotto i 300€ più int...
DLSS 5 massacrato? Siete 'assolutamente ...
Redmi Note 15 Pro a 259€ su Amazon: 200 ...
Lenovo punta a rivoluzionare il settore ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:32.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v