Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

godred

[JAVA] GregorianCalendar

Rekomendowane odpowiedzi

Witam, zaczynam dopiero z JAVĄ, może mi ktoś wskazać, jaki błąd robię, że w eclipse przy linijkach miesięcy dostaję komunikat:

The static field Calendar.DanyMiesiąc should be accessed in a static way

Kod:

               GregorianCalendar nowDate = new GregorianCalendar();
	int yearNow = nowDate.get(Calendar.YEAR);
	int monthNameNow = nowDate.get(Calendar.MONTH);
	int dayNow = nowDate.get(Calendar.DAY_OF_MONTH);
	int dayNameNow = nowDate.get(Calendar.DAY_OF_WEEK);	

	// Miesiące
	if      (monthNameNow == nowDate.JANUARY)   {monthOfYear = 1;  dayOfMonth = 31; nameMonth = "Styczeń";}
	else if (monthNameNow == nowDate.FEBRUARY)  {monthOfYear = 2;  dayOfMonth = 28; nameMonth = "Luty";} 
	else if (monthNameNow == nowDate.MARCH)     {monthOfYear = 3;  dayOfMonth = 31; nameMonth = "Marzec";}
	else if (monthNameNow == nowDate.APRIL)     {monthOfYear = 4;  dayOfMonth = 30; nameMonth = "Kwiecień";}
	else if (monthNameNow == nowDate.MAY)       {monthOfYear = 5;  dayOfMonth = 31; nameMonth = "Maj";}
	else if (monthNameNow == nowDate.JUNE)      {monthOfYear = 6;  dayOfMonth = 30; nameMonth = "Czerwiec";}
	else if (monthNameNow == nowDate.JULY)      {monthOfYear = 7;  dayOfMonth = 31; nameMonth = "Lipiec";}
	else if (monthNameNow == nowDate.AUGUST)    {monthOfYear = 8;  dayOfMonth = 31; nameMonth = "Sierpień";}
	else if (monthNameNow == nowDate.SEPTEMBER) {monthOfYear = 9;  dayOfMonth = 30; nameMonth = "Wrzesień";}
	else if (monthNameNow == nowDate.OCTOBER)   {monthOfYear = 10; dayOfMonth = 31; nameMonth = "Październik";}
	else if (monthNameNow == nowDate.NOVEMBER)  {monthOfYear = 11; dayOfMonth = 30; nameMonth = "Listopad";}
	else if (monthNameNow == nowDate.DECEMBER)  {monthOfYear = 12; dayOfMonth = 31; nameMonth = "Grudzień";}

Kod się uruchamia, jedynie są ostrzeżenia.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam wrazenie ze nie wrzuciles tej linijki w ktorej jest warning :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Chodzi o to, że uwagi są przy linijkach w instrukcjach if i else if w miesiącach. Co więcej może powodować uwagi w tych linijkach. Program nie ma nic rozbudowanego. Na razie wyświetla sam układ kalendarza.

Cały kod:

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.print.DocFlavor.STRING;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

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

