两段代码,一个是指针式时钟,继承JPanel,一个是日历,继承JApplet,我想把他们合到一块,我这样行么,把JApplet定义为接口,把它整合到时钟代码中去??还有这个frame.getcontentpane().add(),能添加多个东西么
MyCalendar.javaimport java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.table.*; 
public class MyCalendar extends JApplet {
 
    public static final String WEEK_SUN = "SUN"; 
    public static final String WEEK_MON = "MON"; 
    public static final String WEEK_TUE = "TUE"; 
    public static final String WEEK_WED = "WED"; 
    public static final String WEEK_THU = "THU"; 
    public static final String WEEK_FRI = "FRI"; 
    public static final String WEEK_SAT = "SAT";
 
    public static final Color background = Color.white; 
    public static final Color foreground = Color.black; 
    public static final Color headerBackground = Color.blue; 
    public static final Color headerForeground = Color.white; 
    public static final Color selectedBackground = Color.blue; 
    public static final Color selectedForeground = Color.white;
 
    private JPanel cPane; 
    private JLabel yearsLabel; 
    private JSpinner yearsSpinner; 
    private JLabel monthsLabel; 
    private JComboBox monthsComboBox; 
    private JTable daysTable; 
    private AbstractTableModel daysModel; 
    private Calendar calendar; 
    
    public MyCalendar() { 
        cPane = (JPanel) getContentPane(); 
    }
 
    public void init() { 
        cPane.setLayout(new BorderLayout());
 
        calendar = Calendar.getInstance(); 
        calendar = Calendar.getInstance();      
        yearsLabel = new JLabel("Year: "); 
        yearsSpinner = new JSpinner(); //选择年份
        yearsSpinner.setEditor(new JSpinner.NumberEditor(yearsSpinner, "0000"));
        yearsSpinner.setValue(new Integer(calendar.get(Calendar.YEAR))); 
        yearsSpinner.addChangeListener(new ChangeListener() { 
                public void stateChanged(ChangeEvent changeEvent) { 
                    int day = calendar.get(Calendar.DAY_OF_MONTH);
                    calendar.set(Calendar.DAY_OF_MONTH, 1);
                    calendar.set(Calendar.YEAR, ((Integer) yearsSpinner.getValue()).intValue());
                    int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
                    calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
                    updateView(); 
                } });
                             
        JPanel yearMonthPanel = new JPanel(); 
        cPane.add(yearMonthPanel, BorderLayout.NORTH); //增加年月的面板
        yearMonthPanel.setLayout(new BorderLayout()); 
        yearMonthPanel.add(new JPanel(), BorderLayout.CENTER);
         
        JPanel yearPanel = new JPanel(); 
        yearMonthPanel.add(yearPanel, BorderLayout.WEST); 
        yearPanel.setLayout(new BorderLayout()); 
        yearPanel.add(yearsLabel, BorderLayout.WEST); 
        yearPanel.add(yearsSpinner, BorderLayout.CENTER);
        monthsLabel = new JLabel("Month: "); 
        monthsComboBox = new JComboBox(); 
        for (int i = 1; i <= 12; i++) { 
            monthsComboBox.addItem(new Integer(i)); 
        } 
        monthsComboBox.setSelectedIndex(calendar.get(Calendar.MONTH)); 
        monthsComboBox.addActionListener(new ActionListener() { 
                public void actionPerformed(ActionEvent actionEvent) {
                    int day = calendar.get(Calendar.DAY_OF_MONTH);
                    calendar.set(Calendar.DAY_OF_MONTH, 1);
                    calendar.set(Calendar.MONTH, monthsComboBox.getSelectedIndex());
                    int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
                    calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
                    updateView(); 
                } 
            }); 
        JPanel monthPanel = new JPanel(); 
        yearMonthPanel.add(monthPanel, BorderLayout.EAST); 
        monthPanel.setLayout(new BorderLayout()); 
        monthPanel.add(monthsLabel, BorderLayout.WEST); 
        monthPanel.add(monthsComboBox, BorderLayout.CENTER);        daysModel = new AbstractTableModel() { 
                public int getRowCount() { 
                    return 7; 
                }
 
                public int getColumnCount() { 
                    return 7; 
                }
 
                public Object getValueAt(int row, int column) { 
                    if (row == 0) { 
                        return getHeader(column); 
                    } 
                    row--; 
                    Calendar calendar = (Calendar) MyCalendar.this.calendar.clone();
                    calendar.set(Calendar.DAY_OF_MONTH, 1);
                    int dayCount = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
                    int moreDayCount = calendar.get(Calendar.DAY_OF_WEEK) - 1; 
                    int index = row * 7 + column; 
                    int dayIndex = index - moreDayCount + 1;
                    if (index < moreDayCount || dayIndex > dayCount) { 
                        return null; 
                    } else { 
                        return new Integer(dayIndex); 
                    } 
                } 
            };
 
        daysTable = new CalendarTable(daysModel, calendar); 
        daysTable.setCellSelectionEnabled(true);
        daysTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
        daysTable.setDefaultRenderer(daysTable.getColumnClass(0), new TableCellRenderer() { 
                public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
                                                               boolean hasFocus, int row, int column) { 
                    String text = (value == null) ? "" : value.toString(); 
                    JLabel cell = new JLabel(text); 
                    cell.setOpaque(true); 
                    if (row == 0) { 
                        cell.setForeground(headerForeground); 
                        cell.setBackground(headerBackground); 
                    } else { 
                        if (isSelected) { 
                            cell.setForeground(selectedForeground); 
                            cell.setBackground(selectedBackground); 
                        } else { 
                            cell.setForeground(foreground); 
                            cell.setBackground(background); 
                        } 
                    }
 
                    return cell; 
                } 
            });
        updateView();
 
