• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kalendarz graficzny w Java

VPS Starter Arubacloud
0 głosów
881 wizyt
pytanie zadane 19 marca 2021 w Java przez Maciek273 Początkujący (450 p.)

Mam taki kod w języku Java. Po uruchomieniu pokazuje on aktualny miesiąc.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JPanel {
    
SimpleDateFormat month = new SimpleDateFormat("MMMM");
SimpleDateFormat year = new SimpleDateFormat("yyyy");
SimpleDateFormat day = new SimpleDateFormat("d");
Date date = new Date();

public void setDate(Date date) {
this.date = date;
}

public void paintComponent(Graphics g) {
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);

g.setFont(new Font("TimesRoman", Font.PLAIN, 17));
g.setColor(Color.black);
g.drawString(month.format(date).toUpperCase(), 34, 36);
g.setColor(Color.black);
g.drawString(year.format(date), 235, 36);


g.setFont(new Font("TimesRoman", Font.PLAIN, 10));
Calendar today = Calendar.getInstance();
today.setTime(date);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.DATE, 1);
cal.add(Calendar.DATE, - cal.get(Calendar.DAY_OF_WEEK) + 1);

for (int week = 0; week < 5; week++) {
    for (int d = 0; d < 7; d++) {
            g.drawString(day.format(cal.getTime()), d * 30 + 46 + 4,week * 29 + 81 + 20);
            cal.add(Calendar.DATE, +1);
        }
    }
}

public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().setBackground(Color.white);
frame.setPreferredSize(new Dimension(700, 500));
Main ch = new Main();
ch.setDate(new Date());
frame.getContentPane().add(ch);
frame.setUndecorated(true);
frame.pack();
frame.setVisible(true);
}
}

Chciałbym, aby wyświetlał się cały rok, a nie tylko jeden miesiąc. Oprócz tego jeśli wyświetla się miesiąc, w tym przypadu marzec, to pojawia się także jeden dzień lutego oraz kilka dnia kwietnia. W jaki sposób mogę zmienić kolor wszystkich dni, które nie są w bieżącym miesiącu?

1 odpowiedź

+1 głos
odpowiedź 20 marca 2021 przez Wiciorny Ekspert (269,120 p.)
wybrane 21 listopada 2021 przez Maciek273
 
Najlepsza
for (int week = 0; week < 5; week++) {
    for (int d = 0; d < 7; d++) {
            g.drawString(day.format(cal.getTime()), d * 30 + 46 + 4,week * 29 + 81 + 20);
            cal.add(Calendar.DATE, +1);
        }
    }
}

miesiąc ma 31 dni, względnie 30 dni- u Ciebie ma 35- stąd dodaje Ci elementy- nie uwzględniasz warunków
Dodatkowo jak chces wyświetlić wszystkie miesiące skoro funkcjonalność bazujesz tylko dla 1 miesiąca? 

Brakuje tu logiki w kodzie. 

1
komentarz 20 marca 2021 przez Wiciorny Ekspert (269,120 p.)

Masz skorzystaj z logiki :) 

public class JavaSwingCalendar extends JFrame {

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

    JavaSwingCalendar (String title) {
        Calendar cal = Calendar.getInstance();
        int lastday = cal.getActualMaximum(Calendar.DATE);
        cal.add(Calendar.DATE, -cal.get(Calendar.DATE) + 1);
        int offset = cal.get(Calendar.DAY_OF_WEEK) - 1;

        setTitle(title);
        setSize(250, 250);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel p = new JPanel();
        p.setLayout(new GridLayout(0, 7));
        ArrayList<JLabel> labelArray = new ArrayList<JLabel>();

        for (int i = 0; i < offset; i++)
            labelArray.add(new JLabel(" "));

        for (int i = 1; i <= lastday; i++)
            labelArray.add(new JLabel(String.valueOf(i)));

        Iterator<JLabel> ite = labelArray.iterator();

        while (ite.hasNext()) {
            JLabel label = (JLabel) ite.next();
            label.setHorizontalAlignment(JLabel.TRAILING);
            p.add(label);
        }

        getContentPane().add(p, BorderLayout.CENTER);
    }

}

 

komentarz 20 marca 2021 przez Maciek273 Początkujący (450 p.)

@Wiciorny, Rozumiem o co chodzi, ale chce żeby te elementy były, tylko żeby miały inny kolor. Dni marca niech będą czarne, a pozostałe szare.

1
komentarz 20 marca 2021 przez Wiciorny Ekspert (269,120 p.)
No to biorąc już pod uwagę twoje rozwiązanie niezbyt dobre czy efektywne pomyśl jaki warunek to musi spełnić?

Skoro zawsze lecisz 5 tygodni, to powinieneś liczyć miesiąc od kiedy? Od 1 ... dnia do 30/31... pozostałe wartości jesli pojawią się jako pierwsze powinny być w innym miesiącu czyli czerwone? Będzie ich mniej stąd może defaultowo wszystko oznaczać na czerwono, a w momencie kiedy natrafisz na 1 dzień ( danego miesiąca, bo będzie miał wartość 1- to zmieniać kolor, tak długo aż do kolejnego wystąpienia dnia 1-szego lub, końca miesiąca) 30-31  iteracji.
i wtedy dany "D" dzień sprawdzasz jego aktualny stad - nr, i odpowiednio kolorujesz.

Podobne pytania

0 głosów
0 odpowiedzi 112 wizyt
pytanie zadane 2 września 2020 w JavaScript przez syjamski Nowicjusz (120 p.)
0 głosów
1 odpowiedź 112 wizyt
pytanie zadane 15 czerwca 2020 w JavaScript przez Gamin Użytkownik (720 p.)
0 głosów
1 odpowiedź 1,010 wizyt
pytanie zadane 13 czerwca 2020 w HTML i CSS przez KumberTwo Dyskutant (8,270 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...