gpt4 book ai didi

java - Swing Java 中的 Jcalendar

转载 作者:行者123 更新时间:2023-12-01 23:25:43 25 4
gpt4 key购买 nike

//我正在 swing 中创建自定义 jcalender

//我遇到有关日期设置的问题//即实际月份从星期二开始,从星期三开始//我发现有关在日历模型中设置值的问题

//上面的代码运行良好,但在显示实际日期时出现问题//请建议我进行必要的更改

import java.awt.Color;


public class Calendar extends JFrame {

private JPanel contentPane;

String[] years = { "2008", "2009", "2010" ,"2011","2012","2013","2014"};

JComboBox comboBox = new JComboBox(years);

String[] months = { "January", "February", "March", "April", "May", "June", "July", "August",
"September", "October", "November", "December" };

JList list = new JList(months);

JScrollPane scrollPane = new JScrollPane(list);

CalendarModel model = new CalendarModel();

JTable table = new JTable(model);

public Calendar() {
super();

getContentPane().setLayout(null);
comboBox.setBounds(10, 10, 100, 30);
comboBox.setSelectedIndex(5);
comboBox.addItemListener(new ComboHandler());
scrollPane.setBounds(200, 10, 150, 100);
list.setSelectedIndex(10);
list.addListSelectionListener(new ListHandler());
table.setBounds(10, 150, 550, 200);
model.setMonth(comboBox.getSelectedIndex() + 1998, list.getSelectedIndex());
getContentPane().add(comboBox);
getContentPane().add(scrollPane);
table.setGridColor(Color.black);
table.setShowGrid(true);
getContentPane().add(table);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(530,300);
setVisible(true);


}


/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Calendar frame = new Calendar();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public class ComboHandler implements ItemListener {
public void itemStateChanged(ItemEvent e) {
System.out.println("ItemState change Method called ");
model.setMonth(comboBox.getSelectedIndex() + 1998, list.getSelectedIndex());
table.repaint();
}
}

public class ListHandler implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
model.setMonth(comboBox.getSelectedIndex() + 1998, list.getSelectedIndex());
table.repaint();
}
}
}
class CalendarModel extends AbstractTableModel {
String[] days = { "Sun" , "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

int[] numDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

String[][] calendar = new String[7][7];

public CalendarModel() {

//setting name of days (mon,tues)
for (int i = 0; i < days.length; ++i)
{
System.out.println("day[i] *** "+days[i]);
calendar[0][i] = days[i];

}
for (int i = 1; i < 7; ++i){
for (int j = 0; j < 7; ++j)
{
System.out.println("calendar[i][j] value i ** "+i +" j value "+ j );
calendar[i][j] = " ";
}
}

}

public int getRowCount() {
return 7;
}

public int getColumnCount() {
return 7;
}

public Object getValueAt(int row, int column) {
System.out.println("get Value at ** "+calendar[row][column]);
return calendar[row][column];
}

/*
public void setValueAt(Object value, int row, int column) {
System.out.println("set Value at ** "+(String) value);
calendar[row][column] = (String) value;
}*/

public void setMonth(int year, int month) {
for (int i = 1; i < 7; ++i)
{
for (int j = 0; j < 7; ++j)
{
calendar[i][j] = " ";
}
}
java.util.GregorianCalendar cal = new java.util.GregorianCalendar();
cal.set(year, month, 1);
int offset = cal.get(java.util.GregorianCalendar.DAY_OF_WEEK) - 1;
offset += 7;
int num = daysInMonth(year, month);
for (int i = 0; i < num; ++i) {
System.out.println("offset *** "+Integer.toString(i+1));
calendar[offset / 7][offset % 7] = Integer.toString(i+1);
++offset;
}
}

public boolean isLeapYear(int year) {
System.out.println("Is Leap Year *** ");
if (year % 4 == 0)
return true;
return false;
}

public int daysInMonth(int year, int month) {
System.out.println("day In month*** ");
int days = numDays[month];
if (month == 1 && isLeapYear(year))
++days;
System.out.println("days *** "+days);
return days;
}

}

最佳答案

我不知道这些是否相关,但是......

public void itemStateChanged(ItemEvent e) {

int index = comboBox.getSelectedIndex();
System.out.println("index = " + index + "; " + (index + 1998));

model.setMonth(comboBox.getSelectedIndex() + 1998, list.getSelectedIndex());
table.repaint();
}

不会产生与组合框中列出的结果相匹配的结果。例如,如果您选择第一个值,它将等于 1998 ,不是2008

所以,如果我选择 2013从组合框中,我实际上得到 2003 .

当我将其更改为

public void itemStateChanged(ItemEvent e) {

int index = comboBox.getSelectedIndex();
System.out.println("index = " + index + "; " + (index + 2008));

model.setMonth(comboBox.getSelectedIndex() + 2008, list.getSelectedIndex());
table.repaint();
}

它给了我更好的结果。

我也变了

java.util.GregorianCalendar cal = new java.util.GregorianCalendar();

java.util.Calendar cal = java.util.Calendar.getInstance();

如果可能的话,您应该避免对用户日历系统做出假设...

我也会避免null布局也是如此;)

您还应该避免调用 table.repaint当您更改表模型时,请尝试使用 fireTableDataChanged来自setMonth内方法

我个人会将监听器添加到组合框和 JList在设置选定的索引之前,这将允许监听器为您更新模型...

您还需要修复您ListHandler以便它使用 2008相反 1998

关于java - Swing Java 中的 Jcalendar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20040958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com