JComponent绘画问题

时间:2013-01-28 12:29:54

标签: java swing jcomponent jcalendar

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

结果是什么都不是这样的:

Weird calendar

似乎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

1 个答案:

答案 0 :(得分:4)

  • 不要重新发明轮子,使用JPanels,更好地使用JLabels

  • 奠定的GridLayout
  • 使用JLabelsJPanel嵌套多个JComponents)没有理由paintComponents

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

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