Does the code now put the starting 1 for the days of a month in the correct column?
Welcome to the Java Programming Forums
The professional, friendly Java community. 21,500 members and growing!
The Java Programming Forums are a community of Java programmers from all around the World. Our members have a wide range of skills and they all have one thing in common: A passion to learn and code Java. We invite beginner Java programmers right through to Java professionals to post here and share your knowledge. Become a part of the community, help others, expand your knowledge of Java and enjoy talking with like minded people. Registration is quick and best of all free. We look forward to meeting you.
>> REGISTER NOW TO START POSTING
Members have full access to the forums. Advertisements are removed for registered users.
Does the code now put the starting 1 for the days of a month in the correct column?
If you don't understand my answer, don't ignore it, ask a question.
yes it is fix now
how fix button color problem now?
When I execute the code, the first row of days is all blanks for the starting date of 1442/09/16.yes it is fix now
Is that the desired display?
When I change the date to 1442/11/16, then there is a 1 in the last column on the first row.
If you don't understand my answer, don't ignore it, ask a question.
Since it is not a problem all the other months, it is not a problem, especially if I can disable empty buttons, but if you have a better solution, we will do it.
In Gregory and jalali calendars, instead of the first row, the last row is empty in some months
It just seems sloppy and a poor way to write a program. You need to find the correct equation to compute the correct value of dayNo.
You never answered this question:
What value does dayNo need to have to place a 1 in the last column of the first row?
If you don't understand my answer, don't ignore it, ask a question.
In the last column to the number 7 and in the first column to the number 1
Since it is not a problem all the other months, it is not a problem, especially if I can disable empty buttons, but if you have a better solution, we will do it.
In Gregory and jalali calendars, instead of the first row, the last row is empty in some months
You never answered this question:
What value does dayNo need to have to place a 1 in the last column of the first row?
See post#122 - change dayNo until the 1 is in the last column. What value did dayNo have for that to happen?
If you don't understand my answer, don't ignore it, ask a question.
i answer that in #123 and #131
Sorry, I do not see the answer. I would expect to see something like this:i answer that in #123 and #131
The value in dayNo = xxxx for the 1 to go into the last column.
(where xxxx is a number between -100 and 100)
For example:
The value in dayNo = 1 for the 1 to go into the first column.
The value in dayNo = 0 for the 1 to go into the second column.
If you don't understand my answer, don't ignore it, ask a question.
cnmeysam (April 28th, 2021)
Is there a way to never have an empty row?
--- Update ---
like this
private void reflushWeekAndDay() { ye = (Integer) yearSpin.getValue(); mo = (Integer) monthSpin.getValue(); System.out.println("spinner ye " + ye); System.out.println("spinner mo " + mo); Locale ar = new Locale("ar"); DateTimeFormatter dayOfMoonNum = DateTimeFormatter.ofPattern("d", ar); DateTimeFormatter dayOfweekNum = DateTimeFormatter.ofPattern("c", ar); HijrahDate hijrahDate = HijrahChronology.INSTANCE.date(ye, mo, da); HijrahChronology crono = hijrahDate.getChronology(); HijrahDate date = crono.date(ye, mo, da); System.out.println("crono date= " + date); String MoondayNum = hijrahDate.format(dayOfMoonNum); String WeekdayNum = hijrahDate.format(dayOfweekNum); int WeekdayNumb = Integer.parseInt(WeekdayNum); int moondayNumb = Integer.parseInt(MoondayNum); int moondaysnumber = hijrahDate.lengthOfMonth(); System.out.println("hijrahDate= " + hijrahDate); System.out.println("Number day-of-month " + moondayNumb); System.out.println("Number day-of-Week " + WeekdayNumb); System.out.println("Number of days of the month " + moondaysnumber); int maxDayNo = moondaysnumber; System.out.println("Number of days of the month " + moondaysnumber); int dayNo = -4 - WeekdayNumb; // int dayNo = 0; System.out.println("dayNo " + dayNo); for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { String s = ""; if (dayNo >= 1 && dayNo <= maxDayNo) { s = String.valueOf(dayNo); } daysButton[i][j].setText(s); dayNo++; if (daysButton[i][j].getText().equals("")){ daysButton[i][j].setVisible(false); } }
Is there a problem with this simple question?
What value does dayNo need to have to place a 1 in the last column of the first row?
If you are done with the code, please post solved, otherwise describe the problem in more details.
Maybe the people at this forum would be more helpful:
http://www.coderanch.com/forums
If you don't understand my answer, don't ignore it, ask a question.
in the #135 i solved button's visible problem but i cant fix JDialog Hight after empty button's visible false
In the calendar, day 1 can not always be in the last button, it must be in the desired day
In the last column to the number -6 and in the first column to the number 1
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import java.text.Format; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.chrono.HijrahChronology; import java.time.chrono.HijrahDate; import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; import java.util.Locale; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SpinnerNumberModel; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.border.LineBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class Hijrah extends JTextField { int ye; int mo; int da; String[] moonNames = {"ٱلْمُحَرَّم", "صَفَر", "رَبِيع ٱلْأَوَّل", "رَبِيع ٱلثَّانِي", "جُمَادَىٰ ٱلْأُولَىٰ", "جُمَادَىٰ ٱلثَّانِيَة", "رَجَب", "شَعْبَان", "رَمَضَان", "شَوَّال", "ذُو ٱلْقَعْدَة", "ذُو ٱلْحِجَّة"}; //String[] moonNames = {"al-Muḥarram", "Ṣafar", "Rabīʿ al-ʾAwwal", "Rabīʿ ath-Thānī", "Jumadā al-ʾŪlā", "Jumādā ath-Thāniyah", "Rajab", "Shaʿbān", "Ramaḍān", "Shawwāl", "Ḏū al-Qaʿdah", "Ḏū al-Ḥijjah"}; JLabel monthNameLabel = new JLabel(); // get name from array private static String DEFAULT_DATE_FORMAT = "yyyy/MM/dd"; private static final int DIALOG_WIDTH = 270; private static final int DIALOG_HEIGHT = 210; private SimpleDateFormat dateFormat; private DatePanel datePanel = null; private JDialog dateDialog = null; public void hdate() { HijrahDate hijrahDate = HijrahDate.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); String formatted = formatter.format(hijrahDate); // 07/03/1439 ye = Integer.parseInt(formatted.substring(0, 4)); mo = Integer.parseInt(formatted.substring(5, 7)); da = Integer.parseInt(formatted.substring(8, 10)); } // public Hijrah() { // this(new Date()); // } public Hijrah(String dateFormatPattern, Date date) { this(); DEFAULT_DATE_FORMAT = dateFormatPattern; } public Hijrah() { hdate(); setDate(); setEditable(false); setCursor(new Cursor(Cursor.HAND_CURSOR)); addListeners(); } private void addListeners() { addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent paramMouseEvent) { if (datePanel == null) { datePanel = new DatePanel(); } Point point = getLocationOnScreen(); point.y = point.y + 30; showDateDialog(datePanel, point); } }); } private void showDateDialog(DatePanel dateChooser, Point position) { Frame owner = (Frame) SwingUtilities .getWindowAncestor(Hijrah.this); if (dateDialog == null || dateDialog.getOwner() != owner) { dateDialog = createDateDialog(owner, dateChooser); } dateDialog.setLocation(getAppropriateLocation(owner, position)); dateDialog.setVisible(true); } private JDialog createDateDialog(Frame owner, JPanel contentPanel) { JDialog dialog = new JDialog(owner, "Date Selected", false);// Non-modal // JDialog dialog = new JDialog(owner, "Date Selected", true); dialog.setUndecorated(true); dialog.getContentPane().add(contentPanel, BorderLayout.CENTER); dialog.pack(); dialog.setSize(DIALOG_WIDTH, DIALOG_HEIGHT); dialog.addWindowFocusListener(new WindowFocusListener() { public void windowLostFocus(WindowEvent e) { dialog.setVisible(false); } public void windowGainedFocus(WindowEvent e) { } }); return dialog; } private Point getAppropriateLocation(Frame owner, Point position) { Point result = new Point(position); Point p = owner.getLocation(); int offsetX = (position.x + DIALOG_WIDTH) - (p.x + owner.getWidth()); int offsetY = (position.y + DIALOG_HEIGHT) - (p.y + owner.getHeight()); if (offsetX > 0) { result.x -= offsetX; } if (offsetY > 0) { result.y -= offsetY; } return result; } private SimpleDateFormat getDefaultDateFormat() { if (dateFormat == null) { dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT); } return dateFormat; } public void setText() { setDate(); } public void setDate() { super.setText(testMethod()); //<<<<< Changed } public Date getDate() { try { return getDefaultDateFormat().parse(getText()); } catch (ParseException e) { return new Date(); } } private class DatePanel extends JPanel implements ChangeListener { int startYear = 1380; int lastYear = 3050; Color backGroundColor = Color.gray; Color palletTableColor = Color.white; Color todayBackColor = Color.orange; Color weekFontColor = Color.blue; Color dateFontColor = Color.black; Color weekendFontColor = Color.red; Color controlLineColor = Color.GREEN; Color controlTextColor = new java.awt.Color(153, 0, 153); Color controlMoonnameTextColor = Color.BLUE; JSpinner yearSpin; JSpinner monthSpin; JButton[][] daysButton = new JButton[8][7]; DatePanel() { setLayout(new BorderLayout()); setBorder(new LineBorder(backGroundColor, 2)); setBackground(backGroundColor); JPanel topYearAndMonth = createYearAndMonthPanal(); add(topYearAndMonth, BorderLayout.NORTH); JPanel centerWeekAndDay = createWeekAndDayPanal(); add(centerWeekAndDay, BorderLayout.CENTER); reflushWeekAndDay(); } private JPanel createYearAndMonthPanal() { Font font = new Font("Tahoma", Font.BOLD, 12); Calendar cal = getCalendar(); int currentYear = cal.get(Calendar.YEAR); int currentMonth = cal.get(Calendar.MONTH) + 1; JPanel panel = new JPanel(); panel.setLayout(new FlowLayout()); panel.setBackground(controlLineColor); JLabel yearLabel = new JLabel("السنة"); yearLabel.setForeground(controlTextColor); yearLabel.setHorizontalAlignment(SwingConstants.CENTER); yearLabel.setVerticalAlignment(SwingConstants.CENTER); yearLabel.setFont(font); panel.add(yearLabel); yearSpin = new JSpinner(new SpinnerNumberModel(currentYear, startYear, lastYear, 1)); yearSpin.setPreferredSize(new Dimension(60, 30)); yearSpin.setName("Month"); yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, "####")); yearSpin.addChangeListener(this); panel.add(yearSpin); monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth, 1, 12, 1)); monthSpin.setPreferredSize(new Dimension(45, 30)); monthSpin.setName("Year"); monthSpin.addChangeListener(this); monthNameLabel.setPreferredSize(new Dimension(60, 20)); monthNameLabel.setForeground(controlTextColor); monthNameLabel.setHorizontalAlignment(SwingConstants.CENTER); monthNameLabel.setVerticalAlignment(SwingConstants.CENTER); monthNameLabel.setFont(font); monthNameLabel.setText(moonNames[(Integer) monthSpin.getValue() - 1]); // get name from array panel.add(monthNameLabel); panel.add(monthSpin); JLabel monthLabel = new JLabel("الشهر"); monthLabel.setForeground(controlTextColor); monthLabel.setHorizontalAlignment(SwingConstants.CENTER); monthLabel.setVerticalAlignment(SwingConstants.CENTER); monthLabel.setFont(font); panel.add(monthLabel); return panel; } private JPanel createWeekAndDayPanal() { String colname[] = {"سب", "اح", "ثن", "ثل", "ار", "خم", "جم"}; // String colname[] = {"Sa", "sun", "Mon", "Tu", "We", "Th", "Fr"}; JPanel panel = new JPanel(); panel.setFont(new Font("Arial", Font.PLAIN, 10)); panel.setLayout(new GridLayout(7, 7)); panel.setBackground(Color.white); for (int i = 0; i < 7; i++) { JLabel cell = new JLabel(colname[i]); cell.setHorizontalAlignment(JLabel.CENTER); if (i == 6) { cell.setForeground(weekendFontColor); } else { cell.setForeground(weekFontColor); } panel.add(cell); } int actionCommandId = 0; for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { JButton numBtn = new JButton(); numBtn.setBorder(null); numBtn.setHorizontalAlignment(SwingConstants.CENTER); numBtn.setActionCommand(String.valueOf(actionCommandId)); numBtn.setBackground(palletTableColor); numBtn.setForeground(dateFontColor); numBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { JButton source = (JButton) event.getSource(); if (source.getText().length() == 0) { return; } dayColorUpdate(true); source.setForeground(todayBackColor); int newDay = Integer.parseInt(source.getText()); Calendar cal = getCalendar(); cal.set(Calendar.DAY_OF_MONTH, newDay); setDate(); dateDialog.setVisible(false); } }); if (j == 6) { numBtn.setForeground(weekendFontColor); } else { numBtn.setForeground(dateFontColor); } daysButton[i][j] = numBtn; panel.add(numBtn); actionCommandId++; } } return panel; } private Calendar getCalendar() { Calendar calendar = Calendar.getInstance(); calendar.setTime(getDate()); return calendar; } private int getSelectedYear() { return ((Integer) yearSpin.getValue()).intValue(); } private int getSelectedMonth() { return ((Integer) monthSpin.getValue()).intValue(); } private void dayColorUpdate(boolean isOldDay) { ye = (Integer) yearSpin.getValue(); mo = (Integer) monthSpin.getValue(); System.out.println("spinner ye " + ye); System.out.println("spinner mo " + mo); Locale ar = new Locale("ar"); DateTimeFormatter dayOfMoonNum = DateTimeFormatter.ofPattern("d", ar); DateTimeFormatter dayOfweekNum = DateTimeFormatter.ofPattern("c", ar); HijrahDate hijrahDate = HijrahChronology.INSTANCE.date(ye, mo, da); String MoondayNum = hijrahDate.format(dayOfMoonNum); String WeekdayNum = hijrahDate.format(dayOfweekNum); int WeekdayNumb = Integer.parseInt(WeekdayNum); int moondayNumb = Integer.parseInt(MoondayNum); int moondaysnumber = hijrahDate.lengthOfMonth(); System.out.println("hijrahDate= " + hijrahDate); System.out.println("Number day-of-month " + MoondayNum); System.out.println("Number day-of-Week " + WeekdayNum); System.out.println("Number of days of the month " + moondaysnumber); int actionCommandId = moondayNumb + 4 + WeekdayNumb; int i = actionCommandId / 7; int j = actionCommandId % 7; if (isOldDay) { daysButton[i][j].setForeground(dateFontColor); } else { daysButton[i][j].setForeground(todayBackColor); } } private void reflushWeekAndDay() { ye = (Integer) yearSpin.getValue(); mo = (Integer) monthSpin.getValue(); System.out.println("spinner ye " + ye); System.out.println("spinner mo " + mo); Locale ar = new Locale("ar"); DateTimeFormatter dayOfMoonNum = DateTimeFormatter.ofPattern("d", ar); DateTimeFormatter dayOfweekNum = DateTimeFormatter.ofPattern("c", ar); HijrahDate hijrahDate = HijrahChronology.INSTANCE.date(ye, mo, da); HijrahChronology crono = hijrahDate.getChronology(); HijrahDate date = crono.date(ye, mo, da); System.out.println("crono date= " + date); String MoondayNum = hijrahDate.format(dayOfMoonNum); String WeekdayNum = hijrahDate.format(dayOfweekNum); int WeekdayNumb = Integer.parseInt(WeekdayNum); int moondayNumb = Integer.parseInt(MoondayNum); int moondaysnumber = hijrahDate.lengthOfMonth(); System.out.println("hijrahDate= " + hijrahDate); System.out.println("Number day-of-month " + moondayNumb); System.out.println("Number day-of-Week " + WeekdayNumb); System.out.println("Number of days of the month " + moondaysnumber); int maxDayNo = moondaysnumber; System.out.println("Number of days of the month " + moondaysnumber); int dayNo = -4 - WeekdayNumb; // int dayNo = 0; System.out.println("dayNo " + dayNo); for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { String s = ""; if (dayNo >= 1 && dayNo <= maxDayNo) { s = String.valueOf(dayNo); } daysButton[i][j].setText(s); dayNo++; if (daysButton[i][j].getText().equals("")){ daysButton[i][j].setVisible(false); } } } dayColorUpdate(false); } public void stateChanged(ChangeEvent e) { dayColorUpdate(true); JSpinner source = (JSpinner) e.getSource(); Calendar cal = getCalendar(); if (source.getName().equals("Year")) { cal.set(Calendar.YEAR, getSelectedYear()); } else { cal.set(Calendar.MONTH, getSelectedMonth() - 1); } setDate(); reflushWeekAndDay(); mothnam(); } } public void mothnam() { monthNameLabel.setText(moonNames[mo - 1]); } String testMethod() { // ADDED DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); HijrahDate today = HijrahChronology.INSTANCE.date(ye, mo, da); String formatted = formatter.format(today); // 07/03/1439 // System.out.println("hijrahDate " + formatted); return formatted.toString(); //<<<<<< ADDED } }
With this code:In the last column to the number -6 and in the first column to the number 1The first row is all blanks. There is a 1 in the first column in the second row.dayNo = -6;
I was looking for the value of dayNo that would put the 1 in the last column of the first row.
Yes, of course, that is correct. Does the code put the 1 in the correct column for all the months?day 1 can not always be in the last button, it must be in the desired day
Leaving a empty row does not look like a good solution.
If you don't understand my answer, don't ignore it, ask a question.
in this code now put the 1 in the correct column for all the months but Empty spaces in the first or last row are not very interesting in some months
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import java.text.Format; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.chrono.HijrahChronology; import java.time.chrono.HijrahDate; import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; import java.util.Locale; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SpinnerNumberModel; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.border.LineBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class Hijrah extends JTextField { int ye; int mo; int da; String[] moonNames = {"ٱلْمُحَرَّم", "صَفَر", "رَبِيع ٱلْأَوَّل", "رَبِيع ٱلثَّانِي", "جُمَادَىٰ ٱلْأُولَىٰ", "جُمَادَىٰ ٱلثَّانِيَة", "رَجَب", "شَعْبَان", "رَمَضَان", "شَوَّال", "ذُو ٱلْقَعْدَة", "ذُو ٱلْحِجَّة"}; //String[] moonNames = {"al-Muḥarram", "Ṣafar", "Rabīʿ al-ʾAwwal", "Rabīʿ ath-Thānī", "Jumadā al-ʾŪlā", "Jumādā ath-Thāniyah", "Rajab", "Shaʿbān", "Ramaḍān", "Shawwāl", "Ḏū al-Qaʿdah", "Ḏū al-Ḥijjah"}; JLabel monthNameLabel = new JLabel(); // get name from array private static String DEFAULT_DATE_FORMAT = "yyyy/MM/dd"; private static final int DIALOG_WIDTH = 270; private static final int DIALOG_HEIGHT = 210; private SimpleDateFormat dateFormat; private DatePanel datePanel = null; private JDialog dateDialog = null; public void hdate() { HijrahDate hijrahDate = HijrahDate.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); String formatted = formatter.format(hijrahDate); // 07/03/1439 ye = Integer.parseInt(formatted.substring(0, 4)); mo = Integer.parseInt(formatted.substring(5, 7)); da = Integer.parseInt(formatted.substring(8, 10)); } // public Hijrah() { // this(new Date()); // } public Hijrah(String dateFormatPattern, Date date) { this(); DEFAULT_DATE_FORMAT = dateFormatPattern; } public Hijrah() { hdate(); setDate(); setEditable(false); setCursor(new Cursor(Cursor.HAND_CURSOR)); addListeners(); } private void addListeners() { addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent paramMouseEvent) { if (datePanel == null) { datePanel = new DatePanel(); } Point point = getLocationOnScreen(); point.y = point.y + 30; showDateDialog(datePanel, point); } }); } private void showDateDialog(DatePanel dateChooser, Point position) { Frame owner = (Frame) SwingUtilities .getWindowAncestor(Hijrah.this); if (dateDialog == null || dateDialog.getOwner() != owner) { dateDialog = createDateDialog(owner, dateChooser); } dateDialog.setLocation(getAppropriateLocation(owner, position)); dateDialog.setVisible(true); } private JDialog createDateDialog(Frame owner, JPanel contentPanel) { JDialog dialog = new JDialog(owner, "Date Selected", false);// Non-modal // JDialog dialog = new JDialog(owner, "Date Selected", true); dialog.setUndecorated(true); dialog.getContentPane().add(contentPanel, BorderLayout.CENTER); dialog.pack(); dialog.setSize(DIALOG_WIDTH, DIALOG_HEIGHT); dialog.addWindowFocusListener(new WindowFocusListener() { public void windowLostFocus(WindowEvent e) { dialog.setVisible(false); } public void windowGainedFocus(WindowEvent e) { } }); return dialog; } private Point getAppropriateLocation(Frame owner, Point position) { Point result = new Point(position); Point p = owner.getLocation(); int offsetX = (position.x + DIALOG_WIDTH) - (p.x + owner.getWidth()); int offsetY = (position.y + DIALOG_HEIGHT) - (p.y + owner.getHeight()); if (offsetX > 0) { result.x -= offsetX; } if (offsetY > 0) { result.y -= offsetY; } return result; } private SimpleDateFormat getDefaultDateFormat() { if (dateFormat == null) { dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT); } return dateFormat; } public void setText() { setDate(); } public void setDate() { super.setText(testMethod()); //<<<<< Changed } public Date getDate() { try { return getDefaultDateFormat().parse(getText()); } catch (ParseException e) { return new Date(); } } private class DatePanel extends JPanel implements ChangeListener { int startYear = 1380; int lastYear = 3050; Color backGroundColor = Color.gray; Color palletTableColor = Color.white; Color todayBackColor = Color.orange; Color weekFontColor = Color.blue; Color dateFontColor = Color.black; Color weekendFontColor = Color.red; Color controlLineColor = Color.GREEN; Color controlTextColor = new java.awt.Color(153, 0, 153); Color controlMoonnameTextColor = Color.BLUE; JSpinner yearSpin; JSpinner monthSpin; JButton[][] daysButton = new JButton[8][7]; DatePanel() { setLayout(new BorderLayout()); setBorder(new LineBorder(backGroundColor, 2)); setBackground(backGroundColor); JPanel topYearAndMonth = createYearAndMonthPanal(); add(topYearAndMonth, BorderLayout.NORTH); JPanel centerWeekAndDay = createWeekAndDayPanal(); add(centerWeekAndDay, BorderLayout.CENTER); reflushWeekAndDay(); } private JPanel createYearAndMonthPanal() { Font font = new Font("Tahoma", Font.BOLD, 12); Calendar cal = getCalendar(); int currentYear = cal.get(Calendar.YEAR); int currentMonth = cal.get(Calendar.MONTH) + 1; JPanel panel = new JPanel(); panel.setLayout(new FlowLayout()); panel.setBackground(controlLineColor); JLabel yearLabel = new JLabel("السنة"); yearLabel.setForeground(controlTextColor); yearLabel.setHorizontalAlignment(SwingConstants.CENTER); yearLabel.setVerticalAlignment(SwingConstants.CENTER); yearLabel.setFont(font); panel.add(yearLabel); yearSpin = new JSpinner(new SpinnerNumberModel(currentYear, startYear, lastYear, 1)); yearSpin.setPreferredSize(new Dimension(60, 30)); yearSpin.setName("Month"); yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, "####")); yearSpin.addChangeListener(this); panel.add(yearSpin); monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth, 1, 12, 1)); monthSpin.setPreferredSize(new Dimension(45, 30)); monthSpin.setName("Year"); monthSpin.addChangeListener(this); monthNameLabel.setPreferredSize(new Dimension(60, 20)); monthNameLabel.setForeground(controlTextColor); monthNameLabel.setHorizontalAlignment(SwingConstants.CENTER); monthNameLabel.setVerticalAlignment(SwingConstants.CENTER); monthNameLabel.setFont(font); monthNameLabel.setText(moonNames[(Integer) monthSpin.getValue() - 1]); // get name from array panel.add(monthNameLabel); panel.add(monthSpin); JLabel monthLabel = new JLabel("الشهر"); monthLabel.setForeground(controlTextColor); monthLabel.setHorizontalAlignment(SwingConstants.CENTER); monthLabel.setVerticalAlignment(SwingConstants.CENTER); monthLabel.setFont(font); panel.add(monthLabel); return panel; } private JPanel createWeekAndDayPanal() { String colname[] = {"سب", "اح", "ثن", "ثل", "ار", "خم", "جم"}; // String colname[] = {"Sa", "sun", "Mon", "Tu", "We", "Th", "Fr"}; JPanel panel = new JPanel(); panel.setFont(new Font("Arial", Font.PLAIN, 10)); panel.setLayout(new GridLayout(7, 7)); panel.setBackground(Color.white); for (int i = 0; i < 7; i++) { JLabel cell = new JLabel(colname[i]); cell.setHorizontalAlignment(JLabel.CENTER); if (i == 6) { cell.setForeground(weekendFontColor); } else { cell.setForeground(weekFontColor); } panel.add(cell); } int actionCommandId = 0; for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { JButton numBtn = new JButton(); numBtn.setBorder(null); numBtn.setHorizontalAlignment(SwingConstants.CENTER); numBtn.setActionCommand(String.valueOf(actionCommandId)); numBtn.setBackground(palletTableColor); numBtn.setForeground(dateFontColor); numBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { JButton source = (JButton) event.getSource(); if (source.getText().length() == 0) { return; } dayColorUpdate(true); source.setForeground(todayBackColor); int newDay = Integer.parseInt(source.getText()); Calendar cal = getCalendar(); cal.set(Calendar.DAY_OF_MONTH, newDay); setDate(); dateDialog.setVisible(false); } }); if (j == 6) { numBtn.setForeground(weekendFontColor); } else { numBtn.setForeground(dateFontColor); } daysButton[i][j] = numBtn; panel.add(numBtn); actionCommandId++; } } return panel; } private Calendar getCalendar() { Calendar calendar = Calendar.getInstance(); calendar.setTime(getDate()); return calendar; } private int getSelectedYear() { return ((Integer) yearSpin.getValue()).intValue(); } private int getSelectedMonth() { return ((Integer) monthSpin.getValue()).intValue(); } private void dayColorUpdate(boolean isOldDay) { ye = (Integer) yearSpin.getValue(); mo = (Integer) monthSpin.getValue(); System.out.println("spinner ye " + ye); System.out.println("spinner mo " + mo); Locale ar = new Locale("ar"); DateTimeFormatter dayOfMoonNum = DateTimeFormatter.ofPattern("d", ar); DateTimeFormatter dayOfweekNum = DateTimeFormatter.ofPattern("c", ar); HijrahDate hijrahDate = HijrahChronology.INSTANCE.date(ye, mo, da); String MoondayNum = hijrahDate.format(dayOfMoonNum); String WeekdayNum = hijrahDate.format(dayOfweekNum); int WeekdayNumb = Integer.parseInt(WeekdayNum); int moondayNumb = Integer.parseInt(MoondayNum); int moondaysnumber = hijrahDate.lengthOfMonth(); System.out.println("hijrahDate= " + hijrahDate); System.out.println("Number day-of-month " + MoondayNum); System.out.println("Number day-of-Week " + WeekdayNum); System.out.println("Number of days of the month " + moondaysnumber); int actionCommandId = moondayNumb + 3 + WeekdayNumb; int i = actionCommandId / 7; int j = actionCommandId % 7; if (isOldDay) { daysButton[i][j].setForeground(dateFontColor); } else { daysButton[i][j].setForeground(todayBackColor); } } private void reflushWeekAndDay() { ye = (Integer) yearSpin.getValue(); mo = (Integer) monthSpin.getValue(); System.out.println("spinner ye " + ye); System.out.println("spinner mo " + mo); Locale ar = new Locale("ar"); DateTimeFormatter dayOfMoonNum = DateTimeFormatter.ofPattern("d", ar); DateTimeFormatter dayOfweekNum = DateTimeFormatter.ofPattern("c", ar); HijrahDate hijrahDate = HijrahChronology.INSTANCE.date(ye, mo, da); HijrahChronology crono = hijrahDate.getChronology(); HijrahDate date = crono.date(ye, mo, da); System.out.println("crono date= " + date); String MoondayNum = hijrahDate.format(dayOfMoonNum); String WeekdayNum = hijrahDate.format(dayOfweekNum); int WeekdayNumb = Integer.parseInt(WeekdayNum); int moondayNumb = Integer.parseInt(MoondayNum); int moondaysnumber = hijrahDate.lengthOfMonth(); System.out.println("hijrahDate= " + hijrahDate); System.out.println("Number day-of-month " + moondayNumb); System.out.println("Number day-of-Week " + WeekdayNumb); System.out.println("Number of days of the month " + moondaysnumber); int maxDayNo = moondaysnumber; System.out.println("Number of days of the month " + moondaysnumber); int dayNo = -3 - WeekdayNumb; // int dayNo = 0; System.out.println("dayNo " + dayNo); for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { String s = ""; if (dayNo >= 1 && dayNo <= maxDayNo) { s = String.valueOf(dayNo); } daysButton[i][j].setText(s); dayNo++; if (daysButton[i][j].getText().equals("")){ daysButton[i][j].setVisible(false); }else{ daysButton[i][j].setVisible(true); } } } dayColorUpdate(false); } public void stateChanged(ChangeEvent e) { dayColorUpdate(true); JSpinner source = (JSpinner) e.getSource(); Calendar cal = getCalendar(); if (source.getName().equals("Year")) { cal.set(Calendar.YEAR, getSelectedYear()); } else { cal.set(Calendar.MONTH, getSelectedMonth() - 1); } setDate(); reflushWeekAndDay(); mothnam(); } } public void mothnam() { monthNameLabel.setText(moonNames[mo - 1]); } String testMethod() { // ADDED DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); HijrahDate today = HijrahChronology.INSTANCE.date(ye, mo, da); String formatted = formatter.format(today); // 07/03/1439 // System.out.println("hijrahDate " + formatted); return formatted.toString(); //<<<<<< ADDED } }
Last edited by cnmeysam; April 28th, 2021 at 05:48 PM.
Not very interesting.but Empty spaces in the first row are not very interesting in some months
I'll have to remember that when one of my programs doesn't work correctly.
If you don't understand my answer, don't ignore it, ask a question.
ok now how we can fix button's color? after use sppiner colors not working Properly
Please explain in more detail. What steps does the user have to take to see the problem? Describe the steps in detail.colors not working Properly
Describe what is expected compared to what the program does.
If you don't understand my answer, don't ignore it, ask a question.
When I click on the button, that button should turn orange and the previous button should return to the default color, but as you can see in the picture, it does not work properly.
https://s18.picofile.com/file/8432135718/Capture.JPG
How does the code keep track of the colors of the buttons?
How does it know to set the color of any of the buttons?
Where is the logic that sets the color of the buttons?
Is there logic to restore the color of the last clicked on button to the default color?
Please explain the program's logic for setting and resetting the colors.
If you don't understand my answer, don't ignore it, ask a question.
cnmeysam (April 29th, 2021)
In this part of the code, it is said that if it was the last day of the week, the color of the text box would be red Otherwise the text color will be black
if (j == 6) { numBtn.setForeground(weekendFontColor); } else { numBtn.setForeground(dateFontColor); }
When the button is clicked, its color changes to orange (today)
numBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { JButton source = (JButton) event.getSource(); if (source.getText().length() == 0) { return; } dayColorUpdate(true); numBtn.setBackground(palletTableColor); numBtn.setForeground(dateFontColor); source.setForeground(todayBackColor); int newDay = Integer.parseInt(source.getText()); da = newDay; setDate(); dateDialog.setVisible(false); } });
When the box is loaded today, it turns orange by default
int actionCommandId = moondayNumb + 3 + WeekdayNumb; int i = actionCommandId / 7; int j = actionCommandId % 7; if (isOldDay) { daysButton[i][j].setForeground(dateFontColor); daysButton[i][6].setForeground(weekendFontColor); } else { daysButton[i][j].setForeground(dateFontColor); daysButton[i][6].setForeground(weekendFontColor); daysButton[i][j].setForeground(todayBackColor); }
Ok, what is the problem with the code you just posted?
Please explain the program's logic in English, not code, for setting and resetting the colors.
When the user clicks on a button what should happen?
What if it is the first time a button was clicked?
What if it is the second time a button was clicked?
I really hate working with undocumented code. None of the code you just posted has any comments saying what it is doing and why it is doing it. Complicated code without comments is very hard to work with.
If I were required to work on this code, the first thing I would do would be to add comments describing what each method does and why it does it.
If you don't understand my answer, don't ignore it, ask a question.
This is the output of the program
When the user clicks on a button what should happen? When I click on the button, that button should turn orange and the previous button should return to the default color, but as you can see in the picture, it does not work properly.
What if it is the first time a button was clicked? that button turn orang but previous button don't return to the default color
What if it is the second time a button was clicked? nothing
https://s18.picofile.com/file/8432135718/Capture.JPG
There is not a previous button when the first button is clicked.the previous button should return to the default color
How can the program keep track of the previous button so it can change its color?
I meant that the second button is not the same as the first button.What if it is the second time a button was clicked? nothing
I thought you wanted the previous button to be changed back when a second button was clicked?
If you don't understand my answer, don't ignore it, ask a question.
In the code, before applying the color to the new button, all the previous buttons are always told to change the state to the default color
The code is executed line by line, so first all the buttons are returned to the previous color, then the color of the button is changed todayColor palletTableColor = Color.white; Color todayBackColor = Color.orange; Color dateFontColor = Color.black; numBtn.setBackground(palletTableColor); numBtn.setForeground(dateFontColor); source.setForeground(todayBackColor);
--- Update ---
In other words, when you click on today, first every day changes to the default color, then today it turns orange.
--- Update ---
After a few clicks on the buttons, the color of the previous buttons will not return to the default state, and usually 7 of the buttons will always remain orange.
--- Update ---
private JPanel createWeekAndDayPanal() { JPanel panel = new JPanel(); panel.setFont(new Font("Tahoma", Font.PLAIN, 10)); panel.setLayout(new GridLayout(7, 7)); panel.setBackground(Color.white); for (int i = 0; i < 7; i++) { cell = new JLabel(colname[i]); cell.setHorizontalAlignment(JLabel.CENTER); if (i == 6) { cell.setForeground(weekendFontColor); } else { cell.setForeground(weekFontColor); } panel.add(cell); } int actionCommandId = 0; for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { JButton numBtn = new JButton(); numBtn.setBorder(null); numBtn.setHorizontalAlignment(SwingConstants.CENTER); numBtn.setActionCommand(String.valueOf(actionCommandId)); numBtn.setBackground(palletTableColor); numBtn.setForeground(dateFontColor); numBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { JButton source = (JButton) event.getSource(); if (source.getText().length() == 0) { numBtn.setForeground(dateFontColor); return; } dayColorUpdate(true); numBtn.setBackground(palletTableColor); numBtn.setForeground(dateFontColor); source.setForeground(todayBackColor); int newDay = Integer.parseInt(source.getText()); da = newDay; setDate(); dateDialog.setVisible(false); } }); daysButton[i][j] = numBtn; panel.add(numBtn); actionCommandId++; if (j == 6) { numBtn.setForeground(weekendFontColor); } else { numBtn.setForeground(dateFontColor); } } } return panel; }
If you want to change the color of a button, you need a reference to that button.
Can the code keep a reference to the button that was changed to orange so that that button can later be changed to a different color?
If you don't understand my answer, don't ignore it, ask a question.