JComBox i ActioneListener - podwójne wywołanie

0

Witam.
Mam dziwny problem, ale po kolei.
Program, który piszę to prosty Kalenadarz z opcją dodawania alarmów. W momencie wyboru daty alarmu, mam ustawione JComboBoxy by wybrać rok, miesiąc itp.
Na Boxie dla roku i miesiąca mam ustawione actionListenery po to by aktualizowały miesiące i dni. (np. po wybraniu lutego pojawiało się 28 dni a nie 31)
Jednak po wybraniu np. roku wywołuje się actionListener ustawiony na miesiąc. Totalnie nie mam pojęcia jak rozwiązać ten problem.

Poniżej umieszczam klasę w której zawarta jest implementacja.

package database;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class EventHandler extends JFrame {

	/*
	 * 
	 * [V] dodanie mozliwosci dodania godziny [] brak mozliwosci dodania alarmu na
	 * date przeszla
	 */

	private static GregorianCalendar calendar = new GregorianCalendar();
	private static int year = calendar.get(GregorianCalendar.YEAR);
	private final static int actualMonth = calendar.get(GregorianCalendar.MONTH);
	private final static int actualYear = calendar.get(GregorianCalendar.YEAR);
	private static int month = calendar.MONTH;
	private static String[] hours = null;
	private static String[] minutes = null;

	public void addEvent() {

		setVisible(true);
		setBounds(100, 100, 500, 489);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setLayout(null);

		JLabel lblEventName = new JLabel("Nazwa : ");
		lblEventName.setBounds(65, 68, 120, 14);
		add(lblEventName);
		final JTextField textField_1 = new JTextField();
		textField_1.setBounds(160, 65, 86, 20);
		add(textField_1);
		textField_1.setColumns(10);

		JLabel lblPlaceName = new JLabel("Miejsce : ");
		lblPlaceName.setBounds(65, 115, 120, 14);
		add(lblPlaceName);
		final JTextField textField_2 = new JTextField();
		textField_2.setBounds(160, 112, 247, 20);
		add(textField_2);
		textField_2.setColumns(10);

		JLabel lblDescription = new JLabel("Opis : ");
		lblDescription.setBounds(65, 162, 120, 14);
		add(lblDescription);
		final JTextField textField_3 = new JTextField();
		textField_3.setBounds(160, 157, 212, 40);
		add(textField_3);
		textField_3.setColumns(10);

		JLabel lblDay = new JLabel("Day");
		lblDay.setBounds(210, 205, 40, 20);
		add(lblDay);

		final JComboBox comboDay = new JComboBox(getDaysForComboBox());
		comboDay.setBounds(205, 225, 60, 30);
		add(comboDay);

		JLabel lblMonth = new JLabel("Month");
		lblMonth.setBounds(140, 205, 40, 20);
		add(lblMonth);

		final JComboBox comboMonth = new JComboBox(getMonthsForComboBox());
		comboMonth.setBounds(135, 225, 60, 30);
		comboMonth.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (comboMonth.getSelectedItem() != null) {
					System.out.println("mon");
					month = Integer.parseInt((String) comboMonth.getSelectedItem());
					actualizeComboBoxes(comboMonth, comboDay);
				}

			}
		});
		add(comboMonth);

		JLabel lblYear = new JLabel("Year");
		lblYear.setBounds(70, 205, 40, 20);
		add(lblYear);

		final JComboBox comboYear = new JComboBox(getYearsForComboBox());
		comboYear.setBounds(65, 225, 60, 30);
		comboYear.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (comboYear.getSelectedItem() != null) {
					System.out.println("year");
					year = Integer.parseInt((String) comboYear.getSelectedItem());
					actualizeComboBoxes(comboMonth, comboDay);
				}

			}
		});
		add(comboYear);

		JLabel lblHour = new JLabel("Hours");
		lblHour.setBounds(280, 205, 40, 20);
		add(lblHour);

		JComboBox comboHour = new JComboBox(getHoursForComboBox());
		comboHour.setBounds(275, 225, 60, 30);
		add(comboHour);

		JLabel lblMinute = new JLabel("Minutes");
		lblMinute.setBounds(350, 205, 50, 20);
		add(lblMinute);

		JComboBox comboMinute = new JComboBox(getMinutesForComboBox());
		comboMinute.setBounds(345, 225, 60, 30);
		add(comboMinute);

		JButton okButton = new JButton("OK");
		okButton.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (textField_1.getText().isEmpty() || textField_2.getText().isEmpty()
						|| textField_3.getText().isEmpty())
					;
				else {
					// DBHandler.addEvent(new Event(new Date(), description, place))
					dispose();
				}
			}
		});

		okButton.setBounds(200, 275, 60, 40);
		add(okButton);

	}

	private String[] getYearsForComboBox() {

		ArrayList<String> years = new ArrayList();

		for (int i = year; i < year + 120; i++)
			years.add(String.valueOf(i));

		String[] array = new String[years.size()];

		return years.toArray(array);
	}

	private String[] getMonthsForComboBox() {

		String[] months;

		if (year == actualYear) {
			months = new String[12 - actualMonth];

			for (int i = 0; i < months.length; i++)
				months[i] = String.valueOf(actualMonth + 1 + i);

		} else {
			months = new String[12];

			for (int i = 0; i < months.length; i++)
				months[i] = String.valueOf(i + 1);
		}

		System.out.println(months.length);

		return months;
	}

	private String[] getDaysForComboBox() {

		GregorianCalendar tmp = new GregorianCalendar(year, month, 1);

		String[] days = new String[tmp.getActualMaximum(GregorianCalendar.DAY_OF_MONTH)];

		for (int i = 0; i < days.length; i++)
			days[i] = String.valueOf(i + 1);

		return days;

	}

	private void actualizeComboBoxes(JComboBox monthBox, JComboBox day) {

		monthBox.removeAllItems();

		for (String e : getMonthsForComboBox())
			monthBox.addItem(e);

		day.removeAllItems();

		for (String e : getDaysForComboBox())
			day.addItem(e);

	}

	private String[] getHoursForComboBox() {
		if (hours == null) {
			hours = new String[24];

			for (int i = 0; i < 24; i++) {
				if (i < 10)
					hours[i] = "0" + String.valueOf(i);
				else
					hours[i] = String.valueOf(i);
			}
		}
		return hours;
	}

	private String[] getMinutesForComboBox() {

		if (minutes == null) {
			minutes = new String[60];

			for (int i = 0; i < minutes.length; i++) {
				if (i < 10)
					minutes[i] = "0" + String.valueOf(i);
				else
					minutes[i] = String.valueOf(i);
			}

		}

		return minutes;
	}

	public void setYear(int year) {
		this.year = year;
	}
}

0

Nie wiem czy może to pomóc ;-)
W moim projekcie mam jednego ActionListenera na klasę a nie oddzielnego w każdej formatce.

Wtedy wyglądałoby to tak:

   ...
   comboYear.addActionListener(this);
   comboMonth.addActionListener(this);
   ....

	public void actionPerformed(ActionEvent arg0) {
		Object source = arg0.getSource();
		if (source == comboYear) {
			.....
			}
		} else if (source == comboMonth)
			......
			}
	}

1 użytkowników online, w tym zalogowanych: 0, gości: 1