Manipulacja datą po naciśnięciu przycisku

0

Cześć wszystkim. Chciałbym do swojej aplikacji dołożyć funkcjonalność nad którą głowię się już dobrych kilka godzin. Otóż chciałbym, aby po naciśnięciu przycisku "strzalkaWDol", lub "strzalkaWGore" odpowiednio miesiąc w polu JTextField był zmniejszany lub zwiększany o jeden.
Docelowo jeszcze po osiągnięciu wartości maksymalnej lub minimalnej przez miesiąc, chciałbym aby rok był zwiększany, lub zmniejszany. Próbowałem już wielu sposobów, lecz żaden nie był poprawny. Oto część kodu, który jest odpowiedzialny za mój problem:

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class GUI extends JFrame implements ActionListener {

	private static JPanel contentPane;
	private static JTextField txtDataOd, txtDataDo;
	private static JLabel lblWybierzPrzedzialCzasu;
	private static JButton btnStrzalkaWDolLewa, btnStrzalkaWDolPrawa, btnStrzalkaWGoreLewa, btnStrzalkaWGorePrawa;

	private static String dataOd;
	private static String dataDo;

	public static void main(String[] args) {
		GUI frame = new GUI();
		frame.setVisible(true);
	}

	private void setDate() {
		Calendar calendar = Calendar.getInstance();
		int miesiacPobrany = calendar.get(Calendar.MONTH);
		String miesiacDoPodstawienia = null;
		String rokPobrany = Integer.toString(calendar.get(Calendar.YEAR));
		String ostatniDzienMiesiaca = Integer.toString(calendar.getMaximum(Calendar.DAY_OF_MONTH));

		if (miesiacPobrany == 0) {
			miesiacDoPodstawienia = "12";
		} else if (miesiacPobrany < 10) {
			miesiacDoPodstawienia = "0" + miesiacPobrany;
		}

		dataOd = rokPobrany + "-" + miesiacDoPodstawienia + "-" + "01";
		dataDo = rokPobrany + "-" + miesiacDoPodstawienia + "-" + ostatniDzienMiesiaca;
	}

	public GUI() {

		setDate();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		setBounds(100, 100, 410, 120);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		lblWybierzPrzedzialCzasu = new JLabel("Wybierz przedzial czasu:");
		lblWybierzPrzedzialCzasu.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblWybierzPrzedzialCzasu.setBounds(10, 15, 180, 25);
		contentPane.add(lblWybierzPrzedzialCzasu);

		txtDataOd = new JTextField();
		txtDataOd.setText(dataOd);
		txtDataOd.setBounds(200, 15, 86, 25);
		contentPane.add(txtDataOd);
		txtDataOd.setColumns(15);

		txtDataDo = new JTextField();
		txtDataDo.setText(dataDo);
		txtDataDo.setBounds(300, 15, 86, 25);
		contentPane.add(txtDataDo);
		txtDataDo.setColumns(15);

		btnStrzalkaWDolLewa = new JButton("\u2193");
		btnStrzalkaWDolLewa.setBounds(200, 50, 40, 15);
		btnStrzalkaWDolLewa.setFont(new Font("Tahoma", Font.PLAIN, 10));
		btnStrzalkaWDolLewa.addActionListener(this);
		contentPane.add(btnStrzalkaWDolLewa);

		btnStrzalkaWGoreLewa = new JButton("\u2191");
		btnStrzalkaWGoreLewa.setFont(new Font("Tahoma", Font.PLAIN, 10));
		btnStrzalkaWGoreLewa.setBounds(246, 50, 40, 15);
		btnStrzalkaWGoreLewa.addActionListener(this);
		contentPane.add(btnStrzalkaWGoreLewa);

		btnStrzalkaWDolPrawa = new JButton("\u2193");
		btnStrzalkaWDolPrawa.setFont(new Font("Tahoma", Font.PLAIN, 10));
		btnStrzalkaWDolPrawa.setBounds(300, 50, 40, 15);
		btnStrzalkaWGoreLewa.addActionListener(this);
		contentPane.add(btnStrzalkaWDolPrawa);

		btnStrzalkaWGorePrawa = new JButton("\u2191");
		btnStrzalkaWGorePrawa.setFont(new Font("Tahoma", Font.PLAIN, 10));
		btnStrzalkaWGorePrawa.setBounds(346, 50, 40, 15);
		btnStrzalkaWGoreLewa.addActionListener(this);
		contentPane.add(btnStrzalkaWGorePrawa);

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub

	}
}

