private void jbInit() throws Exception
    {
        titledBorder1 = new TitledBorder("");
        this.setDefaultCloseOperation(3);
        this.setFont(new java.awt.Font("Dialog", 0, 10));
        this.setModal(true);
        this.setResizable(false);
        this.getContentPane().setLayout(borderLayout3);
        intYear=calendar.get(Calendar.YEAR);
        intMonth=calendar.get(Calendar.MONTH);
        intDay=calendar.get(Calendar.DATE);        YearScrollbar.setMaximum(2100);//最大年份
        YearScrollbar.setMinimum(1900);//最小年份
        YearScrollbar.setOrientation(JScrollBar.HORIZONTAL);
        YearScrollbar.setFont(new java.awt.Font("Dialog", 0, 10));
        YearScrollbar.setBorder(BorderFactory.createLoweredBevelBorder());
        YearScrollbar.setMaximumSize(new Dimension(16, 20));
        YearScrollbar.setMinimumSize(new Dimension(16, 20));
        YearScrollbar.setNextFocusableComponent(table);
        YearScrollbar.setPreferredSize(new Dimension(50, 20));
        YearScrollbar.setValue(intYear);        for(int i=1;i<=12;i++)
            MonthChoice.addItem(String.valueOf(i));
        MonthChoice.setSelectedIndex(intMonth);
        panel2.setLayout(xYLayout1);
        MonthChoice.setFont(new java.awt.Font("Dialog", 0, 10));
        MonthChoice.setBorder(BorderFactory.createLoweredBevelBorder());
        MonthChoice.setMaximumRowCount(2);        label3.setFont(new java.awt.Font("Dialog", 0, 10));
        label3.setText(" 月");
        label2.setFont(new java.awt.Font("Dialog", 0, 10));
        label2.setText(" 年 ");        table.getTableHeader().setFont(new Font("Dialog",0,10));
        table.getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer()
        {
            public Component getTableCellRendererComponent(JTable table,
                                               Object value,
                                               boolean isSelected,
                                               boolean hasFocus,
                                               int row,
                                               int column)
            {
                if(value!=null)
                    return new JLabel(value.toString(),JLabel.CENTER);
                else
                    return new JLabel();
            }
        });        table.getTableHeader().setResizingAllowed(false);
        table.getTableHeader().setReorderingAllowed(false);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setCellSelectionEnabled(true);
        table.setColumnSelectionAllowed(true);
        table.setRowSelectionAllowed(true);
        table.setShowHorizontalLines(false);
        table.setShowVerticalLines(false);
        table.setGridColor(Color.white);
        table.setRowMargin(3);
        table.setFont(new java.awt.Font("Dialog", 0, 10));
        table.setAlignmentX((float) 0.0);
        table.setAlignmentY((float) 0.0);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);        jPanel1.setLayout(borderLayout1);
        TimeLabel.setFont(new java.awt.Font("Dialog", 0, 10));
        TimeLabel.setText("label1");
        jPanel2.setLayout(borderLayout2);
        jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        jScrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        jScrollPane1.setBorder(BorderFactory.createLoweredBevelBorder());
        jScrollPane1.setNextFocusableComponent(table);
        jPanel1.setBorder(BorderFactory.createLineBorder(Color.black));
        jPanel1.setNextFocusableComponent(table);
        YearTextField.setColumns(4);
        YearTextField.setEditable(false);
        YearTextField.setFont(new java.awt.Font("Dialog", 0, 10));
        YearTextField.setDisabledTextColor(Color.white);
        YearTextField.setText(String.valueOf(intYear));
        panel2.setNextFocusableComponent(table);
        jPanel2.setNextFocusableComponent(table);
        this.getContentPane().add(jPanel1,  BorderLayout.CENTER);
        jPanel1.add(jScrollPane1, BorderLayout.CENTER);
        jPanel1.add(panel2, BorderLayout.NORTH);        panel2.add(MonthChoice, new XYConstraints(89, 0, 37, -1));
        panel2.add(label3, new XYConstraints(127, 0, 15, 20));
        panel2.add(label2, new XYConstraints(74, 0, -1, 20));
        panel2.add(YearTextField, new XYConstraints(22, 0, 30, -1));
        panel2.add(YearScrollbar, new XYConstraints(1, 0, 72, -1));        jPanel1.add(jPanel2, BorderLayout.SOUTH);
        jPanel2.add(TimeLabel,  BorderLayout.WEST);
        table.setSelectionMode(0);        MonthChoice.addItemListener(new java.awt.event.ItemListener()
        {
            public void itemStateChanged(ItemEvent e)
            {
                intMonth=MonthChoice.getSelectedIndex();
                fillDate(intYear,intMonth,intDay);
            }
        });        YearScrollbar.addAdjustmentListener(new java.awt.event.AdjustmentListener()
        {
            public void adjustmentValueChanged(AdjustmentEvent e)
            {
                intYear=YearScrollbar.getValue();
                YearTextField.setText(String.valueOf(intYear));
                fillDate(intYear,intMonth,intDay);
            }
        });        //日期表格鼠标动作处理
        table.addMouseListener(new java.awt.event.MouseAdapter()
        {
            public void mouseClicked(MouseEvent e)
            {
                if(e.getClickCount()>1)//不单击
                {
                    try
                    {
                        Integer.parseInt(table.getValueAt(table.getSelectedRow(),
                                table.getSelectedColumn()).toString());
                        isConfirm = true;
                        //System.out.println(FinalyDate);
                        int n = table.getComponentCount();
                        table.getComponent(n).setBackground(Color.blue);
//这里~我写得不对~应该如何去写?
                        //cancel();//退出
                    }
                    catch(Exception ex){}
                }
                else//单击更改状态栏日期
                try
                {
                    intDay = Integer.parseInt(table.getValueAt(table.getSelectedRow(),
                            table.getSelectedColumn()).toString());
                    calendar = new GregorianCalendar(intYear,intMonth,intDay);
                }                catch(NumberFormatException ex){}
                catch(NullPointerException ex){}
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy'-'MM'-'dd");
                FinalyDate = sdf.format(calendar.getTime());
                TimeLabel.setText(FinalyDate);
            }
        });
        this.requestFocus();
        table.requestFocus();
        fillDate(intYear,intMonth,intDay);
    }    public void show()
    {
        isConfirm=false;
        super.show();
    }    /**如果选择了日期*/
    public boolean isConfirm()
    {
        return isConfirm;
    }    protected void processWindowEvent(WindowEvent e)
    {
        if (e.getID() == WindowEvent.WINDOW_CLOSING)
        {
            cancel();
        }
        super.processWindowEvent(e);
    }    private void cancel()
    {
        dispose();
    }    public void run()
    {
    }}

