2016-11-07 98 views
2
/*Contents of CalendarProgran.class */ 

//Import packages 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.table.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 

public class Calendar{ 
    static JLabel lblMonth, lblYear; 
    static JButton btnPrev, btnNext; 
    static JTable tblCalendar; 
    static JComboBox cmbYear; 
    static JFrame frmMain; 
    static Container pane; 
    static DefaultTableModel mtblCalendar; //Table model 
    static JScrollPane stblCalendar; //The scrollpane 
    static JPanel pnlCalendar; 
    static int realYear, realMonth, realDay, currentYear, currentMonth; 
public static void main (String args[]){ 
    //Look and feel 
    try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());} 
    catch (ClassNotFoundException e) {} 
    catch (InstantiationException e) {} 
    catch (IllegalAccessException e) {} 
    catch (UnsupportedLookAndFeelException e) {} 

    //Prepare frame 
    frmMain = new JFrame ("Monthly Calendar"); //Create frame 
    frmMain.setSize(330, 375); //Set size to 400x400 pixels 
    pane = frmMain.getContentPane(); //Get content pane 
    pane.setLayout(null); //Apply null layout 
    frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Close when X is clicked 

    //Create controls 
    lblMonth = new JLabel ("January"); 
    lblYear = new JLabel ("Change year:"); 
    cmbYear = new JComboBox(); 
    btnPrev = new JButton ("<<"); 
    btnNext = new JButton (">>"); 
    mtblCalendar = new DefaultTableModel(){public boolean isCellEditable(int rowIndex, int mColIndex){return true;}}; 
    tblCalendar = new JTable(mtblCalendar); 
    stblCalendar = new JScrollPane(tblCalendar); 
    pnlCalendar = new JPanel(null); 

    //Set border 
    pnlCalendar.setBorder(BorderFactory.createTitledBorder("Calendar")); 

    //Register action listeners 
    btnPrev.addActionListener(new btnPrev_Action()); 
    btnNext.addActionListener(new btnNext_Action()); 
    cmbYear.addActionListener(new cmbYear_Action()); 

    //Add controls to pane 
    pane.add(pnlCalendar); 
    pnlCalendar.add(lblMonth); 
    pnlCalendar.add(lblYear); 
    pnlCalendar.add(cmbYear); 
    pnlCalendar.add(btnPrev); 
    pnlCalendar.add(btnNext); 
    pnlCalendar.add(stblCalendar); 

    //Set bounds 
    pnlCalendar.setBounds(0, 0, 320, 335); 
    lblMonth.setBounds(160-lblMonth.getPreferredSize().width/2, 25, 100, 25); 
    lblYear.setBounds(10, 305, 80, 20); 
    cmbYear.setBounds(230, 305, 80, 20); 
    btnPrev.setBounds(10, 25, 50, 25); 
    btnNext.setBounds(260, 25, 50, 25); 
    stblCalendar.setBounds(10, 50, 300, 250); 

    //Make frame visible 
    frmMain.setResizable(true); 
    frmMain.setVisible(true); 

    //Get real month/year 
    GregorianCalendar cal = new GregorianCalendar(); //Create calendar 
    realDay = cal.get(GregorianCalendar.DAY_OF_MONTH); //Get day 
    realMonth = cal.get(GregorianCalendar.MONTH); //Get month 
    realYear = cal.get(GregorianCalendar.YEAR); //Get year 
    currentMonth = realMonth; //Match month and year 
    currentYear = realYear; 

    //Add headers 
    String[] headers = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; //All headers 
    for (int i=0; i<7; i++){ 
     mtblCalendar.addColumn(headers[i]); 
    } 

    tblCalendar.getParent().setBackground(tblCalendar.getBackground()); //Set background 

    //No resize/reorder 
    tblCalendar.getTableHeader().setResizingAllowed(true); 
    tblCalendar.getTableHeader().setReorderingAllowed(true); 

    //Single cell selection 
    tblCalendar.setColumnSelectionAllowed(true); 
    tblCalendar.setRowSelectionAllowed(true); 
    tblCalendar.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

    //Set row/column count 
    tblCalendar.setRowHeight(38); 
    mtblCalendar.setColumnCount(7); 
    mtblCalendar.setRowCount(6); 

    //Populate table 
    for (int i=realYear-100; i<=realYear+100; i++){ 
     cmbYear.addItem(String.valueOf(i)); 
    } 


    //Refresh calendar 
    refreshCalendar (realMonth, realYear); //Refresh calendar 
} 

