package swingExamples;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Date;
import java.util.GregorianCalendar;
import java.text.*;
public class TestTimer{
private JFrame jf;
private JButton start;
private JButton clear;
private JLabel header;
private JPanel record;
private int record_num;
private JLabel clock;
GregorianCalendar c;
GregorianCalendar old_c;
int yyyy,MM,day,HH,mm,ss;
String timestr;
Timer timer ;
public static void main(String[] args){
new TestTimer().init();

}
private void init(){
jf = new JFrame("运动秒表");
start = new JButton("Start");
clear = new JButton("Clear");
header = new JLabel();
header.setOpaque(true);
header.setBackground(Color.yellow);
clock = new JLabel();
clock.setHorizontalAlignment(JLabel.CENTER);
clock.setOpaque(true);//将clock设置为不透明的,才能显示下面的红色
clock.setBackground(Color.red);
clock.setText("0000-00-00  00:00:00");
record = new JPanel(new FlowLayout(FlowLayout.LEFT));
//record = new JPanel();
//record.setLayout(new GridLayout(20,1));
record_num = 0;
header.setText("共有 "+record_num+" 个记录");
JPanel jpanel = new JPanel(new GridLayout(1,2));
jpanel.add(start);
jpanel.add(clear);
MyMonitor1 m1 = new MyMonitor1();
timer = new Timer(1000,m1);//每隔一秒触发m1;
MyMonitor2 m2 = new MyMonitor2();
start.addActionListener(m2);
MyMonitor3 m3 = new MyMonitor3();
clear.addActionListener(m3);//清空记录;
record.add(header);
jf.add(jpanel,"North");
jf.add(record,BorderLayout.CENTER);
jf.add(clock,"South");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setBounds(400,400,280,400);
jf.setVisible(true);


}
//nested class MyMonitor1
class MyMonitor1 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
c = new GregorianCalendar();
yyyy = c.get(GregorianCalendar.YEAR);
MM = c.get(GregorianCalendar.MONTH);
day = c.get(GregorianCalendar.DATE);
HH = c.get(GregorianCalendar.HOUR_OF_DAY);
mm = c.get(GregorianCalendar.MINUTE);
ss = c.get(GregorianCalendar.SECOND);
String ph = HH<10?"0":"";
String pm = mm<10?"0":"";
String ps = ss<10?"0":"";
timestr = String.valueOf(yyyy)+"-"+String.valueOf(MM)+"-"
     +String.valueOf(day<10?"0"+day:day)+"  "+ph+String.valueOf(HH)+":"+pm+String.valueOf(mm)+
      ":"+ps+String.valueOf(ss);
clock.setText(timestr);

}
}

//nested class MyMonitor2
class MyMonitor2 implements ActionListener{
private boolean running = false;//running用于判断定时器是否启动;
@Override
public void actionPerformed(ActionEvent e){
if(!running){  //开始计时
timer.setInitialDelay(0);//首次延迟为0
timer.start();//启动定时器
clock.setBackground(Color.green);
start.setText("Pause");//按钮变为暂停
timestr = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss").format(new Date());//timestr用在第一次显示时间,以后显示时间可从clock上直接读取;
old_c = new GregorianCalendar();//old_c为当前时间,也就是开始计时时间;
//System.out.println(old_c.toString());
JLabel jlabel = new JLabel("开始时间是"+timestr);
jlabel.setOpaque(true);
jlabel.setBackground(Color.green);
record.add(jlabel);
//System.out.println(clock.getText());
}else{//暂停,按钮变为重新开始
timer.stop();//定时器暂停
clock.setBackground(Color.red);
start.setText("Restart");
JLabel jlabel = new JLabel("结束时间是"+clock.getText()+"   成绩"+()+"秒");
//jlabel.setBackground(Color.red);
jlabel.setOpaque(true);
record.add(jlabel);
record_num++;
//header.repaint();
//System.out.println(header.getText());
header.setText("共有 "+record_num+" 个记录");
}
running = !running;
}
private int (){//计算成绩  用结束时间c减去开始计时时间old_c;
int s = (int)(c.getTimeInMillis()-old_c.getTimeInMillis())/1000;//
if(s == 0){ //如果成绩小于1秒,计为1;
return 1;
}
return s;

}
}
//nested class MyMonitor3
class MyMonitor3 implements ActionListener{

public void actionPerformed(ActionEvent e){
clock.setText("0000-00-00  00:00:00");
record_num = 0;
record.removeAll();
header.setText("共有 "+record_num+" 个记录");
record.add(header);
record.repaint();
}
}
}
实现一个运动秒表的功能,这里有一个问题,就是record会一直往下加记录,这样当记录很多的时候只有放大jf才能看到全部,我想把record放在一个JScrollPane中,这样拖动垂直滚动条就查看全部的记录,不需要水平滚动条。哪位高手帮我修改下谢谢。。

