编写一段程序从命令模式读取一个数字,将该数字显示为一个图形化的温度计 – 红色表示温度,以及清晰的摄氏温度刻度。如果程序名为 Thermometer 那么输入指令 java Thermometer 12 则绘制出一个温度计,并且显示出温度为12度。
温度计可以显示的温度范围为 摄氏-20度 到 摄氏100度。每2度有一个刻度线,每20度有一个粗刻度线。同时读入的温度应作为text文本被同时显示在窗体(window)以及标题栏(title bar)上。如果读入的温度超出了可显示温度(低于-20或者高于100),温度计仍然被显示,同时显示“Too Cold”或者“Too Hot”以取代红色温度线。如果输入数字以外的字符,则程序报错。
要求:
1. 程序需要能够捕捉到异常错误,如果输入参数为空,或者输入超过一个参数,或者输入了一个非数字的参数,则程序报错。错误提示应该能清晰简洁的描述出错误情况。
2. 以上的功能实现后,可以追加部分功能(参见附录)
deprecated
附录:摄氏温度(Centigrade),华式温度(Fahrenheit),开式温度(Kelvin)
扩展程序使其包含3个按钮,为别为“Centigrade”,“ Fahrenheit”和“Kelvin”。程序初始显示摄氏温度并且该按钮不可用(灰色)。点击各按钮重新描绘温度计刻度以及温度线,并且该按钮不可用。比如输入 java Thermometer 60 则绘制摄氏温度计60°C,Centigrade按钮不可用,而其他两个按钮可用;点击Fahrenheit按钮则显示华式温度计140°F,Fahrenheit不可用而其他两个按钮可用;点击Kelvin按钮则显示开式温度计333.15°K,并且重置按钮属性。

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【chengyouhai】截止到2008-07-18 14:39:29的历史汇总数据(不包括此帖):
    发帖的总数量:2                        发帖的总分数:0                        每贴平均分数:0                        
    回帖的总数量:1                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:1                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:1                        未结的总分数:0                        
    结贴的百分比:50.00 %               结分的百分比:---------------------
    无满意结贴率:0.00  %               无满意结分率:---------------------
    楼主加油
      

  2.   

    hoho,这个东东有挑战性哦,老三在这里显丑了~~~~~~~~~~~~~~~代码一共有两个java文件:ThermometerPane.java和Thermometer.java,本楼帖Thermometer.java,下楼帖ThermometerPane.java在命令行的运行方法,这里说再多不如举例,以下就帖上我把两个java文件放在F盘根目录时的编译、运行方法F:\>javac ThermometerPane.javaF:\>javac Thermometer.javaF:\>java Thermometer 23代码1:Thermometer.javaimport java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.UIManager;public class Thermometer extends JFrame implements ActionListener
    {
        private static final long serialVersionUID = -3849237831743212358L;    private ThermometerPane tPane;    private JButton btnCentigrade, btnFahrenheit, btnKelvin;
        
        private JButton[] buttons;
        
        private double centigrade;    public static void main(final String args[])
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    try
                    {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                        new Thermometer(args);
                    }
                    catch(Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            });
        }    public Thermometer(String args[])
        {
            super();
            parseInput(args);
            setTitle("输入的温度:" + ThermometerPane.format(centigrade) + "℃");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            initUI();
            setSize(300, 480);
            setLocationRelativeTo(null);
            setResizable(false);
            setVisible(true);
        }
        
        private void parseInput(String args[])
        {
            String ret = null;
            
            if(args.length == 0)
            {
                ret = "未输入参数!";
            }
            else if(args.length > 1)
            {
                ret = "只能输入一个参数!";
            }
            else
            {
                try
                {
                    centigrade = Double.parseDouble(args[0]);
                    centigrade = Double.parseDouble(ThermometerPane.decimalFormat.format(centigrade));
                    tPane = new ThermometerPane(centigrade);
                }
                catch(Exception e)
                {
                    ret = "参数只能为数字!";
                }
            }
            
            if(ret != null)
            {
                JOptionPane.showMessageDialog(null, ret, "参数错误", JOptionPane.OK_OPTION);
                System.exit(0);
            }
        }    private void initUI()
        {
            btnCentigrade = new JButton("摄氏温度");
            btnFahrenheit = new JButton("华氏温度");
            btnKelvin = new JButton("开氏温度");
            buttons = new JButton[]{btnCentigrade, btnFahrenheit, btnKelvin};
            JPanel buttonPane = new JPanel();        btnCentigrade.setPreferredSize(new Dimension(90, 23));
            btnFahrenheit.setPreferredSize(btnCentigrade.getPreferredSize());
            btnKelvin.setPreferredSize(btnCentigrade.getPreferredSize());
            btnCentigrade.addActionListener(this);
            btnFahrenheit.addActionListener(this);
            btnKelvin.addActionListener(this);
            btnCentigrade.setEnabled(false);
            buttonPane.setPreferredSize(new Dimension(-1, 32));
            buttonPane.setLayout(new FlowLayout());
            buttonPane.add(btnCentigrade);
            buttonPane.add(btnFahrenheit);
            buttonPane.add(btnKelvin);        this.add(buttonPane, BorderLayout.NORTH);
            this.add(tPane, BorderLayout.CENTER);
        }    public void actionPerformed(ActionEvent e)
        {
            Object source = e.getSource();
            
            for(int i = 0; i < buttons.length; i++)
            {
                buttons[i].setEnabled(buttons[i] != source);
                
                if(source == buttons[i])
                {
                    tPane.setType(i);
                }
            }
        }
    }
      

  3.   

    代码2:ThermometerPane.javaimport java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.Stroke;
    import java.text.DecimalFormat;import javax.swing.JComponent;public class ThermometerPane extends JComponent
    {
        private static final long serialVersionUID = 5407237411742077877L;
        
        private static final int UNIT = 3;
        
        private static final int TOP_RIM = 40;
        
        private static final int LEFT_RIM = 125;
        
        private static final int TOTAL = 120;
        
        public static DecimalFormat decimalFormat = new DecimalFormat("0.00");
        
        private Stroke thermometerStroke = new BasicStroke(8f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
        
        private Stroke shortStroke = new BasicStroke(0.5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
        
        private Stroke longStroke = new BasicStroke(1f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
        
        private Font scaleFont = new Font("宋体", Font.PLAIN, 12);
        
        private Font flashFont = new Font("Times New Roman", Font.BOLD | Font.ITALIC, 70);
        
        private int type;
        
        private double centigrade;
        
        private double currentValue;
        
        private double minValue = -20;
        
        private String unitName = "℃";
        
        private boolean flashFlag = true;
        
        private boolean isOut = false;
        
        public ThermometerPane(double centigrade)
        {
            this.centigrade = centigrade;
            currentValue = centigrade;
            
            if(centigrade < -20 || centigrade > 100)
            {
                isOut = true;
                flashInfo();
            }
        }    protected void paintComponent(Graphics g)
        {
            Graphics2D g2d = (Graphics2D)g;
            double tempValue = centigrade > 100? 100: centigrade;
            double tempMin = minValue;
            
            g2d.setColor(Color.BLACK);
            //画黑色背景
            g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
            //打开抗锯齿,使温度计两端更圆滑
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setStroke(thermometerStroke);
            g2d.setColor(Color.WHITE);
            //画温度计主体
            g2d.drawLine(LEFT_RIM, TOP_RIM, LEFT_RIM, UNIT * TOTAL + TOP_RIM);
            
            //当温度大于或等于20摄氏度时画温度
            if(tempValue >= -20)
            {
                g2d.setColor(Color.RED);
                g2d.drawLine(LEFT_RIM, TOP_RIM + (int)((TOTAL - tempValue - 20) * UNIT), LEFT_RIM, UNIT * TOTAL + TOP_RIM);
            }
            
            g2d.setColor(Color.GREEN);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
            g2d.setFont(scaleFont);
            
            //画刻度线
            for(int i = UNIT * TOTAL + TOP_RIM; i >= TOP_RIM; i -= 2 * UNIT)
            {
                if(i % 5 == 0)
                {
                    g2d.setStroke(longStroke);
                    g2d.drawLine(LEFT_RIM + 5, i, LEFT_RIM + 20, i);
                    g2d.drawString(format(tempMin) + "", LEFT_RIM + 25, i + 5);
                    tempMin += 10;
                }
                else
                {
                    g2d.setStroke(shortStroke);
                    g2d.drawLine(LEFT_RIM + 5, i, LEFT_RIM + 12, i);
                }
            }
            
            //画温度单位
            g2d.drawString(unitName, LEFT_RIM + (type == 2? 70: 50), TOP_RIM + 5);
            g2d.setColor(Color.YELLOW);
            //画当前温度
            g2d.drawString("当前温度:" + format(currentValue) + " " + unitName, LEFT_RIM - 5, TOP_RIM - 20);
            
            //当温度超出范围时画闪动信息
            if(isOut && flashFlag)
            {
                drawHotOrCold(g2d);
            }
        }
        
        public void setType(int type)
        {
            this.type = type;
            
            //摄氏
            if(type == 0)
            {
                minValue = -20;
                unitName = "℃";
                currentValue = centigrade;
            }
            //华氏
            else if(type == 1)
            {
                minValue = 60;
                unitName = "F";
                currentValue = centigrade + 80;
            }
            //开氏
            else if(type == 2)
            {
                minValue = 253.15;
                unitName = "K";
                currentValue = centigrade + 273.15;
            }
            
            this.repaint();
        }
        
        public static String format(double value)
        {
            if(value == (int)value)
            {
                return (int)value + "";
            }
            else
            {
                return decimalFormat.format(value);
            }
        }
        
        private void flashInfo()
        {
            new Thread()
            {
                public void run()
                {
                    while(true)
                    {
                        try
                        {
                            sleep(500);
                            repaint();
                            flashFlag = !flashFlag;
                        }
                        catch(InterruptedException e)
                        {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
        }
        
        private void drawHotOrCold(Graphics2D g2d)
        {
            boolean cold = centigrade < -20;
            g2d.setColor(cold? Color.BLUE: Color.WHITE);
            g2d.setFont(flashFont);
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            g2d.drawString(cold? "Too Cold": "Too Hot", cold? 10: 23, 220);
        }
    }