Garet Jax
12-01-2011, 13:07
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.
//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
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.
//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