我正在尝试用Java创建自定义日历。为此我延伸javax.swing.JComponent
。
public class GMCalendar extends JComponent { ... }
在我的构造函数中,我做了一些基本设置并加载了我的图像:
calendarDay = Toolkit.getDefaultToolkit().createImage(getClass().getResource("/resources/images/calendar_day.png"));
在paintComponent
它应该绘制我的日历,但它不会全部绘制,这看起来很奇怪。
public void paintComponent(Graphics g) {
super.paintComponent(g);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, currentMonth);
int numberOfWeeks = calendar.getActualMaximum(Calendar.WEEK_OF_MONTH);
for (int i = 0; i < 7; i++) {
for (int j = 0; j < numberOfWeeks; j++) {
int x = i * (DAY_SIZE + DAY_SPACE);
int y = j * (DAY_SIZE + DAY_SPACE);
g.drawImage(calendarDay, x, y, null);
}
}
}
结果是什么都不是这样的:
似乎paintComponent
被称为之前该组件的尺寸大于 1x1 。
这是我的main()
:
GMContainerFrame cf = new GMContainerFrame();
cf.setMinimumSize(new Dimension(800,600));
cf.setVisible(true);
这来自GMContainerFrame
的构造函数(不使用LayoutManager
!):
calendarFrame = new GMMiniFrame("Kalender", new GMCalendar(), 230);
GMMiniFrame
延伸JSplitPane
。
答案 0 :(得分:4)
不要重新发明轮子,使用JPanels
,更好地使用JLabels
GridLayout
使用JLabels
(JPanel
嵌套多个JComponents
)没有理由paintComponents
通知JLabel
是透明的,非透明的,
使用JCalendar
中的JDatePicker
/ SwingX
,我最喜欢的是JCalendar by Kai Toedter,(渲染器,编辑器,特殊日期,最小和最大日期没有问题)