public class Kalendarz extends JFrame implements ActionListener {

int dayOfWeek, monthOfYear, dayOfMonth;
String[] aMiesiace = new String[12];
JLabel lMonth, lMonday, lTuesday, lWenesday, lThursday, lFriday, lSaturday, lSunday;
String nameMonth;

public Kalendarz()
{
	setSize(1000,715);
	setLocation(100, 100);
	setTitle("Kalendarz 0.1v");
	setLayout(null);
	setResizable(false);

	// nadanie wyglądu - Nimbus
	try {
		UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
	} catch (ClassNotFoundException | InstantiationException
			| IllegalAccessException | UnsupportedLookAndFeelException e) {
		e.printStackTrace();
	}
	SwingUtilities.updateComponentTreeUI(this);

	// Kalendarz - utworzenie
	GregorianCalendar nowDate = new GregorianCalendar();
	int yearNow = nowDate.get(Calendar.YEAR);
	int monthNameNow = nowDate.get(Calendar.MONTH);
	int dayNow = nowDate.get(Calendar.DAY_OF_MONTH);
	int dayNameNow = nowDate.get(Calendar.DAY_OF_WEEK);	

	// Miesiące
	if      (monthNameNow == nowDate.JANUARY)   {monthOfYear = 1;  dayOfMonth = 31; nameMonth = "Styczeń";}
	else if (monthNameNow == nowDate.FEBRUARY)  {monthOfYear = 2;  dayOfMonth = 28; nameMonth = "Luty";} 
	else if (monthNameNow == nowDate.MARCH)     {monthOfYear = 3;  dayOfMonth = 31; nameMonth = "Marzec";}
	else if (monthNameNow == nowDate.APRIL)     {monthOfYear = 4;  dayOfMonth = 30; nameMonth = "Kwiecień";}
	else if (monthNameNow == nowDate.MAY)       {monthOfYear = 5;  dayOfMonth = 31; nameMonth = "Maj";}
	else if (monthNameNow == nowDate.JUNE)      {monthOfYear = 6;  dayOfMonth = 30; nameMonth = "Czerwiec";}
	else if (monthNameNow == nowDate.JULY)      {monthOfYear = 7;  dayOfMonth = 31; nameMonth = "Lipiec";}
	else if (monthNameNow == nowDate.AUGUST)    {monthOfYear = 8;  dayOfMonth = 31; nameMonth = "Sierpień";}
	else if (monthNameNow == nowDate.SEPTEMBER) {monthOfYear = 9;  dayOfMonth = 30; nameMonth = "Wrzesień";}
	else if (monthNameNow == nowDate.OCTOBER)   {monthOfYear = 10; dayOfMonth = 31; nameMonth = "Październik";}
	else if (monthNameNow == nowDate.NOVEMBER)  {monthOfYear = 11; dayOfMonth = 30; nameMonth = "Listopad";}
	else if (monthNameNow == nowDate.DECEMBER)  {monthOfYear = 12; dayOfMonth = 31; nameMonth = "Grudzień";}

	// Dni tygodnia
	if      (dayNameNow == nowDate.MONDAY)	  dayOfWeek = 1;
	else if (dayNameNow == nowDate.TUESDAY)	  dayOfWeek = 2;
	else if (dayNameNow == nowDate.WEDNESDAY) dayOfWeek = 3;
	else if (dayNameNow == nowDate.THURSDAY)  dayOfWeek = 4;
	else if (dayNameNow == nowDate.FRIDAY)	  dayOfWeek = 5;
	else if (dayNameNow == nowDate.SATURDAY)  dayOfWeek = 6;
	else if (dayNameNow == nowDate.SUNDAY)	  dayOfWeek = 7;		

	// etykiety dni tygodnia
	lMonth = new JLabel(nameMonth);
	lMonth.setBounds(295, -25, 90, 90);
	lMonth.setFont(new Font("Arial", Font.BOLD, 20));
	add(lMonth);

	lMonday = new JLabel("Poniedziałek");
	lMonday.setBounds(16, 5, 90, 90);
	lMonday.setFont(new Font("Arial", Font.BOLD, 12));
	add(lMonday);

	lTuesday = new JLabel("Wtorek");
	lTuesday.setBounds(124, 5, 90, 90);
	lTuesday.setFont(new Font("Arial", Font.BOLD, 12));
	add(lTuesday);

	lWenesday = new JLabel("Środa");
	lWenesday.setBounds(216, 5, 90, 90);
	lWenesday.setFont(new Font("Arial", Font.BOLD, 12));
	add(lWenesday);

	lThursday = new JLabel("Czwartek");
	lThursday.setBounds(296, 5, 90, 90);
	lThursday.setFont(new Font("Arial", Font.BOLD, 12));
	add(lThursday);

	lFriday = new JLabel("Piątek");
	lFriday.setBounds(394, 5, 90, 90);
	lFriday.setFont(new Font("Arial", Font.BOLD, 12));
	add(lFriday);

	lSaturday = new JLabel("Sobota");
	lSaturday.setBounds(482, 5, 90, 90);
	lSaturday.setFont(new Font("Arial", Font.BOLD, 12));
	add(lSaturday);

	lSunday = new JLabel("Niedziela");
	lSunday.setBounds(568, 5, 90, 90);
	lSunday.setFont(new Font("Arial", Font.BOLD, 12));
	add(lSunday);

	JButton button[]=new JButton[42];
	int j=0, k=0, l=-1;
	int dayHas = 14 + dayOfWeek - dayNow;
	for(int i=0;i<42;i++){
		if(i%7==0 && i!=0){
			j=0;
			k++;
		}
		button[i] = new JButton();			
		if(dayHas <= i)
			l++;
		if(l>=0 && l<dayOfMonth)
			button[i].setText(Integer.toString(l+1));	
		if(l==dayNow-1)
			button[i].setForeground(Color.RED);

		button[i].setFont(new Font("Arial", Font.BOLD, 18));
		button[i].setBounds(10+(j*90), 60+(k*105), 85, 100);
		button[i].addActionListener(this);
		add(button[i]);	
		j++;
	}	



}

public void actionPerformed(ActionEvent e) {

}

public static void main(String args[])
{
	Kalendarz app = new Kalendarz();
	app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	app.setVisible(true);
}

}

