微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JDatePanelImpl 改变日历内数字的颜色

如何解决JDatePanelImpl 改变日历内数字的颜色

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

enter image description here

我相信在 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,106));
                    }
                } else if (JDatePanelImpl.this.internalModel.getModel().isSelected() && selectedCal.get(5) == cellDayValue) {
                    label.setForeground(Color.WHITE);
                    label.setBackground(new Color(10,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 实现这个?

感谢您的帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。