编写一段程序从命令模式读取一个数字,将该数字显示为一个图形化的温度计 – 红色表示温度,以及清晰的摄氏温度刻度。如果程序名为 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,并且重置按钮属性。
温度计可以显示的温度范围为 摄氏-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,并且重置按钮属性。
楼主【chengyouhai】截止到2008-07-18 14:39:29的历史汇总数据(不包括此帖):
发帖的总数量:2 发帖的总分数:0 每贴平均分数:0
回帖的总数量:1 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:1 结贴的总分数:0
无满意结贴数:0 无满意结贴分:0
未结的帖子数:1 未结的总分数:0
结贴的百分比:50.00 % 结分的百分比:---------------------
无满意结贴率:0.00 % 无满意结分率:---------------------
楼主加油
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);
}
}
}
}
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);
}
}