Podobne błędy wyskakują przy dniach tygodnia.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Chodzi o to, że JANUARY, FEBRUARY, MONDAY, THUESDAY, itd to statyczne pola klasy GregorianCalendar, więc powinieneś się do nich odwoływać przez klasy, a nie obiekt - instancję klasy, t.j. poprzez GregorianCalendar.JANUARY itd.

 

Poza tym poczytaj sobie o instrukcji switch w Javie :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Chodzi o to, że JANUARY, FEBRUARY, MONDAY, THUESDAY, itd to statyczne pola klasy GregorianCalendar, więc powinieneś się do nich odwoływać przez klasy, a nie obiekt - instancję klasy, t.j. poprzez GregorianCalendar.JANUARY itd.

 

Poza tym poczytaj sobie o instrukcji switch w Javie :)

Tylko czy mogę stosować tak jak jest czy jednak robić tak jak napisałęś?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tylko czy mogę stosować tak jak jest czy jednak robić tak jak napisałęś?

 

Możesz, w sensie że będzie to działać. Aczkolwiek podobno nie jest to zalecane, choć nie znalazłem jakiegoś racjonalnego wytłumaczenia.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Możesz, w sensie że będzie to działać. Aczkolwiek podobno nie jest to zalecane, choć nie znalazłem jakiegoś racjonalnego wytłumaczenia.

Wytłumaczenie jest takie, że wywołanie statycznej metody przez referencje do obiektu może wprowadzać mylne wrażenie, że faktycznie uruchamiasz coś na rzecz konkretnej instancji. Klasyczny przykład to usypianie wątku:

 

	Thread t = new Thread(new Runnable() {
		@Override
		public void run() {
			// jakis kod watku
		}
	});

I teraz po wystartowaniu wątku, wywołując

 

t.sleep(1000);

może się wydawać, że to wątek na który wskazuje refrencja t, zostanie uśpiony, tymczasem sleep jest statyczną metodą klasy Thread, która usypia aktualnie wykonywany wątek. Stąd wywołanie:

 

Thread.sleep(1000);

jest czytelniejsze.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki waszym wypowiedziom zrozumiałem, dlaczego mi nie działał 'switch', gdyż nowDate.JANUARY to nie Calendar.JANUARY (w przypadku pierwszego nie da się w ogóle zrobić 'switch-a')

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...