        cPane.add(daysTable, BorderLayout.CENTER); 
    }
 
    public static String getHeader(int index) { 
        switch (index) { 
        case 0: 
            return WEEK_SUN; 
        case 1: 
            return WEEK_MON; 
        case 2: 
            return WEEK_TUE; 
        case 3: 
            return WEEK_WED; 
        case 4: 
            return WEEK_THU; 
        case 5: 
            return WEEK_FRI; 
        case 6: 
            return WEEK_SAT; 
        default: 
            return null; 
        } 
    }
 
    public void updateView() { 
        daysModel.fireTableDataChanged();
        daysTable.setRowSelectionInterval(calendar.get(Calendar.WEEK_OF_MONTH),
                                          calendar.get(Calendar.WEEK_OF_MONTH));
        daysTable.setColumnSelectionInterval(calendar.get(Calendar.DAY_OF_WEEK) - 1,
                                             calendar.get(Calendar.DAY_OF_WEEK) - 1);
    }    public static class CalendarTable extends JTable {        private Calendar calendar;        public CalendarTable(TableModel model, Calendar calendar) {
            super(model);
            this.calendar = calendar;
        }        public void changeSelection(int row, int column, boolean toggle, boolean extend) {
            super.changeSelection(row, column, toggle, extend);
            if (row == 0) {
                return;
            }
            Object obj = getValueAt(row, column);
            if (obj != null) {
                calendar.set(Calendar.DAY_OF_MONTH, ((Integer)obj).intValue());
            }
        }    }
 
    public static void main(String[] args) { 
        JFrame frame = new JFrame("Calendar Application"); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        MyCalendar myCalendar = new MyCalendar(); 
        myCalendar.init(); 
        frame.getContentPane().add(myCalendar); 
        frame.setSize(240, 172); 
        frame.show(); 
    }
 

