PDA

View Full Version : [Java] Cambiare mese nel mio calendario


DanielDj
22-12-2010, 23:00
Ciao a tutti, devo realizzre per un esame universitario un calendario/agenda.
Mi sono trovato davante ad uno scoglio che non riesco a superare.

ho creato una classe che prende in ingeresso il mese e l'anno e restituisce una matrice 5x7 contentente i giorni del calendario per inserirli poi all'interno di una jTable....fin qui tutto ok.

sopra alla tabella ho creato 2 jButton per passare rispettivamente al mese precedente ed a quello successivo.
il tutto inserito all'interno di una classe che estende JFrame.

il problema è che non so cosa inserire nel metodo actionPerformed.
L'unica cosa che mi è venuta in mente è istanziare di nuovo la classe che estende il jframe, ma in questo modo mi crea una nuova finestra.

per farvi capire meglio allego una parte del codice


public class LeftFrame extends JFrame implements ActionListener{
public Container container;

public LeftFrame(int Month, int Year){

GridBagLayout layout = new GridBagLayout();
GridBagConstraints lim = new GridBagConstraints();
container = new JPanel();
container.setLayout(layout);

JButton prevButton = new JButton("<");
prevButton.setPreferredSize(new Dimension(50, 10));
lim.gridx = 0;
lim.gridy = 0;
container.add(prevButton,lim);
prevButton.addActionListener(this);


JButton next = new JButton(">");
next.setPreferredSize(new Dimension(50, 10));
lim.gridx = 2;
lim.gridy = 0;
lim.anchor = GridBagConstraints.EAST;
container.add(next,lim);

JLabel monthLabel = new JLabel();
lim.gridx = 1;
lim.gridy = 0;
lim.anchor = GridBagConstraints.CENTER;
container.add(monthLabel,lim);

JTable jTable1 = new JTable();
JScrollPane jScrollPane1 = new JScrollPane();
lim.gridx = 0;
lim.gridy = 1;
lim.gridwidth = 3;
lim.gridheight = 1;
jScrollPane1.setPreferredSize(new Dimension(170, 110));

jTable1.setModel(new DefaultTableModel(
new Object [][] {
{mat[0][0], mat[0][1], mat[0][2], mat[0][3], mat[0][4], mat[0][5], mat[0][6]},....

vi risparmio la costruzione della tabella.
....
jScrollPane1.setViewportView(jTable1);
container.add(jScrollPane1,lim);
Container contPane = this.getContentPane();
contPane.add(container, BorderLayout.CENTER);
this.pack();

public void actionPerformed(ActionEvent e) {

}

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
GregorianCalendar gc = new GregorianCalendar();
int Year = gc.get(Calendar.YEAR);
int Month = gc.get(Calendar.MONTH);

new LeftFrame(Month,Year).setVisible(true);
}
});
}

}



Scusate per la lunghezza del post.
Sicuramente c'è qualche errore di fondo.
:help:
Accetto qualsiasi tipo di consiglio. Grazie Mille

PGI-Bis
23-12-2010, 13:42
E' corretta l'intuizione secondo cui quello che dovresti fare è un po' quello che fai nel costruttore ed è anche giusto dire che, tuttavia, il costruttore non lo puoi più usare.

Ciò che puoi fare è ripetere nell'actionPerformed quella parte del costruttore che si occupa di riempire i diversi controlli che hai nella tua finestra con i valori che dipendono dal mese scelto.

A conti fatti direi che si tratta di cambiare il testo nell'etichetta "monthLabel" e rigenerare il contenuto della tabella, vale a dire creare un nuovo DefaultTableModel, ficcarci dentro i giorni e poi chiamare jTable1.setModel(il nuovo modello). Al limite puoi riciclare il modello esistente e usare setValueAt sulla tabella, cambia poco.

Per ragioni di integrità - a naso direi che l'actionPerformed è contenuto nell'ambito delle variabili locali jTable1 e monthLabel - sia jTable1 che monthLabel dovranno essere dichiarati final.

DanielDj
23-12-2010, 16:22
Grazie gentilissimo!!
comunque ho risolto raggionando in modo simile a te.

ho creato un metodo updateTable() in cui rifaccio calcolare la matrice con i giorni del calendario e ricreo DefaultTableModel passandogli i nuovi valori della matrice.

questa è solo una piccola parte del progetto.
Se in questi giorni mi servirà di nuovo aiuto mi rivolgero a voi esperti :D

Per ora grazie.