У меня проблема, и я не могу ее преодолеть ... Я пишу программу на Java с использованием Swing. Эта программа будет использоваться для выбора дня в отображаемом календаре и установки часов вашей работы (например, с 8:00 до 16:00), после чего программа подсчитает, сколько часов вы работали в месяц, и рассчитает вашу зарплату.
Я написал некоторый код, поэтому при запуске программы вы видите представление текущего месяца. Я хотел добавить ActionListener
к кнопке, которая переставит вид календаря на предыдущий месяц. Я хотел использовать тот же метод, который генерирует текущий месяц, но отправляет другой аргумент (дата предыдущего месяца).
Чтобы проверить это, я использовал этот метод на ActionListener
(поэтому, когда я запускаю его, я вижу пустую форму и после нажатия этой кнопки он покажет мне текущий метод), и проблема в том, что ничего не происходит происходит ... Этот метод отлично работает, когда я помещаю его в конструктор моего класса, но не работает, когда он используется как выполняемое действие, и я не знаю почему.
Надеюсь, Вы поможете мне разобраться и, возможно, расскажете, где я допустил ошибку и что я могу с этим сделать. Для меня это хобби. У меня нет профессионального опыта в программировании.
Мой код:
package zadanie;
import javax.swing.*;
import java.awt.*;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
class Panel extends JPanel {
private JButton[] buttonArray = new JButton[42];
private JButton nextButton, previousButton;
private JLabel monthYear;
private Color buttonColor = new Color(116, 185, 255);
private Color buttonColorInactive = new Color(255,255,255);
private Color sundey = new Color(0, 184, 148);
private Color saturday = new Color(85, 239, 196);
private Color labelColor = new Color(255, 211, 42);
private LocalDate dateNow = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
Panel(){
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(getMonthLabel());
add(getWeekDaysPanel());
add(Box.createRigidArea(new Dimension(0,5)));
add(getMonthPanel());
calendarGenerator();
getWeekDaysPanel().setAlignmentX(Component.CENTER_ALIGNMENT);
getMonthPanel().setAlignmentX(Component.CENTER_ALIGNMENT);
}
private JComponent getMonthPanel(){
JPanel monthPanel = new JPanel();
monthPanel.setLayout(new GridLayout(6,7));
monthPanel.setMaximumSize(new Dimension(710,460));
monthPanel.setPreferredSize(new Dimension(710,460));
monthPanel.setMaximumSize(new Dimension(710,460));
//Loop that in every iteration creates a "b" button set it properties and to a "p" panel and a buttonArray.
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);
buttonArray[i] = b;
monthPanel.add(p);
}
return monthPanel;
}
// Similar to getMonthPanel method - it adds a 7 labels with the names of the days
private JComponent getWeekDaysPanel(){
JPanel daysPanel = new JPanel();
daysPanel.setBackground(labelColor);
daysPanel.setMinimumSize(new Dimension(700,35));
daysPanel.setPreferredSize(new Dimension(700,35));
daysPanel.setMaximumSize(new Dimension(700,35));
String[] daysList = {"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(daysList[i]);
daysPanel.add(e);
}
return daysPanel;
}
// a method that adds a two buttons (to switch to previous and next month) and a label that displays the displayed month and year
private JComponent getMonthLabel(){
JPanel monthLabel = new JPanel();
monthLabel.setMinimumSize(new Dimension(700,45));
monthLabel.setPreferredSize(new Dimension(700,45));
monthLabel.setMaximumSize(new Dimension(700,45));
monthLabel.setBackground(buttonColorInactive);
monthLabel.revalidate();
nextButton = new JButton();
ImageIcon nIcon = new ImageIcon("n.png");
nextButton.setMinimumSize(new Dimension(25,25));
nextButton.setPreferredSize(new Dimension(25,25));
nextButton.setMaximumSize(new Dimension(25,25));
nextButton.setIcon(nIcon);
nextButton.setBorderPainted(false);
nextButton.setBackground(new Color(255,255,255));
// nextButton.addActionListener();
previousButton = new JButton();
ImageIcon pIcon = new ImageIcon("p.png");
previousButton.setMinimumSize(new Dimension(25,25));
previousButton.setPreferredSize(new Dimension(25,25));
previousButton.setMaximumSize(new Dimension(25,25));
previousButton.setIcon(pIcon);
previousButton.setBorderPainted(false);
previousButton.setBackground(new Color(255,255,255));
monthYear = new JLabel("MIESIĄC_ROK", JLabel.CENTER);
monthYear.setMinimumSize(new Dimension(620,25));
monthYear.setPreferredSize(new Dimension(620,25));
monthYear.setMaximumSize(new Dimension(620,25));
monthLabel.add(previousButton);
monthLabel.add(monthYear);
monthLabel.add(nextButton);
return monthLabel;
}
// A method that change the appearance of the buttons in the "buttonArray" so the whole thing looks like calendar of the month
private void calendarGenerator(){
int noOfDays = dateNow.lengthOfMonth(); /// getting number of days in a month
int firstDayIndex = (dateNow.getDayOfWeek().getValue() - 1); // gettin the value (number) of the first day of month (it is decreased because getValue starts with 1 and buttonArray with 0)
int dayNo = 1; // variable that is used to set number of day in the setText() method of button
int month = (dateNow.getMonth().getValue() - 1); // variable that has a number of the previous month, that is why I decreased it by 1
int year = dateNow.getYear(); // getting current year
if (month == 0){ // safety - when the month variable hits 0 it is set for December (no 12) and year is decreased by 1
month = 12;
year --;
}
LocalDate previousMonthDate = LocalDate.of(year, month, 1); // a new variable for the previous month
int dayNo2 = previousMonthDate.lengthOfMonth() - (firstDayIndex - 1); // getting number of days of the previous mont (similar to dayNo but it responsible for the previous month during displaying
for (int i = 0; i < firstDayIndex; i++){ // loop that fill days in buttons that represent previous month
buttonArray[i].setText(""+dayNo2);
buttonArray[i].setVisible(true);
buttonArray[i].setEnabled(false);
buttonArray[i].setBackground(buttonColorInactive);
dayNo2++;
}
for (int i = firstDayIndex; i < noOfDays + firstDayIndex; i++){ // loop that fill days in buttons that represent current month
buttonArray[i].setText(""+dayNo);
buttonArray[i].setVisible(true);
if (i == 6 || i == 13 || i == 20 || i == 27 || i == 34 || i == 41){
buttonArray[i].setBackground(sundey);
}
else if (i == 5 || i == 12 || i == 19 || i == 26 || i == 33 || i == 40){
buttonArray[i].setBackground(saturday);
}
else{
buttonArray[i].setBackground(buttonColor);
}
monthYear.setText(""+translate(dateNow.getMonth().getValue())+" "+year); // "translate()" method is used for translating month names from English to my native language
dayNo++;
}
dayNo = 1; // setting dayNo 1 because next month always starts with 1
for (int i = (noOfDays + firstDayIndex); i < 42; i++){ // loop that fills the rest, empty buttons that represent next month
buttonArray[i].setText(""+ dayNo);
buttonArray[i].setVisible(true);
buttonArray[i].setEnabled(false);
buttonArray[i].setBackground(buttonColorInactive);
dayNo++;
}
}
// Method for translating English names to my native Language
private String translate(int a){
String monthInPolish = "";
switch (dateNow.getMonth()){
case JANUARY: monthInPolish = "Styczeń"; break;
case FEBRUARY: monthInPolish = "Luty"; break;
case MARCH: monthInPolish = "Marzec"; break;
case APRIL: monthInPolish = "Kwiecień"; break;
case MAY: monthInPolish = "Maj"; break;
case JUNE: monthInPolish = "Czerwiec"; break;
case JULY: monthInPolish = "Lipiec"; break;
case AUGUST: monthInPolish = "Sierpień"; break;
case SEPTEMBER: monthInPolish = "Wrzesień"; break;
case OCTOBER: monthInPolish = "Październik"; break;
case NOVEMBER: monthInPolish = "Listopad"; break;
case DECEMBER: monthInPolish = "Grudzień"; break;
}
return monthInPolish;
}
}
Метод, о котором я говорю, называется calendarGenerator()
Спасибо за усилие!
Вот как это выглядит, когда я использую этот метод в конструкторе
Вот так это выглядит, когда я не использовать этот метод в конструкторе
Редактировать: я добавил фотографии того, как это выглядит, когда я использую метод calendarGenerator()
в конструктор и когда этот метод не используется. Используя этот метод в этой форме (как показано выше), когда кнопка нажата, я хотел проверить правильность моего подхода (я знаю, что могу посылать аргументы и, таким образом, использовать его для переключения месяцев). Поэтому я удалил метод calendarGenerator()
из конструктора (на втором рисунке показано, как программа выглядит без него) и поместил его в метод ActionPerformed для кнопки (эта черная стрелка). Я думал, что когда я нажимаю кнопку, окно изменит внешний вид, чтобы оно выглядело так, как на первом изображении, но только текст на этикетке выше ничего не меняет, и я до сих пор не знаю, почему.