Czy byłby w stanie ktoś pomóc rozwiązać mój problem, ewentualnie naprowadzić na odpowiednią ścieżkę ? Z góry dziękuję :)

0

Pokaż choć jeden sposób, który próbowałeś (tzn. pokaż kod, który umieszczałeś w metodzie actionPerformed).

0

Proszę bardzo, oto jeden ze sposobów, który próbowałem.

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class GUI extends JFrame implements ActionListener {

	private static JPanel contentPane;
	private static JTextField txtDataOd, txtDataDo;
	private static JLabel lblWybierzPrzedzialCzasu;
	private static JButton btnStrzalkaWDolLewa, btnStrzalkaWDolPrawa, btnStrzalkaWGoreLewa, btnStrzalkaWGorePrawa;

	private static String dataOd;
	private static String dataDo;

	public static void main(String[] args) {
		GUI frame = new GUI();
		frame.setVisible(true);
	}

	private String setDate(Calendar calendar, int miesiacPobrany) {

		String miesiacDoPodstawienia = "" + miesiacPobrany;
		String rokPobrany = Integer.toString(calendar.get(Calendar.YEAR));
		String ostatniDzienMiesiaca = Integer.toString(calendar.getMaximum(Calendar.DAY_OF_MONTH));

		if (miesiacPobrany == 0) {
			miesiacDoPodstawienia = "12";
		} else if (miesiacPobrany < 10) {
			miesiacDoPodstawienia = "0" + miesiacPobrany;
		}

		dataOd = rokPobrany + "-" + miesiacDoPodstawienia + "-" + "01";
		dataDo = rokPobrany + "-" + miesiacDoPodstawienia + "-" + ostatniDzienMiesiaca;

		return dataOd;
	}

	public GUI() {
		Calendar calendar = Calendar.getInstance();
		int miesiacPobrany = calendar.get(Calendar.MONTH);
		setDate(calendar, miesiacPobrany);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		setBounds(100, 100, 410, 120);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		lblWybierzPrzedzialCzasu = new JLabel("Wybierz przedzial czasu:");
		lblWybierzPrzedzialCzasu.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblWybierzPrzedzialCzasu.setBounds(10, 15, 180, 25);
		contentPane.add(lblWybierzPrzedzialCzasu);

		txtDataOd = new JTextField();
		txtDataOd.setText(dataOd);
		txtDataOd.setBounds(200, 15, 86, 25);
		contentPane.add(txtDataOd);
		txtDataOd.setColumns(15);

		txtDataDo = new JTextField();
		txtDataDo.setText(dataDo);
		txtDataDo.setBounds(300, 15, 86, 25);
		contentPane.add(txtDataDo);
		txtDataDo.setColumns(15);

		btnStrzalkaWDolLewa = new JButton("\u2193");
		btnStrzalkaWDolLewa.setBounds(200, 50, 40, 15);
		btnStrzalkaWDolLewa.setFont(new Font("Tahoma", Font.PLAIN, 10));
		btnStrzalkaWDolLewa.addActionListener(new ActionListener() {

			int tempMonth = miesiacPobrany;

			@Override
			public void actionPerformed(ActionEvent arg0) {
				tempMonth--;

				if (tempMonth < 1) {
					tempMonth = 12;
				}
				txtDataOd.setText(setDate(calendar, tempMonth));
			}

		});
		contentPane.add(btnStrzalkaWDolLewa);

		btnStrzalkaWGoreLewa = new JButton("\u2191");
		btnStrzalkaWGoreLewa.setFont(new Font("Tahoma", Font.PLAIN, 10));
		btnStrzalkaWGoreLewa.setBounds(246, 50, 40, 15);
		btnStrzalkaWGoreLewa.addActionListener(new ActionListener() {
			int tempMonth = miesiacPobrany;

			@Override
			public void actionPerformed(ActionEvent e) {

				tempMonth++;

				if (tempMonth > 12) {
					tempMonth = 1;
				}
				txtDataOd.setText(setDate(calendar, tempMonth));
			}

		});
		contentPane.add(btnStrzalkaWGoreLewa);

		btnStrzalkaWDolPrawa = new JButton("\u2193");
		btnStrzalkaWDolPrawa.setFont(new Font("Tahoma", Font.PLAIN, 10));
		btnStrzalkaWDolPrawa.setBounds(300, 50, 40, 15);
		btnStrzalkaWGoreLewa.addActionListener(this);
		contentPane.add(btnStrzalkaWDolPrawa);

		btnStrzalkaWGorePrawa = new JButton("\u2191");
		btnStrzalkaWGorePrawa.setFont(new Font("Tahoma", Font.PLAIN, 10));
		btnStrzalkaWGorePrawa.setBounds(346, 50, 40, 15);
		btnStrzalkaWGoreLewa.addActionListener(this);
		contentPane.add(btnStrzalkaWGorePrawa);

	}

	@Override
	public void actionPerformed(ActionEvent e) {
	}
}
0

