【问题标题】:Calendar display using Java Swing使用 Java Swing 显示日历
【发布时间】:2016-04-27 02:31:05
【问题描述】:

我正在使用 java swing(一个独立的应用程序)开发一个考勤项目,该项目会在每个员工使用其用户 ID 和密码登录时更新他们的考勤情况。

一天只能参加一次。

现在,我想显示一个日历,其中他登录的日期标记为与他未登录的日期不同的颜色(这意味着他不在那些未登录的日子)。

我的当前状态在链接http://devajkumarsuthapalli.blogspot.in/2013/06/my-java-project_20.html 中的日历中,例如http://tinyurl.com/ps23csu

我想看到不同颜色的员工登录天数和不同颜色的缺勤者

【问题讨论】:

  • 你到底在问什么?
  • 看看JTable,如果数据来自数据库,使用ResultSetTableModel作为TableModel。然后使用专用的TableCellRenderer 更改缺勤天数的背景。
  • 数据来自文本文件并使用字符串标记器我们将提取用户名和密码,我对所有这些都没有问题,最后我想添加一个日历,我们可以看到未记录的- 每个员工的天数

标签: java swing date calendar


【解决方案1】:

您将不得不创建自己的日历组件,以便可以将日期设置为不同的颜色。

这是我为我的一个项目创建的日历。

这是生成日历的MonthPanel 代码。现在,它突出显示了当天。您可以对其进行修改以突出显示您的员工登录的日期。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.util.Calendar;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MonthPanel extends JPanel {

    private static final long   serialVersionUID    = 1L;

    protected int               month;
    protected int               year;

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

    protected String[]          dayNames            = { "S", "M", "T", "W",
            "T", "F", "S"                           };

    public MonthPanel(int month, int year) {
        this.month = month;
        this.year = year;

        this.add(createGUI());
    }

    protected JPanel createGUI() {
        JPanel monthPanel = new JPanel(true);
        monthPanel.setBorder(BorderFactory
                .createLineBorder(SystemColor.activeCaption));
        monthPanel.setLayout(new BorderLayout());
        monthPanel.setBackground(Color.WHITE);
        monthPanel.setForeground(Color.BLACK);
        monthPanel.add(createTitleGUI(), BorderLayout.NORTH);
        monthPanel.add(createDaysGUI(), BorderLayout.SOUTH);

        return monthPanel;
    }

    protected JPanel createTitleGUI() {
        JPanel titlePanel = new JPanel(true);
        titlePanel.setBorder(BorderFactory
                .createLineBorder(SystemColor.activeCaption));
        titlePanel.setLayout(new FlowLayout());
        titlePanel.setBackground(Color.WHITE);

        JLabel label = new JLabel(monthNames[month] + " " + year);
        label.setForeground(SystemColor.activeCaption);

        titlePanel.add(label, BorderLayout.CENTER);

        return titlePanel;
    }

    protected JPanel createDaysGUI() {
        JPanel dayPanel = new JPanel(true);
        dayPanel.setLayout(new GridLayout(0, dayNames.length));

        Calendar today = Calendar.getInstance();
        int tMonth = today.get(Calendar.MONTH);
        int tYear = today.get(Calendar.YEAR);
        int tDay = today.get(Calendar.DAY_OF_MONTH);

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.DAY_OF_MONTH, 1);

        Calendar iterator = (Calendar) calendar.clone();
        iterator.add(Calendar.DAY_OF_MONTH,
                -(iterator.get(Calendar.DAY_OF_WEEK) - 1));

        Calendar maximum = (Calendar) calendar.clone();
        maximum.add(Calendar.MONTH, +1);

        for (int i = 0; i < dayNames.length; i++) {
            JPanel dPanel = new JPanel(true);
            dPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            JLabel dLabel = new JLabel(dayNames[i]);
            dPanel.add(dLabel);
            dayPanel.add(dPanel);
        }

        int count = 0;
        int limit = dayNames.length * 6;

        while (iterator.getTimeInMillis() < maximum.getTimeInMillis()) {
            int lMonth = iterator.get(Calendar.MONTH);
            int lYear = iterator.get(Calendar.YEAR);

            JPanel dPanel = new JPanel(true);
            dPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            JLabel dayLabel = new JLabel();

            if ((lMonth == month) && (lYear == year)) {
                int lDay = iterator.get(Calendar.DAY_OF_MONTH);
                dayLabel.setText(Integer.toString(lDay));
                if ((tMonth == month) && (tYear == year) && (tDay == lDay)) {
                    dPanel.setBackground(Color.ORANGE);
                } else {
                    dPanel.setBackground(Color.WHITE);
                }
            } else {
                dayLabel.setText(" ");
                dPanel.setBackground(Color.WHITE);
            }
            dPanel.add(dayLabel);
            dayPanel.add(dPanel);
            iterator.add(Calendar.DAY_OF_YEAR, +1);
            count++;
        }

        for (int i = count; i < limit; i++) {
            JPanel dPanel = new JPanel(true);
            dPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            JLabel dayLabel = new JLabel();
            dayLabel.setText(" ");
            dPanel.setBackground(Color.WHITE);
            dPanel.add(dayLabel);
            dayPanel.add(dPanel);
        }

        return dayPanel;
    }

}

这是我用来生成JFrame 以显示MonthPanel 的代码。

import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class CalendarFrame implements Runnable {

    private JFrame  frame;

    @Override
    public void run() {
        // Month is zero based
        MonthPanel panel = new MonthPanel(5, 2013);

        frame = new JFrame();
        frame.setTitle("Calendar");
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent event) {
                exitProcedure();
            }
        });

        frame.setLayout(new FlowLayout());
        frame.add(panel);
        frame.pack();
        // frame.setBounds(100, 100, 400, 200);
        frame.setVisible(true);
    }

    public void exitProcedure() {
        frame.dispose();
        System.exit(0);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new CalendarFrame());

    }

}

【讨论】:

【解决方案2】:

LGoodDatePicker 库包含一个 CalendarPanel 组件,它允许程序员(可选)指定多色“HighlightPolicy”。通过使用 HighlightPolicy,程序员可以为每个突出显示的日期选择背景颜色、前景色和(可选)工具提示文本。 (提供的颜色可以是相同的,也可以是每个日期唯一的。)在您的使用中,突出显示的颜色可用于指示员工出勤率。

公平披露:我是主要开发人员。

我粘贴了带有多色 HighlightPolicy(和 VetoPolicy)的 CalendarPanel 的屏幕截图。

除了 CalendarPanel,该库还具有 DatePicker、TimePicker 和 DateTimePicker 组件。 我包括了所有库组件(和演示应用程序)的屏幕截图。

该库可以从项目release page 安装到您的Java 项目中。

项目主页在 Github 上:
https://github.com/LGoodDatePicker/LGoodDatePicker



(点击放大演示图像。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2015-05-16
    • 2017-05-20
    • 1970-01-01
    • 2012-08-14
    • 2017-06-24
    • 2013-12-08
    相关资源
    最近更新 更多