解决方案 »

  1.   

    clock.java
    import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    import java.awt.event.*;
    import java.text.*;
    import javax.swing.event.*; 
    import javax.swing.table.*;
    public class Clock extends JPanel implements Runnable{
    private JTextField jt;
    private JPanel jp;
    public Clock(){
    Thread c=new Thread(this);
    c.start();
    jp=new JPanel();
    jt=new JTextField();
    jt.setEditable(false);
    jt.setHorizontalAlignment(jt.CENTER);
    this.setLayout(new BorderLayout());
    add(jt,BorderLayout.SOUTH);
      add(jp,BorderLayout.CENTER);

    }
    public void run(){
    while(true){
    this.repaint();
    try{
    Thread.sleep(1000);
    }
    catch(Exception e){
    e.printStackTrace();
    }

    }

    }
    public void paint(Graphics g){
    super.paint(g);
    Calendar cal=Calendar.getInstance();
    DateFormat format=DateFormat.getDateTimeInstance(DateFormat.LONG,
    DateFormat.LONG,this.getLocale());
    jt.setText(format.format(cal.getTime()));
    int min=Math.min(this.getSize().width,this.getSize().height);
    int radix=(int)(min*0.8);
    int kedu=(int)(radix*0.48);
    int sl=(int)(radix*0.4);
    int ml=(int)(sl*0.8);
    int hl=(int)(ml*0.8);
    int xo=this.getSize().width/2;
    int yo=this.getSize().height/2;
    for(int i=0;i<60;i++){
    if(i%5==0){
    g.drawLine((int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
    (int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))),
    (int)(xo+(radix/2)*(Math.sin(i*Math.PI/30))),
    (int)(yo-(radix/2*(Math.cos(i*Math.PI/30)))));
    if(i==0)
    g.drawString(""+12,(int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
    (int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))));
    else
    g.drawString(""+i/5,(int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
    (int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))));
    }
    g.drawLine((int)(kedu*(Math.sin(i*Math.PI/30))+xo),
    (int)(yo-(kedu*(Math.cos(i*Math.PI/30)))),
    (int)(xo+(radix/2)*(Math.sin(i*Math.PI/30))),
    (int)(yo-(radix/2*(Math.cos(i*Math.PI/30)))));
    }
    g.drawOval((this.getSize().width-radix)/2,(this.getSize().height-radix)/2,radix,radix);
    Graphics2D gg=(Graphics2D)g;
    gg.setColor(Color.MAGENTA);
    gg.setStroke(new BasicStroke(4.5f));
    gg.drawLine(xo,yo,xo+(int)(hl*Math.sin((cal.get(Calendar.MINUTE)/60.0+cal.get(Calendar.HOUR))*
    Math.PI/6)),yo-(int)((hl*Math.cos((cal.get(Calendar.MINUTE)/60.0+cal.get(Calendar.HOUR))*
    Math.PI/6))));
    gg.setColor(Color.BLUE);
    gg.setStroke(new BasicStroke(2.7f));
    gg.drawLine(xo,yo,xo+(int)(ml*Math.sin(cal.get(Calendar.MINUTE)*Math.PI/30)),
    yo-(int)(ml*Math.cos(cal.get(Calendar.MINUTE)*Math.PI/30)));
    gg.setStroke(new BasicStroke(1.0f));
    gg.setColor(Color.RED);
    gg.drawLine(xo,yo,xo+(int)(sl*Math.sin(cal.get(Calendar.SECOND)*Math.PI/30)),
    yo-(int)(sl*Math.cos(cal.get(Calendar.SECOND)*Math.PI/30)));

    }
    public static void main(String args[]){
    Clock cd=new Clock();
    JFrame j=new JFrame("clock");
    j.getContentPane().add(cd);
    j.setBounds(200,200,400,400);
    j.setVisible(true);
    j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }
    //<applet code=Clock.class width=300 height=300></applet>
      

  2.   

    刚学java不久,大家指点指点我,先谢过了
      

  3.   

    我觉得最简单的办法,就是在JApplet中,加入一个JPanel,实用BorderLayout,然后分别在North和Center加入你的日历和时钟。
      

  4.   

    代码可以合起来,但不能通过继承,因为他们都有相同的父类.,JApplet已经是一个现成的类了,你不能把它搞成接口,
    frame.getContentPanel().add(),可以加多个东西,它是容器啊.
      

  5.   

    API文档里没有提供JApple接口,如果要自己写一个接口来定义规范,然后实现它来实现整合,那要看你能花多少时间来写一个符合你要求的接口,不过不划算,考虑下5楼的方法吧,我的想法和他一样
      

  6.   

    我刚开始定义了一个JApplet接口,现在运行别的继承JApplet类的程序时,extends JApplet出错,他说此处不需要接口。是不是定义了接口,影响到类JApplet了,怎么解决呢
      

  7.   

    把你自己定义的JApplet改个名字,起什么名字不好,非要起和java API一样的名字?
      

  8.   

    答:呵呵。忙不到点子上。这与重装JDK,一点儿关系都没有的。
    楼主的真正意图是什么呢?
    1)若“作为一个JApplet嵌在网页中运行”,则可:新设计一个类,从JApplet继承,该类是一个容器,将你的两个组件(指针式时钟,日历)布局在其中,就行了。
    2)若不是“是作为一个JApplet嵌在网页中运行”,而是作为一个单独的应用程序运行,则:你设计一个类,从JFrame继承,把它作为一个容器,将你的两个组件(指针式时钟,日历)布局在其中,就行了。
    3)若“既能作为一个JApplet嵌在网页中运行,又能作为一个单独的应用程序运行”,则:设计一个类,从JApplet继承,该类是一个容器,将你的两个组件(指针式时钟,日历)布局在其中。然后在该类中放一个main(...),在main(...)中创始一个JFrame,同时作为容器,将你的两个组件(指针式时钟,日历)出布局在其中JFrame中。就行了。上边讲的这些技术,在好几年前(那还是Applet年代),就玩过这些技术(当然这些技术,现在已几乎淘汰了)不再用了。
    老技术了。
      

  9.   

    答:那就更好办了。与JApplet一点儿关系都没有的。按15楼的2)来办就行了。
      

  10.   

    frame.getContentPanel(),容器来添加
      

  11.   

    我定义的那个接口JApplet还没解决呢,13#说改名字,怎么弄呢
      

  12.   

    我按照15楼的做法,先弄clock,怎么出现了两个框架import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    import java.awt.event.*;
    import java.text.*;
    import javax.swing.event.*; 
    import javax.swing.table.*;public class MyCalendar_Clock extends JFrame implements Runnable
    {
    private JPanel jp;

    MyCalendar_Clock()
    {
    Thread c=new Thread(this);
    c.start();
    JFrame frame=new JFrame("MyCalendar_Clock");
    jp=new JPanel();
    frame.add(jp,BorderLayout.CENTER);
    frame.setSize(300, 300);
            frame.setVisible(true);
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
    setVisible(true);
    }
    public void run(){
    while(true){
    this.repaint();
    try{
    Thread.sleep(1000);
    }
    catch(Exception e){
    e.printStackTrace();
    }

    }

    }
    public void paint(Graphics g){
    super.paint(g);
    Calendar cal=Calendar.getInstance();
    DateFormat format=DateFormat.getDateTimeInstance(DateFormat.LONG,
    DateFormat.LONG,this.getLocale());
    int min=Math.min(this.getSize().width,this.getSize().height);
    int radix=(int)(min*0.8);
    int kedu=(int)(radix*0.48);
    int sl=(int)(radix*0.4);
    int ml=(int)(sl*0.8);
    int hl=(int)(ml*0.8);
    int xo=this.getSize().width/2;
    int yo=this.getSize().height/2;
    for(int i=0;i<60;i++){
    if(i%5==0){
    g.drawLine((int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
    (int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))),
    (int)(xo+(radix/2)*(Math.sin(i*Math.PI/30))),
    (int)(yo-(radix/2*(Math.cos(i*Math.PI/30)))));
    if(i==0)
    g.drawString(""+12,(int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
    (int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))));
    else
    g.drawString(""+i/5,(int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
    (int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))));
    }
    g.drawLine((int)(kedu*(Math.sin(i*Math.PI/30))+xo),
    (int)(yo-(kedu*(Math.cos(i*Math.PI/30)))),
    (int)(xo+(radix/2)*(Math.sin(i*Math.PI/30))),
    (int)(yo-(radix/2*(Math.cos(i*Math.PI/30)))));
    }
    g.drawOval((this.getSize().width-radix)/2,(this.getSize().height-radix)/2,radix,radix);
    Graphics2D gg=(Graphics2D)g;
    gg.setColor(Color.MAGENTA);
    gg.setStroke(new BasicStroke(4.5f));
    gg.drawLine(xo,yo,xo+(int)(hl*Math.sin((cal.get(Calendar.MINUTE)/60.0+cal.get(Calendar.HOUR))*
    Math.PI/6)),yo-(int)((hl*Math.cos((cal.get(Calendar.MINUTE)/60.0+cal.get(Calendar.HOUR))*
    Math.PI/6))));
    gg.setColor(Color.BLUE);
    gg.setStroke(new BasicStroke(2.7f));
    gg.drawLine(xo,yo,xo+(int)(ml*Math.sin(cal.get(Calendar.MINUTE)*Math.PI/30)),
    yo-(int)(ml*Math.cos(cal.get(Calendar.MINUTE)*Math.PI/30)));
    gg.setStroke(new BasicStroke(1.0f));
    gg.setColor(Color.RED);
    gg.drawLine(xo,yo,xo+(int)(sl*Math.sin(cal.get(Calendar.SECOND)*Math.PI/30)),
    yo-(int)(sl*Math.cos(cal.get(Calendar.SECOND)*Math.PI/30)));

    }
        public static void main(String args[]){
    MyCalendar_Clock Mycc=new MyCalendar_Clock();
    }
    }
      

  13.   

    我定义了一个MyCalendar_Clock类,继承JFrame 实现接口Runnable,然后定义了构造方法,主方法,别的方法瞻仰搬过来,由于自己很菜,里面肯定有不妥之处,还望高手指点指点我public class MyCalendar_Clock extends JFrame implements Runnable
    //private JPanel jp;
    //public static final String WEEK_SUN = "SUN"; 
    //public static final String WEEK_MON = "MON";
    //等等。。
    MyCalendar_Clock()
    {
    Thread c=new Thread(this);
    c.start();
    JFrame frame=new JFrame("MyCalendar_Clock");
    jp=new JPanel();
    add(jp,BorderLayout.CENTER);
    add(cPane,BorderLayout.SOUTH);
    frame.setSize(300, 300);
            frame.setVisible(true);
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
    setVisible(true);

    cPane = (JPanel) getContentPane();//*********************************
    }//.............其余的方法run  paint  init  等等照样搬过来,public static void main(String args[]){
    MyCalendar_Clock Mycc=new MyCalendar_Clock();
    Mycc.init();
      

  14.   


    俺实践下俺的承诺 以下为同一个java文件 名为MyTool.java 因为太长所以分开发import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.DateFormat;
    import java.util.Calendar;import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.ListSelectionModel;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.table.TableModel;class MyClock extends JPanel implements Runnable{
        private JTextField jt;
        private JPanel jp;
        public MyClock(){
            Thread c=new Thread(this);
            c.start();
            jp=new JPanel();
            jt=new JTextField();
            jt.setEditable(false);
            jt.setHorizontalAlignment(jt.CENTER);
            this.setLayout(new BorderLayout());
            add(jt,BorderLayout.SOUTH);
          add(jp,BorderLayout.CENTER);
        
        }
        public void run(){
            while(true){
                this.repaint();
                try{
                        Thread.sleep(1000);
                }
                catch(Exception e){
                    e.printStackTrace();
                }
        
            }
            
        }
        public void paint(Graphics g){
            super.paint(g);
        Calendar cal=Calendar.getInstance();
        DateFormat format=DateFormat.getDateTimeInstance(DateFormat.LONG,
        DateFormat.LONG,this.getLocale());
        jt.setText(format.format(cal.getTime()));
        int min=Math.min(this.getSize().width,this.getSize().height);
        int radix=(int)(min*0.8);
        int kedu=(int)(radix*0.48);
        int sl=(int)(radix*0.4);
        int ml=(int)(sl*0.8);
        int hl=(int)(ml*0.8);
        int xo=this.getSize().width/2;
        int yo=this.getSize().height/2;
        for(int i=0;i<60;i++){
            if(i%5==0){
                    g.drawLine((int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
            (int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))),
            (int)(xo+(radix/2)*(Math.sin(i*Math.PI/30))),
            (int)(yo-(radix/2*(Math.cos(i*Math.PI/30)))));
            if(i==0)
            g.drawString(""+12,(int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
            (int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))));
            else
                g.drawString(""+i/5,(int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
            (int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))));
            }
            g.drawLine((int)(kedu*(Math.sin(i*Math.PI/30))+xo),
            (int)(yo-(kedu*(Math.cos(i*Math.PI/30)))),
            (int)(xo+(radix/2)*(Math.sin(i*Math.PI/30))),
            (int)(yo-(radix/2*(Math.cos(i*Math.PI/30)))));
            }
        g.drawOval((this.getSize().width-radix)/2,(this.getSize().height-radix)/2,radix,radix);
        Graphics2D gg=(Graphics2D)g;
        gg.setColor(Color.MAGENTA);
        gg.setStroke(new BasicStroke(4.5f));
        gg.drawLine(xo,yo,xo+(int)(hl*Math.sin((cal.get(Calendar.MINUTE)/60.0+cal.get(Calendar.HOUR))*
        Math.PI/6)),yo-(int)((hl*Math.cos((cal.get(Calendar.MINUTE)/60.0+cal.get(Calendar.HOUR))*
        Math.PI/6))));
        gg.setColor(Color.BLUE);
        gg.setStroke(new BasicStroke(2.7f));
        gg.drawLine(xo,yo,xo+(int)(ml*Math.sin(cal.get(Calendar.MINUTE)*Math.PI/30)),
        yo-(int)(ml*Math.cos(cal.get(Calendar.MINUTE)*Math.PI/30)));
        gg.setStroke(new BasicStroke(1.0f));
        gg.setColor(Color.RED);
        gg.drawLine(xo,yo,xo+(int)(sl*Math.sin(cal.get(Calendar.SECOND)*Math.PI/30)),
        yo-(int)(sl*Math.cos(cal.get(Calendar.SECOND)*Math.PI/30)));
        
    }
    }
      

  15.   

    class MyInnerCalendar extends JPanel {
     
        public static final String WEEK_SUN = "SUN"; 
        public static final String WEEK_MON = "MON"; 
        public static final String WEEK_TUE = "TUE"; 
        public static final String WEEK_WED = "WED"; 
        public static final String WEEK_THU = "THU"; 
        public static final String WEEK_FRI = "FRI"; 
        public static final String WEEK_SAT = "SAT";
     
        public static final Color background = Color.white; 
        public static final Color foreground = Color.black; 
        public static final Color headerBackground = Color.blue; 
        public static final Color headerForeground = Color.white; 
        public static final Color selectedBackground = Color.blue; 
        public static final Color selectedForeground = Color.white;
        private JLabel yearsLabel; 
        private JSpinner yearsSpinner; 
        private JLabel monthsLabel; 
        private JComboBox monthsComboBox; 
        private JTable daysTable; 
        private AbstractTableModel daysModel; 
        private Calendar calendar; 
        
     
        public void init() { 
            this.setLayout(new BorderLayout());
     
            calendar = Calendar.getInstance(); 
            calendar = Calendar.getInstance();      
            yearsLabel = new JLabel("Year: "); 
            yearsSpinner = new JSpinner(); //选择年份
            yearsSpinner.setEditor(new JSpinner.NumberEditor(yearsSpinner, "0000"));
            yearsSpinner.setValue(new Integer(calendar.get(Calendar.YEAR))); 
            yearsSpinner.addChangeListener(new ChangeListener() { 
                    public void stateChanged(ChangeEvent changeEvent) { 
                        int day = calendar.get(Calendar.DAY_OF_MONTH);
                        calendar.set(Calendar.DAY_OF_MONTH, 1);
                        calendar.set(Calendar.YEAR, ((Integer) yearsSpinner.getValue()).intValue());
                        int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
                        calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
                        updateView(); 
                    } });
                                 
            JPanel yearMonthPanel = new JPanel(); 
            this.add(yearMonthPanel, BorderLayout.NORTH); //增加年月的面板
            yearMonthPanel.setLayout(new BorderLayout()); 
            yearMonthPanel.add(new JPanel(), BorderLayout.CENTER);
             
            JPanel yearPanel = new JPanel(); 
            yearMonthPanel.add(yearPanel, BorderLayout.WEST); 
            yearPanel.setLayout(new BorderLayout()); 
            yearPanel.add(yearsLabel, BorderLayout.WEST); 
            yearPanel.add(yearsSpinner, BorderLayout.CENTER);
            monthsLabel = new JLabel("Month: "); 
            monthsComboBox = new JComboBox(); 
            for (int i = 1; i <= 12; i++) { 
                monthsComboBox.addItem(new Integer(i)); 
            } 
            monthsComboBox.setSelectedIndex(calendar.get(Calendar.MONTH)); 
            monthsComboBox.addActionListener(new ActionListener() { 
                    public void actionPerformed(ActionEvent actionEvent) {
                        int day = calendar.get(Calendar.DAY_OF_MONTH);
                        calendar.set(Calendar.DAY_OF_MONTH, 1);
                        calendar.set(Calendar.MONTH, monthsComboBox.getSelectedIndex());
                        int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
                        calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
                        updateView(); 
                    } 
                }); 
            JPanel monthPanel = new JPanel(); 
            yearMonthPanel.add(monthPanel, BorderLayout.EAST); 
            monthPanel.setLayout(new BorderLayout()); 
            monthPanel.add(monthsLabel, BorderLayout.WEST); 
            monthPanel.add(monthsComboBox, BorderLayout.CENTER);        daysModel = new AbstractTableModel() { 
                    public int getRowCount() { 
                        return 7; 
                    }
     
                    public int getColumnCount() { 
                        return 7; 
                    }
     
                    public Object getValueAt(int row, int column) { 
                        if (row == 0) { 
                            return getHeader(column); 
                        } 
                        row--; 
                        Calendar calendar = (Calendar) MyInnerCalendar.this.calendar.clone();
                        calendar.set(Calendar.DAY_OF_MONTH, 1);
                        int dayCount = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
                        int moreDayCount = calendar.get(Calendar.DAY_OF_WEEK) - 1; 
                        int index = row * 7 + column; 
                        int dayIndex = index - moreDayCount + 1;
                        if (index < moreDayCount || dayIndex > dayCount) { 
                            return null; 
                        } else { 
                            return new Integer(dayIndex); 
                        } 
                    } 
                };
     
            daysTable = new CalendarTable(daysModel, calendar); 
            daysTable.setCellSelectionEnabled(true);
            daysTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     
            daysTable.setDefaultRenderer(daysTable.getColumnClass(0), new TableCellRenderer() { 
                    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
                                                                   boolean hasFocus, int row, int column) { 
                        String text = (value == null) ? "" : value.toString(); 
                        JLabel cell = new JLabel(text); 
                        cell.setOpaque(true); 
                        if (row == 0) { 
                            cell.setForeground(headerForeground); 
                            cell.setBackground(headerBackground); 
                        } else { 
                            if (isSelected) { 
                                cell.setForeground(selectedForeground); 
                                cell.setBackground(selectedBackground); 
                            } else { 
                                cell.setForeground(foreground); 
                                cell.setBackground(background); 
                            } 
                        }
     
                        return cell; 
                    } 
                });
            updateView();
     
            this.add(daysTable, BorderLayout.CENTER); 
        }
     
        public static String getHeader(int index) { 
            switch (index) { 
            case 0: 
                return WEEK_SUN; 
            case 1: 
                return WEEK_MON; 
            case 2: 
                return WEEK_TUE; 
            case 3: 
                return WEEK_WED; 
            case 4: 
                return WEEK_THU; 
            case 5: 
                return WEEK_FRI; 
            case 6: 
                return WEEK_SAT; 
            default: 
                return null; 
            } 
        }
     
        public void updateView() { 
            daysModel.fireTableDataChanged();
            daysTable.setRowSelectionInterval(calendar.get(Calendar.WEEK_OF_MONTH),
                                              calendar.get(Calendar.WEEK_OF_MONTH));
            daysTable.setColumnSelectionInterval(calendar.get(Calendar.DAY_OF_WEEK) - 1,
                                                 calendar.get(Calendar.DAY_OF_WEEK) - 1);
        }    public static class CalendarTable extends JTable {        private Calendar calendar;        public CalendarTable(TableModel model, Calendar calendar) {
                super(model);
                this.calendar = calendar;
            }        public void changeSelection(int row, int column, boolean toggle, boolean extend) {
                super.changeSelection(row, column, toggle, extend);
                if (row == 0) {
                    return;
                }
                Object obj = getValueAt(row, column);
                if (obj != null) {
                    calendar.set(Calendar.DAY_OF_MONTH, ((Integer)obj).intValue());
                }
            }    }
    } public class MyTool{
    public static void main(String[] args) {
    JFrame jf=new JFrame();
    MyClock mc=new MyClock();
    MyInnerCalendar mic=new MyInnerCalendar();
    mic.init();
    jf.setSize(600,250);
    jf.add(mc,BorderLayout.EAST);
    jf.add(mic);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setVisible(true);
    }
    }