解决方案 »

  1.   

    我试了 把JScrollPane的水平滚动条设为never,但是不行。。
      

  2.   

    用JTextArea替换JPanel package com.test;import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.GregorianCalendar;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.Timer;public class TestTimerT{
    private JFrame jf;
    private JButton start;
    private JButton clear;
    private JLabel header;
    private JTextArea record;
    // private JPanel record;
    private int record_num;
    private JLabel clock;
    GregorianCalendar c;
    GregorianCalendar old_c;
    int yyyy,MM,day,HH,mm,ss;
    String timestr;
    Timer timer; public static void main(String[] args){
    new TestTimerT().init();
    } private void init(){
    jf = new JFrame("运动秒表");
    start = new JButton("Start");
    clear = new JButton("Clear");
    header = new JLabel();
    header.setOpaque(true);
    header.setBackground(Color.yellow);
    clock = new JLabel();
    clock.setHorizontalAlignment(JLabel.CENTER);
    clock.setOpaque(true);// 将clock设置为不透明的,才能显示下面的红色
    clock.setBackground(Color.red);
    clock.setText("0000-00-00  00:00:00");
    record = new JTextArea();
    //record = new JPanel(new FlowLayout(FlowLayout.LEFT));
    // record = new JPanel();
    // record.setLayout(new GridLayout(20,1));
    record_num = 0;
    header.setText("共有 " + record_num + " 个记录");
    JPanel jpanel = new JPanel(new GridLayout(2,2));
    jpanel.add(start);
    jpanel.add(clear);
    jpanel.add(header);
    MyMonitor1 m1 = new MyMonitor1();
    timer = new Timer(1000,m1);// 每隔一秒触发m1;
    MyMonitor2 m2 = new MyMonitor2();
    start.addActionListener(m2);
    MyMonitor3 m3 = new MyMonitor3();
    clear.addActionListener(m3);// 清空记录;
    // record.add(header);
    jf.add(jpanel,"North");
    JScrollPane scroller = new JScrollPane(record);
    jf.add(scroller,BorderLayout.CENTER);
    jf.add(clock,"South");
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setBounds(400,400,280,400);
    jf.setVisible(true); } // nested class MyMonitor1
    class MyMonitor1 implements ActionListener{
    public void actionPerformed(ActionEvent e){
    c = new GregorianCalendar();
    yyyy = c.get(GregorianCalendar.YEAR);
    MM = c.get(GregorianCalendar.MONTH);
    day = c.get(GregorianCalendar.DATE);
    HH = c.get(GregorianCalendar.HOUR_OF_DAY);
    mm = c.get(GregorianCalendar.MINUTE);
    ss = c.get(GregorianCalendar.SECOND);
    String ph = HH < 10 ? "0" : "";
    String pm = mm < 10 ? "0" : "";
    String ps = ss < 10 ? "0" : "";
    timestr =
    String.valueOf(yyyy) + "-" + String.valueOf(MM) + "-" + String.valueOf(day < 10 ? "0" + day : day)
    + "  " + ph + String.valueOf(HH) + ":" + pm + String.valueOf(mm) + ":" + ps
    + String.valueOf(ss);
    clock.setText(timestr); }
    } // nested class MyMonitor2
    class MyMonitor2 implements ActionListener{
    private boolean running = false;// running用于判断定时器是否启动; public void actionPerformed(ActionEvent e){
    if(!running){ // 开始计时
    timer.setInitialDelay(0);// 首次延迟为0
    timer.start();// 启动定时器
    clock.setBackground(Color.green);
    start.setText("Pause");// 按钮变为暂停
    timestr = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss").format(new Date());// timestr用在第一次显示时间,以后显示时间可从clock上直接读取;
    old_c = new GregorianCalendar();// old_c为当前时间,也就是开始计时时间;
    // System.out.println(old_c.toString());
    // JLabel jlabel = new JLabel("开始时间是" + timestr+"\n");
    // jlabel.setOpaque(true);
    // jlabel.setBackground(Color.green);
    // record.add(jlabel);
    record.append("开始时间是" + timestr+"\n");
    // System.out.println(clock.getText());
    }else{// 暂停,按钮变为重新开始
    timer.stop();// 定时器暂停
    clock.setBackground(Color.red);
    start.setText("Restart");
    // JLabel jlabel = new JLabel("结束时间是" + clock.getText() + "  成绩" + () + "秒 \n");
    // jlabel.setBackground(Color.red);
    // jlabel.setOpaque(true);
    // record.add(jlabel);
    record.append("结束时间是" + clock.getText() + "  成绩" + () + "秒 \n");
    record_num++;
    // header.repaint();
    // System.out.println(header.getText());
    header.setText("共有 " + record_num + " 个记录");
    }
    running = !running;
    } private int (){// 计算成绩 用结束时间c减去开始计时时间old_c;
    int s = (int) (c.getTimeInMillis() - old_c.getTimeInMillis()) / 1000;//
    if(s == 0){ // 如果成绩小于1秒,计为1;
    return 1;
    }
    return s; }
    } // nested class MyMonitor3
    class MyMonitor3 implements ActionListener{ public void actionPerformed(ActionEvent e){
    clock.setText("0000-00-00  00:00:00");
    record_num = 0;
    record.removeAll();
    header.setText("共有 " + record_num + " 个记录");
    // record.add(header);
    // record.repaint();
    record.setText("");
    }
    }
    }
      

  3.   

    MyMonitor1,MyMonitor2,MyMonitor3可以合并成一个类中
      

  4.   


    package test;import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.text.*;public class TestTimer {
    private JFrame jf;
    private JButton start;
    private JButton clear;
    private JLabel header;
    JScrollPane sc;
    private Box record;
    private int record_num;
    private JLabel clock;
    GregorianCalendar c;
    GregorianCalendar old_c;
    int yyyy, MM, day, HH, mm, ss;
    String timestr;
    Timer timer; public static void main(String[] args) {
    new TestTimer().init(); } private void init() {
    jf = new JFrame("运动秒表");
    start = new JButton("Start");
    clear = new JButton("Clear");
    header = new JLabel();
    header.setOpaque(true);
    header.setBackground(Color.yellow);
    clock = new JLabel();
    clock.setHorizontalAlignment(JLabel.CENTER);
    clock.setOpaque(true);// 将clock设置为不透明的,才能显示下面的红色
    clock.setBackground(Color.red);
    clock.setText("0000-00-00  00:00:00");
    record = new Box(BoxLayout.Y_AXIS);
    // record = new JPanel();
    // record.setLayout(new GridLayout(20,1));
    record_num = 0;
    header.setText("共有 " + record_num + " 个记录");
    JPanel jpanel = new JPanel(new GridLayout(1, 2));
    jpanel.add(start);
    jpanel.add(clear);
    MyMonitor1 m1 = new MyMonitor1();
    timer = new Timer(1000, m1);// 每隔一秒触发m1;
    MyMonitor2 m2 = new MyMonitor2();
    start.addActionListener(m2);
    MyMonitor3 m3 = new MyMonitor3();
    clear.addActionListener(m3);// 清空记录;
    record.add(header);
    jf.add(jpanel, "North");
    sc = new JScrollPane(record);
    // sc.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    sc.setBorder(BorderFactory.createLineBorder(Color.black));
    jf.add(sc, BorderLayout.CENTER);
    jf.add(clock, "South");
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setBounds(400, 400, 280, 400);
    jf.setVisible(true); } // nested class MyMonitor1
    class MyMonitor1 implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
    c = new GregorianCalendar();
    yyyy = c.get(GregorianCalendar.YEAR);
    MM = c.get(GregorianCalendar.MONTH);
    day = c.get(GregorianCalendar.DATE);
    HH = c.get(GregorianCalendar.HOUR_OF_DAY);
    mm = c.get(GregorianCalendar.MINUTE);
    ss = c.get(GregorianCalendar.SECOND);
    String ph = HH < 10 ? "0" : "";
    String pm = mm < 10 ? "0" : "";
    String ps = ss < 10 ? "0" : "";
    timestr = String.valueOf(yyyy) + "-" + String.valueOf(MM) + "-"
    + String.valueOf(day < 10 ? "0" + day : day) + "  " + ph
    + String.valueOf(HH) + ":" + pm + String.valueOf(mm) + ":"
    + ps + String.valueOf(ss);
    clock.setText(timestr); }
    } // nested class MyMonitor2
    class MyMonitor2 implements ActionListener {
    private boolean running = false;// running用于判断定时器是否启动; @Override
    public void actionPerformed(ActionEvent e) {
    JLabel jlabel;
    if (!running) { // 开始计时
    timer.setInitialDelay(0);// 首次延迟为0
    timer.start();// 启动定时器
    clock.setBackground(Color.green);
    start.setText("Pause");// 按钮变为暂停
    timestr = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss")
    .format(new Date());// timestr用在第一次显示时间,以后显示时间可从clock上直接读取;
    old_c = new GregorianCalendar();// old_c为当前时间,也就是开始计时时间;
    // System.out.println(old_c.toString());
    jlabel = new JLabel("开始时间是" + timestr);
    jlabel.setOpaque(true);
    jlabel.setBackground(Color.green);
    record.add(jlabel);
    // System.out.println(clock.getText());
    } else {// 暂停,按钮变为重新开始
    timer.stop();// 定时器暂停
    clock.setBackground(Color.red);
    start.setText("Restart");
    jlabel = new JLabel("结束时间是" + clock.getText() + "  成绩" + ()
    + "秒");
    // jlabel.setBackground(Color.red);
    jlabel.setOpaque(true);
    record.add(jlabel);
    record_num++;
    // header.repaint();
    // System.out.println(header.getText());
    header.setText("共有 " + record_num + " 个记录");
    } record.scrollRectToVisible(record.getComponent(
    record.getComponentCount() - 1).getBounds()); running = !running;
    } private int () {// 计算成绩 用结束时间c减去开始计时时间old_c;
    int s = (int) (c.getTimeInMillis() - old_c.getTimeInMillis()) / 1000;// 
    if (s == 0) { // 如果成绩小于1秒,计为1;
    return 1;
    }
    return s; }
    } // nested class MyMonitor3
    class MyMonitor3 implements ActionListener { public void actionPerformed(ActionEvent e) {
    clock.setText("0000-00-00  00:00:00");
    record_num = 0;
    record.removeAll();
    header.setText("共有 " + record_num + " 个记录");
    record.add(header);
    record.repaint();
    }
    }
    }
    改动了你的一些东西。跑下看。
      

  5.   

     public void actionPerformed(ActionEvent e)
    The method actionPerformed(ActionEvent) of type TestTimer.MyMonitor1 must 
     override a superclass method
      

  6.   


    package test;import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.text.*;public class TestTimer {
    private JFrame jf;
    private JButton start;
    private JButton clear;
    private JLabel header;
    JScrollPane sc;
    private Box record;
    private int record_num;
    private JLabel clock;
    GregorianCalendar c;
    GregorianCalendar old_c;
    int yyyy, MM, day, HH, mm, ss;
    String timestr;
    Timer timer; public static void main(String[] args) {
    new TestTimer().init(); } private void init() {
    jf = new JFrame("运动秒表");
    start = new JButton("Start");
    clear = new JButton("Clear");
    header = new JLabel();
    header.setOpaque(true);
    header.setBackground(Color.yellow);
    clock = new JLabel();
    clock.setHorizontalAlignment(JLabel.CENTER);
    clock.setOpaque(true);// 将clock设置为不透明的,才能显示下面的红色
    clock.setBackground(Color.red);
    clock.setText("0000-00-00  00:00:00");
    record = new Box(BoxLayout.Y_AXIS);
    // record = new JPanel();
    // record.setLayout(new GridLayout(20,1));
    record_num = 0;
    header.setText("共有 " + record_num + " 个记录");
    JPanel jpanel = new JPanel(new GridLayout(1, 2));
    jpanel.add(start);
    jpanel.add(clear);
    MyMonitor1 m1 = new MyMonitor1();
    timer = new Timer(1000, m1);// 每隔一秒触发m1;
    MyMonitor2 m2 = new MyMonitor2();
    start.addActionListener(m2);
    MyMonitor3 m3 = new MyMonitor3();
    clear.addActionListener(m3);// 清空记录;
    record.add(header);
    jf.add(jpanel, "North");
    sc = new JScrollPane(record);
    // sc.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    sc.setBorder(BorderFactory.createLineBorder(Color.black));
    jf.add(sc, BorderLayout.CENTER);
    jf.add(clock, "South");
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setBounds(400, 400, 280, 400);
    jf.setVisible(true); } // nested class MyMonitor1
    class MyMonitor1 implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
    c = new GregorianCalendar();
    yyyy = c.get(GregorianCalendar.YEAR);
    MM = c.get(GregorianCalendar.MONTH);
    day = c.get(GregorianCalendar.DATE);
    HH = c.get(GregorianCalendar.HOUR_OF_DAY);
    mm = c.get(GregorianCalendar.MINUTE);
    ss = c.get(GregorianCalendar.SECOND);
    String ph = HH < 10 ? "0" : "";
    String pm = mm < 10 ? "0" : "";
    String ps = ss < 10 ? "0" : "";
    timestr = String.valueOf(yyyy) + "-" + String.valueOf(MM) + "-"
    + String.valueOf(day < 10 ? "0" + day : day) + "  " + ph
    + String.valueOf(HH) + ":" + pm + String.valueOf(mm) + ":"
    + ps + String.valueOf(ss);
    clock.setText(timestr); }
    } // nested class MyMonitor2
    class MyMonitor2 implements ActionListener {
    private boolean running = false;// running用于判断定时器是否启动; @Override
    public void actionPerformed(ActionEvent e) {
    JLabel jlabel;
    if (!running) { // 开始计时
    timer.setInitialDelay(0);// 首次延迟为0
    timer.start();// 启动定时器
    clock.setBackground(Color.green);
    start.setText("Pause");// 按钮变为暂停
    timestr = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss")
    .format(new Date());// timestr用在第一次显示时间,以后显示时间可从clock上直接读取;
    old_c = new GregorianCalendar();// old_c为当前时间,也就是开始计时时间;
    // System.out.println(old_c.toString());
    jlabel = new JLabel("开始时间是" + timestr);
    jlabel.setOpaque(true);
    jlabel.setBackground(Color.green);
    record.add(jlabel);
    // System.out.println(clock.getText());
    } else {// 暂停,按钮变为重新开始
    timer.stop();// 定时器暂停
    clock.setBackground(Color.red);
    start.setText("Restart");
    jlabel = new JLabel("结束时间是" + clock.getText() + "  成绩" + ()
    + "秒");
    // jlabel.setBackground(Color.red);
    jlabel.setOpaque(true);
    record.add(jlabel);
    record_num++;
    // header.repaint();
    // System.out.println(header.getText());
    header.setText("共有 " + record_num + " 个记录");
    }
    record.revalidate(); Rectangle bounds = record.getBounds();
    bounds.y = bounds.height;
    // bounds.y *= -1;
    record.scrollRectToVisible(bounds);
    // Rectangle r = sc.getVisibleRect();
    // System.out.println("boundsrect     " + record.getBounds());
    // System.out.println("visiblerect    " + r);
    running = !running;
    } private int () {// 计算成绩 用结束时间c减去开始计时时间old_c;
    int s = (int) (c.getTimeInMillis() - old_c.getTimeInMillis()) / 1000;// 
    if (s == 0) { // 如果成绩小于1秒,计为1;
    return 1;
    }
    return s; }
    } // nested class MyMonitor3
    class MyMonitor3 implements ActionListener { public void actionPerformed(ActionEvent e) {
    clock.setText("0000-00-00  00:00:00");
    record_num = 0;
    record.removeAll();
    header.setText("共有 " + record_num + " 个记录");
    record.add(header);
    record.repaint();
    }
    }
    }
    抱歉,滚动条那个地方写错了~~
    重新贴一下
      

  7.   

    谢谢大家了那三个类可以合并到一个Monitor 但要getActionCommand()..
    以前不知道用插入源代码,直接粘贴上来代码真难看,,以后用插入源代码了。。
    在此谢谢大家。。