3

我正在尝试用 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);
        }
    }
}

结果要么什么都没有,要么是这样的:

奇怪的日历

似乎在组件的大小大于1x1之前paintComponent被调用。

这是在我的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

4

1 回答 1

4
  • 不要重新发明轮子,使用JPanels,最好用JLabelslayed byGridLayout

  • 通过使用JLabelsJPanel嵌套多个JComponents)没有理由paintComponents

  • 通知JLabel是透明的,非不透明的,

  • 使用JCalendar/ JDatePickerfrom SwingX,我最喜欢的是Kai Toedter 的 JCalendar,(渲染器、编辑器、特殊日子、最小和最大日期没有问题)

于 2013-01-28T12:37:01.420 回答