import javax.swing.*;import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
class MainFrame extends JFrame{
    JPanel panel=new JPanel(new BorderLayout());
    JPanel panel1=new JPanel();
    JPanel panel2=new JPanel(new GridLayout(7,7));
    JPanel panel3=new JPanel();
    JLabel []label=new JLabel[49];
    JLabel y_label=new JLabel("年份");
    JLabel m_label=new JLabel("月份");
    JComboBox com1=new JComboBox();
    JComboBox com2=new JComboBox();
    JButton button=new JButton("查看");
    JButton button2=new JButton("修改");
    Date today = new Date();
    JSpinner s = new JSpinner(new SpinnerDateModel(today, null, null, Calendar.MONTH));
    JSpinner.DateEditor de = new JSpinner.DateEditor(s, "yyyy'年'MM'月'dd'日'HH:mm:ss");
    int re_year,re_month;
    int x_size,y_size;
    String year_num;
    Calendar now=Calendar.getInstance();    //实例化Calendar
    MainFrame(){
        super("万年历");
        setSize(300,350);
        x_size=(int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth());
        y_size=(int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight());
        setLocation((x_size-300)/2,(y_size-350)/2);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel1.add(y_label);
        panel1.add(com1);
        panel1.add(m_label);
        panel1.add(com2);
        panel1.add(button);
        //panel3.add(new Clock(this));
        s.setEditor(de);
        s.setEnabled(true);
        panel3.add(s);
        panel3.add(button2);
        for(int i=0;i<49;i++){
            label[i]=new JLabel("",JLabel.CENTER);//将显示的字符设置为居中
            panel2.add(label[i]);
        }
        panel.add(panel1,BorderLayout.NORTH);
        panel.add(panel2,BorderLayout.CENTER);
        panel.add(panel3,BorderLayout.SOUTH);
        panel.setBackground(Color.white);
        panel1.setBackground(Color.white);
        panel2.setBackground(Color.white);
        panel3.setBackground(Color.WHITE);
        Init();
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                int c_year,c_month,c_week;
                c_year=Integer.parseInt(com1.getSelectedItem().toString());        //得到当前所选年份
                c_month=Integer.parseInt(com2.getSelectedItem().toString())-1;    //得到当前月份,并减1,计算机中的月为0-11
                c_week=use(c_year,c_month);        //调用函数use,得到星期几
                Resetday(c_week,c_year,c_month);        //调用函数Resetday
            }});
        setContentPane(panel);
        setVisible(true);
        setResizable(false);
    }
    public void Init(){
    int year,month_num,first_day_num;
    String log[]={"日","一","二","三","四","五","六"};
    for(int i=0;i<7;i++){
    label[i].setText(log[i]);
    }
    for(int i=0;i<49;i=i+7){
        label[i].setForeground(Color.red);    //将星期日的日期设置为红色
    }
    for(int i=6;i<49;i=i+7){
        label[i].setForeground(Color.green);//将星期六的日期设置为绿色
    }
    for(int i=1;i<10000;i++){
        com1.addItem(""+i);
    }
    for(int i=1;i<13;i++){
        com2.addItem(""+i);
    }
    month_num=(int)(now.get(Calendar.MONTH));    //得到当前时间的月份
    year=(int)(now.get(Calendar.YEAR));            //得到当前时间的年份
    com1.setSelectedIndex(year-1);                //设置下拉列表显示为当前年
    com2.setSelectedIndex(month_num);            //设置下拉列表显示为当前月
    first_day_num=use(year,month_num);
    Resetday(first_day_num,year,month_num);
    }
    public int use(int reyear,int remonth){
        int week_num;
        now.set(reyear,remonth,1);        //设置时间为所要查询的年月的第一天
        week_num= (int)(now.get(Calendar.DAY_OF_WEEK));//得到第一天的星期
        return week_num;
    }
    public void Resetday(int week_log,int year_log,int month_log){
        int month_score_log;    //判断是否是闰年的标记
        int month_day_score;    //存储月份的天数
        int count;
        month_score_log=0;
        month_day_score=0;
        count=1;
        if(year_log%4==0&&year_log%100!=0||year_log%400==0){//判断是否为闰年
            month_score_log=1;
        }
    month_log=month_log+1;    //将传来的月份数加1
    switch(month_log){
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
        month_day_score=31;
        break;
        case 4:
        case 6:
        case 9:
        case 11:
        month_day_score=30;
        break;
        case 2:
        if(month_score_log==1){
        month_day_score=29;    
        }
        else{
        month_day_score=28;
        }
        break;
        }
        for(int i=7;i<49;i++){        //初始化标签
            label[i].setText("");
        }
        week_log=week_log+6;        //将星期数加6,使显示正确
        month_day_score=month_day_score+week_log;
        for(int i=week_log;i<month_day_score;i++,count++){
            label[i].setText(count+"");
        }
    }
    public static void main(String [] args){
        JFrame.setDefaultLookAndFeelDecorated(true);
        MainFrame start=new MainFrame();
    }    
}
请教各位,有没有好的方法让jspinner控件显示系统时间时虽系统时间变化来更新显示,我想到过用paint()方法。但好像只支持Graphics g?

