关于在java swing日历中创建事件的想法

时间:2013-12-23 16:59:17

标签: java swing calendar jtable jcombobox

我正在寻找有关如何添加可以创建和编辑的活动的想法和建议。

我希望应用程序保持相当基本,但我知道我会/应该将它链接到数据库来保存事件。

以下是

的当前代码
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class CalendarProgram {
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("Resource System"); // Create frame
    frmMain.setSize(360, 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(false);
    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(false);
    tblCalendar.getTableHeader().setReorderingAllowed(false);

    // 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);
    }

    // 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 个答案:

没有答案