为什么要托一个窗口大小button才出来 JFrame f=new JFrame();f.pack();f.setBounds(100,100,400,300);f.show();记得要先pack再setBounds或者setSize 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 参考下这个://PanelDemo.javaimport java.awt.*;import java.awt.event.*;import javax.swing.*;public class PanelDemo extends JFrame{ public PanelDemo() { setTitle("Panel Demo"); setBounds(100,100,400,300); Container contentPane = getContentPane(); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(new JButton("This is Button"),BorderLayout.SOUTH); contentPane.add(panel,BorderLayout.CENTER); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { JFrame frame = new PanelDemo(); frame.setVisible(true); }} 还是解决不了,干脆把程序放上来,请各位诊断诊断吧//Physical_lab.javaimport java.awt.*;import java.awt.event.*;public class Physical_lab extends WindowAdapter implements ActionListener{ private Frame MainFrame; //这是主窗口的引用 public TextField tf; //状态栏 private Panel OnShowApp; //原来在进行的实验 public Physical_lab() { //构造方法 MainFrame = new Frame("虚拟物理实验室"); //创造了一个主窗口 } //加载窗口,添加菜单 public void launchFrame() {// MainFrame.setSize(600,400); MainFrame.setBackground(Color.gray); tf = new TextField (30); //tf用来输出调试信息 MainFrame.add (tf, BorderLayout.SOUTH); MenuBar MainMenuBar=new MenuBar(); //创建菜单栏 Menu MyMenu=new Menu("实验项目"); //创建菜单 Menu MyHelp=new Menu ("help"); //创建帮助菜单 MenuItem Item1=new MenuItem("游标卡尺"); //创建"实验项目"菜单项 MenuItem Item2=new MenuItem("一维碰撞"); MenuItem Item3=new MenuItem("静电场的模拟"); MenuItem Item4=new MenuItem("对称脉冲波的叠加"); MenuItem Item5=new MenuItem("力的分析"); MenuItem Item6=new MenuItem("抛体运动有趣的性质"); MenuItem Item7=new MenuItem("彩色的影子"); MenuItem Item9=new MenuItem("角动量守恒与等面积定律"); MenuItem Item10=new MenuItem("虹霓现象的形成"); MenuItem Item11=new MenuItem("两面镜子的多重反射"); MenuItem Item14=new MenuItem("狭义相对论的时空概念"); MenuShortcut sort= new MenuShortcut(KeyEvent.VK_X); //快捷键为Ctrl+X MenuItem Item8=new MenuItem("Exit",sort); MenuShortcut sortHelp= new MenuShortcut(KeyEvent.VK_F1);//这个快捷键为何自动变为Ctrl+P MenuItem Item12=new MenuItem("帮助主题",sortHelp); MenuItem Item13=new MenuItem("关于虚拟物理实验室..."); ///////////////////////////////////////////////////////////// MyMenu.add(Item1); //加载菜单项 MyMenu.add(Item11); MyMenu.add(Item6); MyMenu.add(Item5); MyMenu.add(Item4); MyMenu.add(Item3); MyMenu.add(Item7); MyMenu.add(Item9); MyMenu.add(Item10); MyMenu.add(Item2); MyMenu.addSeparator(); MyMenu.add(Item8); MyHelp.add(Item12); MyHelp.add(Item13); MainMenuBar.add(MyMenu); //加载菜单 MainMenuBar.setHelpMenu(MyHelp); //加载帮助菜单 MainFrame.setMenuBar(MainMenuBar); //加载菜单栏 //建立事件侦听印射 Item8.addActionListener(this); Item1.addActionListener(this); Item2.addActionListener(this); Item3.addActionListener(this); Item4.addActionListener(this); Item5.addActionListener(this); Item6.addActionListener(this); Item7.addActionListener(this); Item9.addActionListener(this); Item10.addActionListener(this); Item11.addActionListener(this); Item12.addActionListener(this); Item13.addActionListener(this); MainFrame.setVisible(true); MainFrame.setBounds(200,200,600,400); MainFrame.addWindowListener(new Physical_lab()); } public static void main(String args[]) { //主函数入口 Physical_lab MyInstans = new Physical_lab();//创建本类的一个实例 MyInstans.launchFrame(); //加载这个窗口 } public void windowClosing(WindowEvent e){ System.exit(0); //按下关闭窗口按钮时关闭窗口 } public void actionPerformed(ActionEvent e){ //下面两句用于调试 //String s ="e.getActionCommand="+e.getActionCommand()+"\te.paramString()="+e.paramString() // +"\te.getID()="+e.getID()+"\te.getModifiers()="+e.getModifiers(); //tf.setText (s); if(e.getActionCommand()=="关于虚拟物理实验室..."){ return; }else if(e.getActionCommand()=="帮助主题"){ //选择了帮助菜单的帮助主题这一项 return; } if(OnShowApp!=null){ //如果原来窗口上就有一个实验 //先让原来的实验销毁 tf.setText("原来的实验销毁"); MainFrame.remove(OnShowApp); //只有这一句才能把原来的试验移除// OnShowApp.finalize(); //不能这样使实验销毁 } if(e.getActionCommand()=="游标卡尺"){ tf.setText("游标卡尺,注意:玩之前先改变窗口大小,看看会怎么样"); vernier lab_1=new vernier(tf); //创建第一个实验的实例 OnShowApp=lab_1; //把这个引用保存下来,换到下一个实验就把它删除// lab_1.setBounds(0,0,600,390); MainFrame.add("Center",lab_1); //把它加载到主窗体上 lab_1.launch(); //并起动它 MainFrame.setTitle("虚拟物理实验室"+"————游标卡尺"); MainFrame.pack(); MainFrame.setBounds(200,200,600,400); MainFrame.repaint(); lab_1.repaint(); }else if(e.getActionCommand()=="Exit"){ System.exit(0); //在菜单上按下退出项 }else if(e.getActionCommand()=="两面镜子的多重反射"){ tf.setText("两面镜子的多重反射"); }else if(e.getActionCommand()=="一维碰撞"){ tf.setText("一维碰撞————未完成"); MainFrame.setTitle("虚拟物理实验室"+"————一维碰撞"); }else if(e.getActionCommand()=="对称脉冲波的叠加"){ tf.setText("对称脉冲波的叠加————未完成"); MainFrame.setTitle("虚拟物理实验室"+"————对称脉冲波的叠加"); }else if(e.getActionCommand()=="力的分析"){ tf.setText("力的分析————未完成"); MainFrame.setTitle("虚拟物理实验室"+"————力的分析"); }else if(e.getActionCommand()=="抛体运动有趣的性质"){ tf.setText("抛体运动有趣的性质。注意:玩之前先改变窗口大小,看看会怎么样"); MainFrame.setTitle("虚拟物理实验室"+"————抛体运动有趣的性质"); }else if(e.getActionCommand()=="彩色的影子"){ tf.setText("彩色的影子————未完成"); MainFrame.setTitle("虚拟物理实验室"+"————彩色的影子"); }else if(e.getActionCommand()=="静电场的模拟"){ tf.setText("静电场的模拟。注意:玩之前先改变窗口大小,看看会怎么样"); MainFrame.setTitle("虚拟物理实验室————静电场的模拟"); }else if(e.getActionCommand()=="虹霓现象的形成"){ tf.setText("虹霓现象的形成————未完成"); MainFrame.setTitle("虚拟物理实验室————虹霓现象的形成"); }else if(e.getActionCommand()=="角动量守恒与等面积定律"){ tf.setText("角动量守恒与等面积定律。注意:玩之前先改变窗口大小,看看会怎么样"); MainFrame.setTitle("虚拟物理实验室————角动量守恒与等面积定律"); } }} 这是其中用到的一个类//vernier.javaimport java.awt.*;import java.awt.event.*;class vernier extends Panel{ int yOffset; TextField tField; double time,ts; boolean running,showInfo,rightClick; Dimension area; Image fgImage, bgImage, gImage; Graphics fg, bg, g, g0; int x0, y0,x,y,dx; Checkbox cShow; Color bgColor; String rts,STR[]={"Reset","Show","mm"},str,valStr; private int Xb[]={60,60,90,100,100,620,620,100,100,60}; private int Yb[]={60,180,246,251,140,140,60,60,60,60}; private int Xf[]={0,0,10,50,270,270,0}; private int Yf[]={0,110,105,40,40,0,0}; int xs,xc,xx,chy; FontMetrics fm; TextField FrameText; public void launch(){ //由框架调用来起动实验 setBackground(bgColor); Panel panel=new Panel();// FrameText.setText("Button"); panel.add(tField=new TextField("0.0",3)); panel.add(new Label(STR[2])); //显示"mm"字样 panel.add(new Button(STR[0])); //加"Reset"按钮 panel.add(cShow=new Checkbox(STR[1])); //加"显示"单选框 area=new Dimension(600,360); //控制Panel的大小 area.height-=yOffset; x0=100; y0=140; setSize(area); //不来这么一句它不出来,怪哉 repaint(); reset(true); //这个函数不能调,不然就不出现 add("North",panel);// panel.setBackground(Color.red);// FrameText.setText("panel.repaint"); } public boolean action(Event event,Object obj){ if(event.target instanceof Button){// FrameText.setText("重置"); //在父窗口上显示信息 String s=(String)obj; if(s.equals(STR[0])){ FrameText.setText("重置"); reset(true); } }else if(event.target==cShow){ FrameText.setText("显示读数"); showInfo=cShow.getState(); repaint(); }else if(event.target==tField){ //接收到回车消息后,判断输入的读数是否正确 FrameText.setText("你要试着读数了!"); String s1=((String)obj).trim(); g0.drawImage(gImage,0,yOffset,this); if(s1.equals(valStr)){ str="Great!you have the right answer!"; g0.setColor(Color.blue); }else{ g0.setColor(Color.red); try{ float f=(float)(Double.valueOf(s1).doubleValue()-Double.valueOf(valStr).doubleValue()); if((double)f==0.0D) str="Check number of digits."; else str="Difference is "+String.valueOf(f)+" mm"; }catch(NumberFormatException e){ //忽略它 } g0.drawString(str,(area.width-fm.stringWidth(str))/2,2*chy+yOffset); str="Wrong answer!Try it again!"; } g0.drawString(str,(area.width-fm.stringWidth(str))/2,chy+yOffset); } return true; } public void reset(boolean flag){ InitClear(); if(flag) tField.setText(" 0.0"); valStr="0.0"; repaint(); } public boolean mouseDown(Event event, int i, int j){ if((j-=yOffset)<0) return false; if(event.modifiers==4) rightClick=true; xs=i; return true; } public boolean mouseDrag(Event event,int i, int j){ //int i=event.getX(),j=event.getY(); if((j-=yOffset)<0) return false; FrameText.setText("Drag"); xx+=i-xs; xs=i; if(xx<0){ xx=0; tField.setText("0.0"); } else{ float f=(float)((double)xx/10D); valStr=String.valueOf(f); if(valStr.indexOf(".")==-1) str+=".0"; if(showInfo) tField.setText(valStr); else tField.setText(""); } repaint(); return true; } public boolean mouseUp(Event event,int i,int j){ if((j-=yOffset)<0) return false; if(rightClick) rightClick=false; else running=!running; return true; } void InitClear(){ if(bg==null){ //下面两句引起了错误 gImage=createImage(area.width,area.height); //创建缓冲区 g=gImage.getGraphics(); //得到缓冲区的图形环境,好像是这一句引起的异常 bgImage=createImage(area.width,area.height); bg=bgImage.getGraphics(); fgImage=createImage(271,130); fg=fgImage.getGraphics(); fg.setColor(Color.blue); g0=getGraphics(); } bg.clearRect(0,0,area.width,area.height); bg.setColor(Color.blue);// FrameText.setText("InitClear"); bg.drawPolygon(Xb,Yb,10); int l=y0-10; for(int i=x0+xc;i<620;i+=10) bg.drawLine(i,y0,i,l); l-=5; for(int j=x0+xc;j<620;j+=50) bg.drawLine(j,y0,j,l); l-=5; fm=bg.getFontMetrics(); //得到当前用的字体 chy=fm.getHeight(); //得到字体高度 int k=x0+xc; for(int i1=0;k<620;i1++){ bg.drawLine(k,y0,k,l); str=String.valueOf(i1*10); bg.drawString(str,k-fm.stringWidth(str)/2,l); k+=100; } fg.drawPolygon(Xf,Yf,7); l=10; int k1=fm.getHeight(); k=xc; for(int j1=0;k<201;j1++){ fg.drawLine(k,0,k,l); str=String.valueOf(j1); fg.drawString(str,k-fm.stringWidth(str)/2,l+k1); k+=19; } fg.drawString("0.1mm",220,1+k1); xx=0; tField.setText(" 0.0"); }//InitClear(){ public void paint(Graphics g1){ update(g1); } public void update(Graphics g1){ try{ g.drawImage(bgImage,0,0,this); g.drawImage(fgImage,x0+xx,y0+1,this); }catch(NullPointerException e){ //忽略空引用异常 } dx=xx-(xx/10)*10; if(showInfo){ //显示数值 g.setColor(Color.red); g.drawLine(x=x0+xc+(xx/10)*10,y=y0-20,x,y-20); //主尺读数指针及读数 g.drawLine(x-3,y-5,x,y); g.drawLine(x+3,y-5,x,y); str=String.valueOf(xx/10)+".0 mm"; g.drawString(str,x-fm.stringWidth(str)/2,y-25); x+=dx*20; g.drawLine(x,y=y0+10,x,y+20); //游标读数指针及读数 g.drawLine(x-3,y+5,x,y); g.drawLine(x+3,y+5,x,y); y+=20; str="0."+String.valueOf(dx)+" mm"; g.drawString(str,x-fm.stringWidth(str)/2,y+chy+0); x=x0+xc+xx; g.drawLine(x,y0,x,y=y0-20); //游标原点指针 g.drawLine(x-3,y+5,x,y); g.drawLine(x+3,y+5,x,y); float f=(float)((double)xx/10D); str=String.valueOf(f); if(str.indexOf(".")==-1) str+=".0"; str+=" mm"; }else { str="?"; } g.setColor(Color.black); g.drawString(str,x-xx/2-fm.stringWidth(str)/2,Yb[3]+chy+10); //在?号处输出读数,这一句也发生空引用异常 g.drawLine(x=Xb[3],y=Yb[3]+5,x+xx,y); if(xx>10){ g.drawLine(x+5,y-3,x,y); g.drawLine(x+5,y+3,x,y); x+=xx; g.drawLine(x-5,y-3,x,y); g.drawLine(x-5,y+3,x,y); } try{ g1.drawImage(gImage,0,yOffset,this); }catch(NullPointerException e){ //忽略空引用异常 } } //update() public vernier(TextField tf){ //构造函数,初始化变量 yOffset=40; time=0.0D; ts=0.0D; running=false; showInfo=false; bgColor=new Color(100,223,208); rightClick=false; xc=10; xx=0; FrameText=tf; }//vernier } Java Socket 对象流错误 帮忙看看 新手提问,谢了。 做一个进度条 但是frame里的组件开始时显示不出来,一直到最后才出来??? 怎样给一个JMenuItem加入两个快捷键? Java初学者的困惑 jsp的基础问题????谢谢了!!! 我的机器编译java为什么这么慢?解决问题者得30分. 如果向有编程基础的java新手介绍一本入门级的教程,你会推荐哪一本? 那里有免费Netscape Directory Server 1.0 目录服务器下栽? 请问初学者买什么书学java最好? 谁知道怎么用java开发拨号程序
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class PanelDemo extends JFrame
{
public PanelDemo()
{
setTitle("Panel Demo");
setBounds(100,100,400,300);
Container contentPane = getContentPane();
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new JButton("This is Button"),BorderLayout.SOUTH);
contentPane.add(panel,BorderLayout.CENTER);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public static void main(String[] args)
{
JFrame frame = new PanelDemo();
frame.setVisible(true);
}
}
//Physical_lab.java
import java.awt.*;
import java.awt.event.*;
public class Physical_lab extends WindowAdapter implements ActionListener{
private Frame MainFrame; //这是主窗口的引用
public TextField tf; //状态栏
private Panel OnShowApp; //原来在进行的实验
public Physical_lab() { //构造方法
MainFrame = new Frame("虚拟物理实验室"); //创造了一个主窗口
}
//加载窗口,添加菜单
public void launchFrame() {
// MainFrame.setSize(600,400);
MainFrame.setBackground(Color.gray);
tf = new TextField (30); //tf用来输出调试信息
MainFrame.add (tf, BorderLayout.SOUTH);
MenuBar MainMenuBar=new MenuBar(); //创建菜单栏
Menu MyMenu=new Menu("实验项目"); //创建菜单
Menu MyHelp=new Menu ("help"); //创建帮助菜单 MenuItem Item1=new MenuItem("游标卡尺"); //创建"实验项目"菜单项
MenuItem Item2=new MenuItem("一维碰撞");
MenuItem Item3=new MenuItem("静电场的模拟");
MenuItem Item4=new MenuItem("对称脉冲波的叠加");
MenuItem Item5=new MenuItem("力的分析");
MenuItem Item6=new MenuItem("抛体运动有趣的性质");
MenuItem Item7=new MenuItem("彩色的影子");
MenuItem Item9=new MenuItem("角动量守恒与等面积定律");
MenuItem Item10=new MenuItem("虹霓现象的形成");
MenuItem Item11=new MenuItem("两面镜子的多重反射");
MenuItem Item14=new MenuItem("狭义相对论的时空概念");
MenuShortcut sort= new MenuShortcut(KeyEvent.VK_X); //快捷键为Ctrl+X
MenuItem Item8=new MenuItem("Exit",sort);
MenuShortcut sortHelp= new MenuShortcut(KeyEvent.VK_F1);//这个快捷键为何自动变为Ctrl+P
MenuItem Item12=new MenuItem("帮助主题",sortHelp);
MenuItem Item13=new MenuItem("关于虚拟物理实验室...");
/////////////////////////////////////////////////////////////
MyMenu.add(Item1); //加载菜单项
MyMenu.add(Item11);
MyMenu.add(Item6);
MyMenu.add(Item5);
MyMenu.add(Item4);
MyMenu.add(Item3);
MyMenu.add(Item7);
MyMenu.add(Item9);
MyMenu.add(Item10);
MyMenu.add(Item2);
MyMenu.addSeparator();
MyMenu.add(Item8); MyHelp.add(Item12);
MyHelp.add(Item13); MainMenuBar.add(MyMenu); //加载菜单
MainMenuBar.setHelpMenu(MyHelp); //加载帮助菜单
MainFrame.setMenuBar(MainMenuBar); //加载菜单栏
//建立事件侦听印射
Item8.addActionListener(this);
Item1.addActionListener(this);
Item2.addActionListener(this);
Item3.addActionListener(this);
Item4.addActionListener(this);
Item5.addActionListener(this);
Item6.addActionListener(this);
Item7.addActionListener(this);
Item9.addActionListener(this);
Item10.addActionListener(this);
Item11.addActionListener(this);
Item12.addActionListener(this);
Item13.addActionListener(this);
MainFrame.setVisible(true);
MainFrame.setBounds(200,200,600,400);
MainFrame.addWindowListener(new Physical_lab());
} public static void main(String args[]) { //主函数入口
Physical_lab MyInstans = new Physical_lab();//创建本类的一个实例
MyInstans.launchFrame(); //加载这个窗口
} public void windowClosing(WindowEvent e){
System.exit(0); //按下关闭窗口按钮时关闭窗口
} public void actionPerformed(ActionEvent e){
//下面两句用于调试
//String s ="e.getActionCommand="+e.getActionCommand()+"\te.paramString()="+e.paramString()
// +"\te.getID()="+e.getID()+"\te.getModifiers()="+e.getModifiers();
//tf.setText (s);
if(e.getActionCommand()=="关于虚拟物理实验室..."){
return;
}else if(e.getActionCommand()=="帮助主题"){
//选择了帮助菜单的帮助主题这一项
return;
}
if(OnShowApp!=null){ //如果原来窗口上就有一个实验
//先让原来的实验销毁
tf.setText("原来的实验销毁");
MainFrame.remove(OnShowApp); //只有这一句才能把原来的试验移除
// OnShowApp.finalize(); //不能这样使实验销毁
}
if(e.getActionCommand()=="游标卡尺"){
tf.setText("游标卡尺,注意:玩之前先改变窗口大小,看看会怎么样");
vernier lab_1=new vernier(tf); //创建第一个实验的实例
OnShowApp=lab_1; //把这个引用保存下来,换到下一个实验就把它删除
// lab_1.setBounds(0,0,600,390);
MainFrame.add("Center",lab_1); //把它加载到主窗体上
lab_1.launch(); //并起动它
MainFrame.setTitle("虚拟物理实验室"+"————游标卡尺");
MainFrame.pack();
MainFrame.setBounds(200,200,600,400);
MainFrame.repaint();
lab_1.repaint();
}else if(e.getActionCommand()=="Exit"){
System.exit(0); //在菜单上按下退出项
}else if(e.getActionCommand()=="两面镜子的多重反射"){
tf.setText("两面镜子的多重反射");
}else if(e.getActionCommand()=="一维碰撞"){
tf.setText("一维碰撞————未完成");
MainFrame.setTitle("虚拟物理实验室"+"————一维碰撞");
}else if(e.getActionCommand()=="对称脉冲波的叠加"){
tf.setText("对称脉冲波的叠加————未完成");
MainFrame.setTitle("虚拟物理实验室"+"————对称脉冲波的叠加");
}else if(e.getActionCommand()=="力的分析"){
tf.setText("力的分析————未完成");
MainFrame.setTitle("虚拟物理实验室"+"————力的分析");
}else if(e.getActionCommand()=="抛体运动有趣的性质"){
tf.setText("抛体运动有趣的性质。注意:玩之前先改变窗口大小,看看会怎么样");
MainFrame.setTitle("虚拟物理实验室"+"————抛体运动有趣的性质");
}else if(e.getActionCommand()=="彩色的影子"){
tf.setText("彩色的影子————未完成");
MainFrame.setTitle("虚拟物理实验室"+"————彩色的影子");
}else if(e.getActionCommand()=="静电场的模拟"){
tf.setText("静电场的模拟。注意:玩之前先改变窗口大小,看看会怎么样");
MainFrame.setTitle("虚拟物理实验室————静电场的模拟");
}else if(e.getActionCommand()=="虹霓现象的形成"){
tf.setText("虹霓现象的形成————未完成");
MainFrame.setTitle("虚拟物理实验室————虹霓现象的形成");
}else if(e.getActionCommand()=="角动量守恒与等面积定律"){
tf.setText("角动量守恒与等面积定律。注意:玩之前先改变窗口大小,看看会怎么样");
MainFrame.setTitle("虚拟物理实验室————角动量守恒与等面积定律");
}
}
}
//vernier.java
import java.awt.*;
import java.awt.event.*;
class vernier extends Panel{
int yOffset;
TextField tField;
double time,ts;
boolean running,showInfo,rightClick;
Dimension area;
Image fgImage, bgImage, gImage;
Graphics fg, bg, g, g0;
int x0, y0,x,y,dx;
Checkbox cShow;
Color bgColor;
String rts,STR[]={"Reset","Show","mm"},str,valStr;
private int Xb[]={60,60,90,100,100,620,620,100,100,60};
private int Yb[]={60,180,246,251,140,140,60,60,60,60};
private int Xf[]={0,0,10,50,270,270,0};
private int Yf[]={0,110,105,40,40,0,0};
int xs,xc,xx,chy;
FontMetrics fm;
TextField FrameText;
public void launch(){ //由框架调用来起动实验
setBackground(bgColor);
Panel panel=new Panel();
// FrameText.setText("Button");
panel.add(tField=new TextField("0.0",3));
panel.add(new Label(STR[2])); //显示"mm"字样
panel.add(new Button(STR[0])); //加"Reset"按钮
panel.add(cShow=new Checkbox(STR[1])); //加"显示"单选框
area=new Dimension(600,360); //控制Panel的大小
area.height-=yOffset;
x0=100;
y0=140;
setSize(area); //不来这么一句它不出来,怪哉
repaint();
reset(true); //这个函数不能调,不然就不出现
add("North",panel);
// panel.setBackground(Color.red);
// FrameText.setText("panel.repaint");
} public boolean action(Event event,Object obj){
if(event.target instanceof Button){
// FrameText.setText("重置"); //在父窗口上显示信息
String s=(String)obj;
if(s.equals(STR[0])){
FrameText.setText("重置");
reset(true);
}
}else if(event.target==cShow){
FrameText.setText("显示读数");
showInfo=cShow.getState();
repaint();
}else if(event.target==tField){ //接收到回车消息后,判断输入的读数是否正确
FrameText.setText("你要试着读数了!");
String s1=((String)obj).trim();
g0.drawImage(gImage,0,yOffset,this);
if(s1.equals(valStr)){
str="Great!you have the right answer!";
g0.setColor(Color.blue);
}else{
g0.setColor(Color.red);
try{
float f=(float)(Double.valueOf(s1).doubleValue()-Double.valueOf(valStr).doubleValue());
if((double)f==0.0D)
str="Check number of digits.";
else
str="Difference is "+String.valueOf(f)+" mm";
}catch(NumberFormatException e){
//忽略它
} g0.drawString(str,(area.width-fm.stringWidth(str))/2,2*chy+yOffset);
str="Wrong answer!Try it again!";
}
g0.drawString(str,(area.width-fm.stringWidth(str))/2,chy+yOffset);
}
return true;
}
public void reset(boolean flag){
InitClear();
if(flag) tField.setText(" 0.0");
valStr="0.0";
repaint();
}
public boolean mouseDown(Event event, int i, int j){
if((j-=yOffset)<0) return false;
if(event.modifiers==4) rightClick=true;
xs=i;
return true;
}
public boolean mouseDrag(Event event,int i, int j){
//int i=event.getX(),j=event.getY();
if((j-=yOffset)<0) return false;
FrameText.setText("Drag");
xx+=i-xs;
xs=i;
if(xx<0){
xx=0;
tField.setText("0.0");
} else{
float f=(float)((double)xx/10D);
valStr=String.valueOf(f);
if(valStr.indexOf(".")==-1) str+=".0";
if(showInfo) tField.setText(valStr);
else tField.setText("");
}
repaint();
return true;
}
public boolean mouseUp(Event event,int i,int j){
if((j-=yOffset)<0) return false;
if(rightClick) rightClick=false;
else running=!running;
return true;
}
void InitClear(){
if(bg==null){ //下面两句引起了错误
gImage=createImage(area.width,area.height); //创建缓冲区
g=gImage.getGraphics(); //得到缓冲区的图形环境,好像是这一句引起的异常
bgImage=createImage(area.width,area.height);
bg=bgImage.getGraphics();
fgImage=createImage(271,130);
fg=fgImage.getGraphics();
fg.setColor(Color.blue);
g0=getGraphics();
}
bg.clearRect(0,0,area.width,area.height);
bg.setColor(Color.blue);
// FrameText.setText("InitClear");
bg.drawPolygon(Xb,Yb,10);
int l=y0-10;
for(int i=x0+xc;i<620;i+=10) bg.drawLine(i,y0,i,l);
l-=5;
for(int j=x0+xc;j<620;j+=50) bg.drawLine(j,y0,j,l);
l-=5;
fm=bg.getFontMetrics(); //得到当前用的字体
chy=fm.getHeight(); //得到字体高度
int k=x0+xc;
for(int i1=0;k<620;i1++){
bg.drawLine(k,y0,k,l);
str=String.valueOf(i1*10);
bg.drawString(str,k-fm.stringWidth(str)/2,l);
k+=100;
}
fg.drawPolygon(Xf,Yf,7);
l=10;
int k1=fm.getHeight();
k=xc;
for(int j1=0;k<201;j1++){
fg.drawLine(k,0,k,l);
str=String.valueOf(j1);
fg.drawString(str,k-fm.stringWidth(str)/2,l+k1);
k+=19;
}
fg.drawString("0.1mm",220,1+k1);
xx=0;
tField.setText(" 0.0");
}//InitClear(){
public void paint(Graphics g1){
update(g1);
}
public void update(Graphics g1){
try{
g.drawImage(bgImage,0,0,this);
g.drawImage(fgImage,x0+xx,y0+1,this);
}catch(NullPointerException e){
//忽略空引用异常
}
dx=xx-(xx/10)*10;
if(showInfo){ //显示数值
g.setColor(Color.red);
g.drawLine(x=x0+xc+(xx/10)*10,y=y0-20,x,y-20); //主尺读数指针及读数
g.drawLine(x-3,y-5,x,y);
g.drawLine(x+3,y-5,x,y);
str=String.valueOf(xx/10)+".0 mm";
g.drawString(str,x-fm.stringWidth(str)/2,y-25);
x+=dx*20;
g.drawLine(x,y=y0+10,x,y+20); //游标读数指针及读数
g.drawLine(x-3,y+5,x,y);
g.drawLine(x+3,y+5,x,y);
y+=20;
str="0."+String.valueOf(dx)+" mm";
g.drawString(str,x-fm.stringWidth(str)/2,y+chy+0);
x=x0+xc+xx;
g.drawLine(x,y0,x,y=y0-20); //游标原点指针
g.drawLine(x-3,y+5,x,y);
g.drawLine(x+3,y+5,x,y);
float f=(float)((double)xx/10D);
str=String.valueOf(f);
if(str.indexOf(".")==-1) str+=".0";
str+=" mm";
}else {
str="?";
}
g.setColor(Color.black);
g.drawString(str,x-xx/2-fm.stringWidth(str)/2,Yb[3]+chy+10); //在?号处输出读数,这一句也发生空引用异常
g.drawLine(x=Xb[3],y=Yb[3]+5,x+xx,y);
if(xx>10){
g.drawLine(x+5,y-3,x,y);
g.drawLine(x+5,y+3,x,y);
x+=xx;
g.drawLine(x-5,y-3,x,y);
g.drawLine(x-5,y+3,x,y);
}
try{
g1.drawImage(gImage,0,yOffset,this);
}catch(NullPointerException e){
//忽略空引用异常
}
} //update()
public vernier(TextField tf){ //构造函数,初始化变量
yOffset=40;
time=0.0D;
ts=0.0D;
running=false;
showInfo=false;
bgColor=new Color(100,223,208);
rightClick=false;
xc=10;
xx=0;
FrameText=tf;
}//vernier
}