解决方案 »

  1.   

    通过显示系统时间来更新显示数据?呵呵,很少做application的东西,不过我想都大同小异。在这里不敢妄自瞎说,只能说楼主可以想想通过时间来控制的过程是怎么样的。就应该没有问题。
      

  2.   


    import javax.swing.*;
    import java.awt.*;
    import java.util.*;
    import java.text.*;public class tt extends JFrame {
    private JLabel tipLabel; private JTextField timeText; private Container container; public tt() {
    container = getContentPane();
    container.setLayout(new FlowLayout());
    tipLabel = new JLabel("当前时间:");
    timeText = new JTextField(25);
    timeText.setEditable(false);
    container.add(tipLabel);
    container.add(timeText);
    Thread thread = new Display(timeText);
    thread.start();
    pack();// 自动调整窗体大小
    setVisible(true);
    setSize(250, 100);
    } public static void main(String[] args) {
    tt newTime = new tt();
    newTime.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }class Display extends Thread {
    private JTextField timeField; Display(JTextField field) {
    timeField = field;
    } DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG,
    DateFormat.LONG, Locale.CHINA);
    {
    df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
    } public void run() {
    while (true) {
    Date date = new Date();
    timeField.setText(df.format(date));
    try {
    Thread.sleep(1000);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }
    上边例子作为参考,则不难实现了。只是需要把textfiled换成JSpinner。希望能举一反三。大家再接再励了。可以结贴了。
      

  3.   

    用Timer实现吧,javax.swing.Timer实现定时执行任务,而且比较方便。int delay = 1000;//一秒
    Timer timer = new Timer(delay,new ActionListener(){
        public void actionPerformed(ActionEvent e){
            //在这里做事情。
            //比用线程去控制方便。
        }
    });
      

  4.   

    第一个代码应该还需要将MainFrame类声明为public型
      

  5.   

    启用一个新线程吧,加一个WHILE循环,每隔一秒获得一次系统时间再把它设置回去就行了.
    看看下面这段代码也许对你有些帮助:
    private class showT extends Thread {
    public void run() {
    while (true) {
    String time = new SimpleDateFormat("  HH :mm :ss ")
    .format(new Date());
    myTimer.getL2().setText(time); //这是将时间交给一个Label标签显示
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }
      

  6.   

    用一个Thread来更新spinner里的内容。
      

  7.   

    10楼,11楼的朋友。我在4楼的代码就是使用线程来解决1楼提出的问题。但现在SPINNER这个控件用的不是很熟,出现了7楼描述的问题,不知哪位朋友能够解决。我仅仅能想到解决7楼的问题可能会用到spinner的焦点扑捉时间和输入控制事件。
      

  8.   

    12楼,再问你一下。你是否想手动改完spinner里的内容后停止自动更新呢?
      

  9.   

    TO 13楼:
          对,并且想只修改数字,年,月,日还有冒号还得要控制,不能删除,我的意思就是桌面右下角的时间和日期属性里的调整时间用java重写。但用到了Spinner控件,说实话用的不是很熟。不知有没有兴趣研究一下。我也是自己做来玩玩
      

  10.   

    我写了一个对话框的提供给你一种思路;
    import java.awt.Point;
    import java.text.DateFormat;
    import java.util.Date;
    import java.util.Locale;
    import javax.swing.JDialog;
    import javax.swing.JFrame;public class Sdialog extends JDialog implements Runnable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String time; public Sdialog() { this.setSize(500, 400);
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    this.setVisible(true);
    this.setLayout(null);
    this.setLocation(new Point(300, 500));
            
    } public void run()  {
    while (this.isShowing()) {
    time = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.LONG, Locale.SIMPLIFIED_CHINESE).format(new Date());
    this.setTitle(time);
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {

    e.printStackTrace();
    }
    }
    } public static void main(String[] args) {
    new Sdialog().run();
    }
    }
    用线程的话,一定要控制好,
    while(true){  Thread.sleep(XXX);
      //dosomething;
    }这种结构,不设置flag(标志位)的话,很容易在UI资源注销之后,线程仍然在运行。所以一定要设置flag,还有就是,sleep也是必不可少的,如果少了,线程一直占用CPU资源,会使得CPU占用率很高的。