java - 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 实现这个?
谢谢您的帮助!
解决方案
推荐阅读
- python - 用于 python 的 Azure 函数无法访问
- jmeter - Apache-JMeter 5.4
- sql - 如何使用sql提取具有重叠时间的行
- vue.js - 在 vuejs 中“安装”之前获取子 DOM 元素高度
- mongodb - 编写一个 Bash shell 脚本来读取 mongodb 日志文件并将其内容写入另一个文本文件
- c# - 如何断言 API 响应具有特定结构?
- javascript - 如何将重复项的所有子类别分组到新数组中的一个类别下
- javascript - 在Javascript中单击下一步后如何使测验问题一次出现一个?
- angular - 带有商店选择器的 concatMap 与 mergeMap
- apache-spark - Spark 中的缓存是如何工作的