解决方案 »

  1.   

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.table.*;
    import java.util.Calendar;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import javax.swing.*;
    import com.borland.jbcl.layout.*;
    import java.beans.*;
    import javax.swing.border.*;
    import javax.swing.event.*;public class CalendarDlg extends JDialog implements Runnable
    {
        private GregorianCalendar calendar = new GregorianCalendar();//日期
        private int intYear=2000;//年
        private int intMonth=1;//月
        private int intDay=1;//日
        private String FinalyDate="";//输出的日期字符窜
        private boolean isRun=true;//是否在运行
        private int doubleClickedRow = 0;
        private int doubleClickedColumn = 0;
        private boolean isDoubleClicked = false;
        //构造一个不可编辑的表模型 model
        private DefaultTableModel model=new DefaultTableModel(new Object[6][7],
                    new Object[]{"日","一","二","三","四","五","六"})
        {
            public boolean isCellEditable(int row,int column)
            {
                return false;
            }
        };    private TitledBorder titledBorder1;
        private JPanel jPanel1 = new JPanel();
        private JPanel panel2 = new JPanel();
        private JComboBox MonthChoice = new JComboBox();//月份选择框
        private JLabel label3 = new JLabel();
        private JLabel label2 = new JLabel();
        private JScrollBar YearScrollbar = new JScrollBar();    private JTable table = new JTable(model)
        {//日期表格
            public TableCellRenderer getCellRenderer(int row,int column)
            {
                return new DefaultTableCellRenderer()
                {//日期表格填充并设定组件
                    public Component getTableCellRendererComponent(JTable table,
                                                   Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus,
                                                   int row,
                                                   int column)
                    {
                        JLabel label=null;
                        if(value!=null)
                        {
                            label = new JLabel(value.toString(),JLabel.CENTER);
                            label.setOpaque(true);
                            label.setFont(table.getFont());
                            if(isSelected)//选择日期
                            {
                                label.setForeground(Color.white);
                                label.setBackground(Color.green);
                                label.setBorder(BorderFactory.createLineBorder(Color.yellow));
                            }
                            else//没有选择
                            {
                                label.setForeground(Color.black);
                                label.setBackground(Color.white);
                            }
                            if (isDoubleClicked && doubleClickedRow == row && doubleClickedColumn == column) {
                                label.setForeground(Color.white);
                                label.setBackground(Color.blue);
                                isDoubleClicked = false;
                            }
                        }
                        return label;
                    }
                };
            }
        };    private JScrollPane jScrollPane1 = new JScrollPane(table);
        private JPanel jPanel2 = new JPanel();
        private JLabel TimeLabel = new JLabel();
        private BorderLayout borderLayout2 = new BorderLayout();
        private BorderLayout borderLayout3 = new BorderLayout();
        private BorderLayout borderLayout1 = new BorderLayout();
        private XYLayout xYLayout1 = new XYLayout();
        private JTextField YearTextField = new JTextField();//年
        private boolean isConfirm=false;    public CalendarDlg(Frame parentFrame)
        {
            super(parentFrame,"",true);
            try
            {
                jbInit();
                enableEvents(AWTEvent.WINDOW_EVENT_MASK);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
            this.setSize(350,500);
            setLocation((d.width -getWidth())/2,(d.height-getHeight())/2) ;
        }    //给 model 添加日期
        private void fillDate(int pYear,int pMonth,int pDay)
        {
            calendar = new GregorianCalendar(pYear,pMonth,1);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy'-'MM'-'dd");
            FinalyDate = sdf.format(new GregorianCalendar(pYear,pMonth,pDay).getTime());//获得当前日期
            TimeLabel.setText(FinalyDate);//下面显示日期 label        int maxDayCount = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
            if(pDay>maxDayCount)
                pDay=maxDayCount;
            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
            int selectRow = 0;
            int selectCol = dayOfWeek;
            int count=0;
            int num=0;        for(int i=0;i<6;i++)
            {
                for(int j=0;j<7;j++)
                {
                    count++;
                    if(count>=dayOfWeek&&count<maxDayCount+dayOfWeek)
                    {
                        model.setValueAt(String.valueOf(++num),i,j);
                        if(num==pDay)
                        {
                            selectRow=i;
                            selectCol=j;
                        }
                    }
                    else
                        model.setValueAt(null,i,j);
                }
            }        table.setRowSelectionInterval(selectRow,selectRow);
            table.setColumnSelectionInterval(selectCol,selectCol);
        }    //得到选择日期
        public String getFinalyDate()
        {
            return FinalyDate;
        }
      

  2.   


        private void jbInit() throws Exception
        {
            titledBorder1 = new TitledBorder("");
            this.setDefaultCloseOperation(3);
            this.setFont(new java.awt.Font("Dialog", 0, 10));
            this.setModal(true);
            this.setResizable(false);
            this.getContentPane().setLayout(borderLayout3);
            intYear=calendar.get(Calendar.YEAR);
            intMonth=calendar.get(Calendar.MONTH);
            intDay=calendar.get(Calendar.DATE);        YearScrollbar.setMaximum(2100);//最大年份
            YearScrollbar.setMinimum(1900);//最小年份
            YearScrollbar.setOrientation(JScrollBar.HORIZONTAL);
            YearScrollbar.setFont(new java.awt.Font("Dialog", 0, 10));
            YearScrollbar.setBorder(BorderFactory.createLoweredBevelBorder());
            YearScrollbar.setMaximumSize(new Dimension(16, 20));
            YearScrollbar.setMinimumSize(new Dimension(16, 20));
            YearScrollbar.setNextFocusableComponent(table);
            YearScrollbar.setPreferredSize(new Dimension(50, 20));
            YearScrollbar.setValue(intYear);        for(int i=1;i<=12;i++)
                MonthChoice.addItem(String.valueOf(i));
            MonthChoice.setSelectedIndex(intMonth);
            panel2.setLayout(xYLayout1);
            MonthChoice.setFont(new java.awt.Font("Dialog", 0, 10));
            MonthChoice.setBorder(BorderFactory.createLoweredBevelBorder());
            MonthChoice.setMaximumRowCount(2);        label3.setFont(new java.awt.Font("Dialog", 0, 10));
            label3.setText(" 月");
            label2.setFont(new java.awt.Font("Dialog", 0, 10));
            label2.setText(" 年 ");        table.getTableHeader().setFont(new Font("Dialog",0,10));
            table.getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer()
            {
                public Component getTableCellRendererComponent(JTable table,
                                                   Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus,
                                                   int row,
                                                   int column)
                {
                    if(value!=null)
                        return new JLabel(value.toString(),JLabel.CENTER);
                    else
                        return new JLabel();
                }
            });        table.getTableHeader().setResizingAllowed(false);
            table.getTableHeader().setReorderingAllowed(false);
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            table.setCellSelectionEnabled(true);
            table.setColumnSelectionAllowed(true);
            table.setRowSelectionAllowed(true);
            table.setShowHorizontalLines(false);
            table.setShowVerticalLines(false);
            table.setGridColor(Color.white);
            table.setRowMargin(3);
            table.setFont(new java.awt.Font("Dialog", 0, 10));
            table.setAlignmentX((float) 0.0);
            table.setAlignmentY((float) 0.0);
            table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);        jPanel1.setLayout(borderLayout1);
            TimeLabel.setFont(new java.awt.Font("Dialog", 0, 10));
            TimeLabel.setText("label1");
            jPanel2.setLayout(borderLayout2);
            jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            jScrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
            jScrollPane1.setBorder(BorderFactory.createLoweredBevelBorder());
            jScrollPane1.setNextFocusableComponent(table);
            jPanel1.setBorder(BorderFactory.createLineBorder(Color.black));
            jPanel1.setNextFocusableComponent(table);
            YearTextField.setColumns(4);
            YearTextField.setEditable(false);
            YearTextField.setFont(new java.awt.Font("Dialog", 0, 10));
            YearTextField.setDisabledTextColor(Color.white);
            YearTextField.setText(String.valueOf(intYear));
            panel2.setNextFocusableComponent(table);
            jPanel2.setNextFocusableComponent(table);
            this.getContentPane().add(jPanel1,  BorderLayout.CENTER);
            jPanel1.add(jScrollPane1, BorderLayout.CENTER);
            jPanel1.add(panel2, BorderLayout.NORTH);        panel2.add(MonthChoice, new XYConstraints(89, 0, 37, -1));
            panel2.add(label3, new XYConstraints(127, 0, 15, 20));
            panel2.add(label2, new XYConstraints(74, 0, -1, 20));
            panel2.add(YearTextField, new XYConstraints(22, 0, 30, -1));
            panel2.add(YearScrollbar, new XYConstraints(1, 0, 72, -1));        jPanel1.add(jPanel2, BorderLayout.SOUTH);
            jPanel2.add(TimeLabel,  BorderLayout.WEST);
            table.setSelectionMode(0);        MonthChoice.addItemListener(new java.awt.event.ItemListener()
            {
                public void itemStateChanged(ItemEvent e)
                {
                    intMonth=MonthChoice.getSelectedIndex();
                    fillDate(intYear,intMonth,intDay);
                }
            });        YearScrollbar.addAdjustmentListener(new java.awt.event.AdjustmentListener()
            {
                public void adjustmentValueChanged(AdjustmentEvent e)
                {
                    intYear=YearScrollbar.getValue();
                    YearTextField.setText(String.valueOf(intYear));
                    fillDate(intYear,intMonth,intDay);
                }
            });        //日期表格鼠标动作处理
            table.addMouseListener(new java.awt.event.MouseAdapter()
            {
                public void mouseClicked(MouseEvent e)
                {
                    if(e.getClickCount()>1)//不单击
                    {
                        try
                        {
                            Integer.parseInt(table.getValueAt(table.getSelectedRow(),
                                    table.getSelectedColumn()).toString());
                            isConfirm = true;
                            isDoubleClicked = true;
                            doubleClickedRow = table.getSelectedRow();
                            doubleClickedColumn = table.getSelectedColumn();
                            table.repaint();
    //这里~我写得不对~应该如何去写?
                            //cancel();//退出
                        }
                        catch(Exception ex){}
                    }
                    else//单击更改状态栏日期
                    try
                    {
                        intDay = Integer.parseInt(table.getValueAt(table.getSelectedRow(),
                                table.getSelectedColumn()).toString());
                        calendar = new GregorianCalendar(intYear,intMonth,intDay);
                    }                catch(NumberFormatException ex){}
                    catch(NullPointerException ex){}
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy'-'MM'-'dd");
                    FinalyDate = sdf.format(calendar.getTime());
                    TimeLabel.setText(FinalyDate);
                }
            });
            this.requestFocus();
            table.requestFocus();
            fillDate(intYear,intMonth,intDay);
        }    public void show()
        {
            isConfirm=false;
            super.show();
        }    /**如果选择了日期*/
        public boolean isConfirm()
        {
            return isConfirm;
        }    protected void processWindowEvent(WindowEvent e)
        {
            if (e.getID() == WindowEvent.WINDOW_CLOSING)
            {
                cancel();
            }
            super.processWindowEvent(e);
        }    private void cancel()
        {
            dispose();
        }    public void run()
        {
        }
    }