public static void refreshCalendar(int month, int year){ 
    //Variables 
    String[] months = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; 
    int nod, som; //Number Of Days, Start Of Month 

    //Allow/disallow buttons 
    btnPrev.setEnabled(true); 
    btnNext.setEnabled(true); 
    if (month == 0 && year <= realYear-10){btnPrev.setEnabled(false);} //Too early 
    if (month == 11 && year >= realYear+100){btnNext.setEnabled(false);} //Too late 
    lblMonth.setText(months[month]); //Refresh the month label (at the top) 
    lblMonth.setBounds(160-lblMonth.getPreferredSize().width/2, 25, 180, 25); //Re-align label with calendar 
    cmbYear.setSelectedItem(String.valueOf(year)); //Select the correct year in the combo box 

    //Clear table 
    for (int i=0; i<6; i++){ 
     for (int j=0; j<7; j++){ 
      mtblCalendar.setValueAt(null, i, j); 
     } 
    } 

    //Get first day of month and number of days 
    GregorianCalendar cal = new GregorianCalendar(year, month, 1); 
    nod = cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH); 
    som = cal.get(GregorianCalendar.DAY_OF_WEEK); 

    //Draw calendar 
    for (int i=1; i<=nod; i++){ 
     int row = new Integer((i+som-2)/7); 
     int column = (i+som-2)%7; 
     mtblCalendar.setValueAt(i, row, column); 
    } 

我想将某些值设置为字符串而不是int。不幸的是 如果我尝试将值设置为字符串,我会遇到很多错误。例如 mtblCalendar.setValueAt(“工作日”,4,3);会给我很多错误。我得到的一些错误是NumberFormat异常和其他绘画异常。Java表格单元格的值设置为字符串

//Apply renderers 
    tblCalendar.setDefaultRenderer(tblCalendar.getColumnClass(0), new tblCalendarRenderer()); 
} 

static class tblCalendarRenderer extends DefaultTableCellRenderer{ 
    public Component getTableCellRendererComponent (JTable table, Object value, boolean selected, boolean focused, int row, int column){ 
     super.getTableCellRendererComponent(table, value, selected, focused, row, column); 
     if (column == 0 || column == 6){ //Week-end 
      setBackground(new Color(255, 220, 220)); 
     } 
     else{ //Week 
      setBackground(new Color(255, 255, 255)); 
     } 
     if (value != null){ 
      if (Integer.parseInt(value.toString()) == realDay && currentMonth == realMonth && currentYear == realYear){ //Today 
       setBackground(new Color(220, 220, 255)); 
      } 
     } 
     setBorder(null); 
     setForeground(Color.black); 
     return this; 
    } 
} 

static class btnPrev_Action implements ActionListener{ 
    public void actionPerformed (ActionEvent e){ 
     if (currentMonth == 0){ //Back one year 
      currentMonth = 11; 
      currentYear -= 1; 
     } 
     else{ //Back one month 
      currentMonth -= 1; 
     } 
     refreshCalendar(currentMonth, currentYear); 
    } 
} 
static class btnNext_Action implements ActionListener{ 
    public void actionPerformed (ActionEvent e){ 
     if (currentMonth == 11){ //Foward one year 
      currentMonth = 0; 
      currentYear += 1; 
     } 
     else{ //Foward one month 
      currentMonth += 1; 
     } 
     refreshCalendar(currentMonth, currentYear); 
    } 
} 
static class cmbYear_Action implements ActionListener{ 
    public void actionPerformed (ActionEvent e){ 
     if (cmbYear.getSelectedItem() != null){ 
      String b = cmbYear.getSelectedItem().toString(); 
      currentYear = Integer.parseInt(b); 
      refreshCalendar(currentMonth, currentYear); 
     } 
    } 
} 
+0

你好,你检查? http://stackoverflow.com/questions/21158083/how-to-set-the-value-of-specific-cell-in-jtable –

+0

使用你的堆栈跟踪来调试你的应用程序:https://stackoverflow.com/questions/3988788 /什么 - 是 - 一 - 堆栈跟踪和如何灿我使用的,它到调试我的应用程序,错误 – rafid059

回答

0

的错误是由单元格渲染器tblCalendarRenderer造成的,特别是通过下面的代码:

if (Integer.parseInt(value.toString()) == realDay && currentMonth == realMonth && currentYear == realYear){ //Today 
    setBackground(new Color(220, 220, 255)); 
} 

为了解决问题,你可以增加明确的类型检查和类型转换的条件:

if (value instanceof Integer && (Integer) value == realDay && ... 
相关问题