Swing Kalender soll auf Buttondruck einen Monat weiterblättern

jimmykimmy

Mitglied
Hallo zusammen. Ich habe einen kleinen Kalender gemacht. Das Ganze ist sehr simpel gehalten, da ich in Sachen Java noch relativ neu bin.
Ich habe unter dem Kalender einen VOR und ZURÜCK Button. Der Knopfdruck sagt mit bisher nur, dass er jeweils einen Monat vor bzw. zurück gehen soll (textbasiert).
Nun möchte ich aber gerne, dass sich der Kalender dementsprechend ändert. Ich weiß nur leider nicht genau wie ich es anstellen kann. Muss man das über einen Observer lösen? Wenn ja, muss ich dann nicht einiges umstrukturieren? Ich hoffe jemand kann einem Neuling da den ein oder anderen Tipp geben?!

Java:
package calendar;

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;

import java.util.Calendar;
import java.util.GregorianCalendar;

import java.awt.event.*;

public class test2 extends javax.swing.JFrame {
	private JPanel jPanel1;
	private JPanel jPanel2;
	private JLabel jLabel1;
	private JButton jButtonBack;
	private JButton jButtonForward;
	private ActionListener Listener;
	private int year, month, day;

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				test2 inst = new test2();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
	public test2() {
		super();
		initGUI();
	}
	
	public ActionListener CreateButtonActionListener(){		
		Listener = new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				JButton b = (JButton) evt.getSource();
				
				System.out.println("go " + b.getName());
			}
		};
		
		return Listener;
	}
	
	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			{
				// unten liegendes jpanel anlegene
				jPanel1 = new JPanel();
				jPanel2 = new JPanel();
				// und an das haupt pane andocken
				getContentPane().add(jPanel1, BorderLayout.CENTER);
				getContentPane().add(jPanel2, BorderLayout.SOUTH);
				
				// gridbaglayout anlegen
				GridBagLayout jPanel1Layout = new GridBagLayout();
				// einstellungen für das gridbaglayout setzen
				jPanel1Layout.rowWeights = new double[] {0.1, 0.1, 0.1, 0.1, 0.1};
				jPanel1Layout.rowHeights = new int[] {7, 7, 7, 7, 7};
				jPanel1Layout.columnWeights = new double[] {0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1};
				jPanel1Layout.columnWidths = new int[] {7, 7, 7, 7, 7, 7, 7};
				// und anschließen das gridbaglayout mit dem jpanel verknüpfen
				jPanel1.setLayout(jPanel1Layout);
				
				// kalendar
				GregorianCalendar calendar_now = new GregorianCalendar();
				year = calendar_now.get(Calendar.YEAR);
				month = calendar_now.get(Calendar.MONTH)+1;
				day = calendar_now.get(Calendar.DAY_OF_MONTH);

				System.out.println("Aktuelles datum: " + year+"/"+month+"/"+day);
				
				GregorianCalendar calendar = new GregorianCalendar(year, month-1, day);
		        int max_days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

		        
		        /* in den süden folgendes einbinden */
				
				// zurück button
				jButtonBack = new JButton();
				jPanel2.add(jButtonBack);
				jButtonBack.setName("back to " + ((calendar.get(Calendar.MONTH)+1)-1) + "/" + calendar.get(Calendar.YEAR));
				jButtonBack.addActionListener(CreateButtonActionListener());
				jButtonBack.setText("<<");
				
				// ausgabe welcher monat ist
				jLabel1 = new JLabel();
				jPanel2.add(jLabel1);
				jLabel1.setText("" + (calendar.get(Calendar.MONTH)+1) + "/" + calendar.get(Calendar.YEAR));
				
				// vor button
				jButtonForward = new JButton();
				jPanel2.add(jButtonForward);
				jButtonForward.setName("forward to " + ((calendar.get(Calendar.MONTH)+1)+1) + "/" + calendar.get(Calendar.YEAR));
				jButtonForward.addActionListener(CreateButtonActionListener());
				jButtonForward.setText(">>");
				
				int spalte = 0;
				int zeile = 0;
				for(int day=1; day <= max_days; day++) {
					jLabel1 = new JLabel();
					jPanel1.add(jLabel1, new GridBagConstraints(spalte, zeile, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
					jLabel1.setText("" + day);
					if( spalte != 0 && spalte % 6 == 0) {
						spalte = 0;
						zeile++;
					} else {
						spalte++;
					}
				}
			}
			pack();
			setSize(400, 300);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
 
Ich weiß, dass es einige fertige Kalender gibt, allerdings möchte ich den Kalender in ein Uni-Projekt einbauen und dabei möchte ich keine fertigen Projekte einbinden.

@VfL_Freak
Schöne Grüße aus der Wüste ;-)
 
Ja auf den Buttons liegt ja auch bereits ein ActionListener, der auch erkennt, ob ich vor oder zurückblättern will.
Mein Problem ist mehr, dass ich nicht weiß, wie ich nun das Panel Update, dass momentan den Monat Juli anzeigt. Ich will also vorblättern und statt den Tagen des Julis sollen die Tage des Augusts angezeigt werden.
 
Hab Deinen Code nur überflogen, aber das was Du bei der Initialierung in der for Schleife mit den Labels machst müsstest Du nach jedem Monatswechsel machen - nur ohne die Labels neu zu erzeugen.

Finde Deine Vorgehensweise jetzt nicht so toll, aber wenn Du Dabei bleiben willst würde ich eine Array für die Label verwenden, über das ich dann den Inhalt der einzelnen ändern kann.
Java:
JLabel dayLabels = new JLabel[6][6];
 

Zurück
Oben