Java J组件绘画问题

Java J组件绘画问题,java,swing,jcomponent,jcalendar,Java,Swing,Jcomponent,Jcalendar,我正在尝试用Java创建一个自定义日历。为此,我扩展了javax.swing.JComponent public class GMCalendar extends JComponent { ... } 在构造器中,我进行一些基本设置并加载图像: calendarDay = Toolkit.getDefaultToolkit().createImage(getClass().getResource("/resources/images/calendar_day.png")); 在paintCo

我正在尝试用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);
        }
    }
}
这是来自
GMContainerFrame
的构造函数(它不使用
LayoutManager
!):

GMMiniFrame
扩展了
JSplitPane

  • 不要重新发明轮子,使用
    JPanels
    ,最好使用
    JLabels
    GridLayout

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

  • 注意
    JLabel
    是透明的、非不透明的

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


请尽快发布一个更好的帮助,但正如@mKobel(+1)所说的,请查看第三方库,除非您自己正在创建日历库。也不要调用
setPreferredSize
而是重写
getPreferredSize()
我应该说些别的话吗?你不应该写
calendar.add(calendar.MONTH,currentMonth)
paintComponent()
中,因为系统在重新绘制时将调用
paintComponent()
。你一直在添加不好的内容。+1,尤其是第一条和最后一条评论。人们没有意识到制作一个健壮的日历组件有多么困难。还要看看哪个是上述组件的替代品。
GMContainerFrame cf = new GMContainerFrame();
cf.setMinimumSize(new Dimension(800,600));
cf.setVisible(true);
calendarFrame = new GMMiniFrame("Kalender", new GMCalendar(), 230);