首页 > 解决方案 > JDatePanelImpl 更改日历内数字的颜色

问题描述

我正在尝试更改日历中数字的颜色,我知道当前日期以红色打印,并且不在所选月份中的日期为灰色,如屏幕截图所示:

在此处输入图像描述

我相信在 JDatePanelImpl 中用来改变颜色的方法是这样的:

    private class InternalTableCellRenderer extends DefaultTableCellRenderer {
    private static final long serialVersionUID = -2341614459632756921L;

    private InternalTableCellRenderer() {
    }

    public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean isSelected, boolean hasFocus, int row, int col) {
        JLabel label = (JLabel)super.getTableCellRendererComponent(arg0, arg1, isSelected, hasFocus, row, col);
        label.setHorizontalAlignment(0);
        if (row == -1) {
            label.setForeground(new Color(10, 36, 106));
            label.setBackground(Color.LIGHT_GRAY);
            label.setHorizontalAlignment(0);
            return label;
        } else {
            Calendar todayCal = Calendar.getInstance();
            Calendar selectedCal = Calendar.getInstance();
            selectedCal.set(JDatePanelImpl.this.internalModel.getModel().getYear(), JDatePanelImpl.this.internalModel.getModel().getMonth(), JDatePanelImpl.this.internalModel.getModel().getDay());
            int cellDayValue = (Integer)arg1;
            int lastDayOfMonth = selectedCal.getActualMaximum(5);
            if (cellDayValue >= 1 && cellDayValue <= lastDayOfMonth) {
                label.setForeground(Color.BLACK);
                label.setBackground(Color.WHITE);
                if (todayCal.get(5) == cellDayValue && todayCal.get(2) == JDatePanelImpl.this.internalModel.getModel().getMonth() && todayCal.get(1) == JDatePanelImpl.this.internalModel.getModel().getYear()) {
                    label.setForeground(Color.RED);
                    if (JDatePanelImpl.this.internalModel.getModel().isSelected() && selectedCal.get(5) == cellDayValue) {
                        label.setBackground(new Color(10, 36, 106));
                    }
                } else if (JDatePanelImpl.this.internalModel.getModel().isSelected() && selectedCal.get(5) == cellDayValue) {
                    label.setForeground(Color.WHITE);
                    label.setBackground(new Color(10, 36, 106));
                }
            } else {
                label.setForeground(Color.LIGHT_GRAY);
                label.setBackground(Color.WHITE);
                if (cellDayValue > lastDayOfMonth) {
                    label.setText(Integer.toString(cellDayValue - lastDayOfMonth));
                } else {
                    Calendar lastMonth = new GregorianCalendar();
                    lastMonth.set(selectedCal.get(1), selectedCal.get(2) - 1, 1);
                    int lastDayLastMonth = lastMonth.getActualMaximum(5);
                    label.setText(Integer.toString(lastDayLastMonth + cellDayValue));
                }
            }

            return label;
        }
    }
}

但我不确定如何在这个私有类 InternalTableCellRenderer 中覆盖这个方法。

这是我的日历代码:

public class JDatePickerDemo extends JFrame implements ActionListener {

private JDatePickerImpl datePicker;

public JDatePickerDemo() {
    super("Calendar Component Demo");
    setLayout(new FlowLayout());
    add(new JLabel("Birthday: "));

    UtilDateModel model = new UtilDateModel();
    model.setSelected(true);
    JDatePanelImpl datePanel = new JDatePanelImpl(model);
    datePanel.setPreferredSize(new Dimension(300,180));

    for(Component comp: datePanel.getComponents()){
        for(Component c: ((Container)comp).getComponents()){
               c.setBackground(Color.WHITE);
        }
    }

    datePicker = new JDatePickerImpl(datePanel, new DateLabelFormatter());
    add(datePicker);
    
    JButton buttonOK = new JButton("OK");
    buttonOK.addActionListener(this);
    
    add(buttonOK);
    
    setSize(400, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        
        @Override
        public void run() {
            new JDatePickerDemo().setVisible(true);
        }
    });
}

@Override
public void actionPerformed(ActionEvent event) {
    Date selectedDate = (Date) datePicker.getModel().getValue();
    JOptionPane.showMessageDialog(this, "The selected date is " + selectedDate);
}

}

public class DateLabelFormatter extends JFormattedTextField.AbstractFormatter {

private DateFormat dateFormat;

public DateLabelFormatter(){
    dateFormat = DateFormat.getDateInstance(DateFormat.SHORT,Langue.getLocale());
}

@Override
public Object stringToValue(String text) throws ParseException {
    Calendar cal = Calendar.getInstance();
    cal.setTime((Date) dateFormat.parseObject(text));
    return cal;
}

@Override
public String valueToString(Object value) throws ParseException {
    if (value != null) {
        Calendar cal = (Calendar) value;
        return dateFormat.format(cal.getTime());
    }
    return "";
}
}

我相信对于 Jtable 来说是这样的:

table.getColumnModel().getColumn(1).setCellRenderer(new InternalTableCellRenderer());

但是我怎样才能为 JDatePanelImpl 实现这个?

谢谢您的帮助!

标签: javaswingjframe

解决方案


推荐阅读