Ogólnie kiepski to pomysł na edycję daty. Poniższe rozwiązanie działa mniej więcej dobrze - zmniejsza miesiąc i rok w stosunku do tego co było na początku w polu tekstowym, a nie do tego co już wpisał użytkownik.
Dlaczego pola w klasie są statyczne?

    private GregorianCalendar calendar;
...
    public GUI() {
        Calendar calendar = Calendar.getInstance();
...
        btnStrzalkaWDolLewa.addActionListener(new ActionListener() {
 
            int tempMonth = miesiacPobrany;
 
            @Override
            public void actionPerformed(ActionEvent arg0) {
                tempMonth--;
 
                if (tempMonth < 1) {
                    tempMonth = 12;
                    calendar = new GregorianCalendar(calendar.get(Calendar.YEAR) - 1,calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH));
                }
                txtDataOd.setText(setDate(calendar, tempMonth));
            }
 
        });
0

Pola są statyczne raczej tylko z mojego pośpiechu. Dziękuję bardzo za zainteresowanie, ale powyższe rozwiązanie jest praktycznie takie same jak to moje, które nie do końca mi odpowiada. Zastanawiam się jak pobrać aktualną wartość z pola tekstowego, a nie wartość początkową. A skoro ten pomysł jest kiepski na edycję daty, to może macie jakiś inny, lepszy pomysł?

1
  1. Możesz użyć klasy JDatePicker (https://sourceforge.net/projects/jdatepicker/).
  2. Jeśli chcesz zostać przy swoim rozwiązaniu, to musisz wprowadzić kilka zmian. Obecnie nie jesteś w stanie wyciąć z pola tekstowego miesiąca.
    private JFormattedTextField txtDataOd
    private String setDate(Calendar calendar, int miesiacPobrany) {
        ...
 
        dataOd = rokPobrany + miesiacDoPodstawienia + "01";
        dataDo = rokPobrany + miesiacDoPodstawienia + ostatniDzienMiesiaca;
 
        return dataOd;
    }
    ...

        MaskFormatter mask = new MaskFormatter(****-**-**);
        mask.setValidCharacters("1234567890");
        txtDataOd = new JFormattedTextField(mask);

Wtedy miesiąc to prostu

    int tempMonth = Integer.parseInt(txtDataOd.getText().substring(4,6));

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