如何解决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,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 举报,一经查实,本站将立刻删除。