GigaBajt, to może zróbmy tak:
Tutaj jest cały mój kod (jest jeszcze klasa ramki dziedzicząca pod JFrame, tam ustawiam widoczność koniec programu po zamknięciu itd):
package zadanie;
import javax.swing.*;
import java.awt.*;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
class Panel extends JPanel {
private JButton[] tablicaButtonow = new JButton[42];
private JButton nastepny, poprzedni;
private JLabel miesiacRok;
private Color kolorButton = new Color(116, 185, 255);
private Color kolorButtonN = new Color(255,255,255);
private Color niedziela = new Color(0, 184, 148);
private Color sobota = new Color(85, 239, 196);
private Color etykietaKolor = new Color(255, 211, 42);
private JLabel etykieta = new JLabel("");
private LocalDate dataAktualna = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
Panel(){
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(getMiesiacEtykieta());
add(getDniTygPanel());
add(Box.createRigidArea(new Dimension(0,5)));
add(getMiesiacPanel());
getDniTygPanel().setAlignmentX(Component.CENTER_ALIGNMENT);
getMiesiacPanel().setAlignmentX(Component.CENTER_ALIGNMENT);
generatorKalendarza();
}
private JComponent getMiesiacPanel(){
JPanel panelMiesiac = new JPanel();
panelMiesiac.setLayout(new GridLayout(6,7));
panelMiesiac.setMaximumSize(new Dimension(710,460));
panelMiesiac.setPreferredSize(new Dimension(710,460));
panelMiesiac.setMaximumSize(new Dimension(710,460));
for (int i=0; i<42; i++){
JButton b = new JButton();
b.setMaximumSize(new Dimension(95,70));
b.setPreferredSize(new Dimension(95,70));
b.setMaximumSize(new Dimension(95,70));
b.setBorderPainted(false);
b.setRolloverEnabled(false);
b.setVisible(true);
JPanel p = new JPanel();
p.add(b);
tablicaButtonow[i] = b;
panelMiesiac.add(p);
}
return panelMiesiac;
}
private JComponent getDniTygPanel(){
JPanel dniPanel = new JPanel();
dniPanel.setBackground(etykietaKolor);
dniPanel.setMinimumSize(new Dimension(700,35));
dniPanel.setPreferredSize(new Dimension(700,35));
dniPanel.setMaximumSize(new Dimension(700,35));
String[] spisDni = {"pn.", "wt.", "śr.", "czw.", "pt.", "sob.", "niedz."};
for (int i = 0; i < 7; i++){
JLabel e = new JLabel("", JLabel.CENTER);
e.setMinimumSize(new Dimension(95,25));
e.setPreferredSize(new Dimension(95,25));
e.setMaximumSize(new Dimension(95,25));
e.setLayout(new GridLayout(1,7));
e.setText(spisDni[i]);
dniPanel.add(e);
}
return dniPanel;
}
private JComponent getMiesiacEtykieta(){
JPanel miesiacEtykieta = new JPanel();
miesiacEtykieta.setMinimumSize(new Dimension(700,45));
miesiacEtykieta.setPreferredSize(new Dimension(700,45));
miesiacEtykieta.setMaximumSize(new Dimension(700,45));
miesiacEtykieta.setBackground(kolorButtonN);
miesiacEtykieta.revalidate();
nastepny = new JButton();
ImageIcon ikonaN = new ImageIcon("n.png");
nastepny.setMinimumSize(new Dimension(25,25));
nastepny.setPreferredSize(new Dimension(25,25));
nastepny.setMaximumSize(new Dimension(25,25));
nastepny.setIcon(ikonaN);
nastepny.setBorderPainted(false);
nastepny.setBackground(new Color(255,255,255));
// nastepny.addActionListener();
poprzedni = new JButton();
ImageIcon ikonaP = new ImageIcon("p.png");
poprzedni.setMinimumSize(new Dimension(25,25));
poprzedni.setPreferredSize(new Dimension(25,25));
poprzedni.setMaximumSize(new Dimension(25,25));
poprzedni.setIcon(ikonaP);
poprzedni.setBorderPainted(false);
poprzedni.setBackground(new Color(255,255,255));
miesiacRok = new JLabel("MIESIĄC_ROK", JLabel.CENTER);
miesiacRok.setMinimumSize(new Dimension(620,25));
miesiacRok.setPreferredSize(new Dimension(620,25));
miesiacRok.setMaximumSize(new Dimension(620,25));
miesiacEtykieta.add(poprzedni);
miesiacEtykieta.add(miesiacRok);
miesiacEtykieta.add(nastepny);
return miesiacEtykieta;
}
private void generatorKalendarza(){
int iloscDni = dataAktualna.lengthOfMonth(); /// pobranie ilości dni danego miesiąca
int indexPierwszegoDnia = (dataAktualna.getDayOfWeek().getValue() - 1); // pobranie wartości (numeru) pierwszego dnia miesiąca (odejmuję 1 ponieważ getValue() rozpoczyna się od 1 a tablica od 0
int nrDnia = 1; // zmienna która służy do numerowania buttonów danego dnia
int miesiac = (dataAktualna.getMonth().getValue() - 1); // zmienna która, przechowuje nr poprzedniego miesiąca, stąd - 1
int rok = dataAktualna.getYear(); // pobranie aktualnego roku
if (miesiac == 0){ // zabezpieczenie - gdy miesiąc = 0 ustawiam miesiąc na grudzień, a rok dekrementuję
miesiac = 12;
rok --;
}
LocalDate dataMiesiacPoprzedni = LocalDate.of(rok, miesiac, 1); // deklarowanie kolejnej zmiennej dla miesiąca poprzedniego
int nrDnia2 = dataMiesiacPoprzedni.lengthOfMonth() - (indexPierwszegoDnia - 1); // pobieranie ilości dni poprzedniego miesiąca (służy podobie do zmiennej nrDnia ale odpowiada za miesiąc poprzedni podczas wyświetlania
etykieta.setText(""+nrDnia);
for (int i = 0; i < indexPierwszegoDnia; i++){ // pętla uzupełniająca dni w buttonach miesiącem poprzednim
tablicaButtonow[i].setText(""+nrDnia2);
tablicaButtonow[i].setVisible(true);
tablicaButtonow[i].setEnabled(false);
tablicaButtonow[i].setBackground(kolorButtonN);
nrDnia2++;
}
for (int i = indexPierwszegoDnia; i < iloscDni + indexPierwszegoDnia; i++){ // pętla uzupełniająca dni w buttonach w miesiącu aktualnym
tablicaButtonow[i].setText(""+nrDnia);
tablicaButtonow[i].setVisible(true);
if (i == 6 || i == 13 || i == 20 || i == 27 || i == 34 || i == 41){
tablicaButtonow[i].setBackground(niedziela);
}
else if (i == 5 || i == 12 || i == 19 || i == 26 || i == 33 || i == 40){
tablicaButtonow[i].setBackground(sobota);
}
else{
tablicaButtonow[i].setBackground(kolorButton);
}
miesiacRok.setText(""+tlumacz(dataAktualna.getMonth().getValue())+" "+rok); // metoda "tłumacz" służy do tłumaczenia dni miesiąca z angielskiego na polski
nrDnia++;
}
nrDnia = 1; // ustawienie nrDnia na 1 ponieważ kolejny miesiąc zawsze zaczyna się od 1
for (int i = (iloscDni + indexPierwszegoDnia); i < 42; i++){ // pętla uzupełniająca pozostałe, puste buttony nr dnia następnego miesiąca
tablicaButtonow[i].setText(""+ nrDnia);
tablicaButtonow[i].setVisible(true);
tablicaButtonow[i].setEnabled(false);
tablicaButtonow[i].setBackground(kolorButtonN);
nrDnia++;
}
}
private String tlumacz(int a){
String miesiacPoPolsku = "";
switch (dataAktualna.getMonth()){
case JANUARY: miesiacPoPolsku = "Styczeń"; break;
case FEBRUARY: miesiacPoPolsku = "Luty"; break;
case MARCH: miesiacPoPolsku = "Marzec"; break;
case APRIL: miesiacPoPolsku = "Kwiecień"; break;
case MAY: miesiacPoPolsku = "Maj"; break;
case JUNE: miesiacPoPolsku = "Czerwiec"; break;
case JULY: miesiacPoPolsku = "Lipiec"; break;
case AUGUST: miesiacPoPolsku = "Sierpień"; break;
case SEPTEMBER: miesiacPoPolsku = "Wrzesień"; break;
case OCTOBER: miesiacPoPolsku = "Październik"; break;
case NOVEMBER: miesiacPoPolsku = "Listopad"; break;
case DECEMBER: miesiacPoPolsku = "Grudzień"; break;
}
return miesiacPoPolsku;
}
}
I teraz jak wywołam metodę generatorKalendarza();
w konstruktorze klasy Panel
to ta metoda działa, a jak ją mieszczę pod ActionListener
to nie działa i chciałem zapytać dlaczego tak się dzieję? ActionListener dodaje mniej więcej tak: button.addActionListener(e -> generatorKalendarza);
używam Lambdy, nie korzystam z implementacji interfejsu.
Prościej już chyba nie umiem tego wyjaśnić