一个简单的响应事件出错,谁帮调试一下,说说原因,谢谢!! Type mismath:cannot conver from double to double 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import java.awt.event.*;import java.awt.*;import javax.swing.*;import java.text.*;public class Temperature extends JFrame implements ActionListener{ JPanel jp; JLabel L1; JLabel L2; JTextField j1,j2; JButton jb1,jb2; Temperature()//构造函数设定一些组件和布局 { jp=new JPanel(new GridLayout(3,2,5,5)); L1=new JLabel("华氏温度:"); L2=new JLabel("摄氏温度:"); j1=new JTextField(0); j2=new JTextField(0); jb1=new JButton("华氏转"); jb2=new JButton("摄氏转"); jp.add(L1,JLabel.CENTER); jp.add(L2); jp.add(j1); jp.add(j2); jp.add(jb1); jp.add(jb2); setContentPane(jp); jb1.addActionListener(this); jb2.addActionListener(this); } public static void main(String args[])//新建一个Temperatrure对象 { Temperature t=new Temperature(); t.setTitle("温度转换"); t.setSize(200,200); t.setVisible(true); } public void actionPerformed(ActionEvent e)//响应按钮事件 { Double c=new Double(0.0); if(e.getSource()==jb1) { if(!j1.getText().equals("")) { c=5d/9d*(Double.parseDouble(j1.getText())-32d); NumberFormat formatter = NumberFormat.getNumberInstance(); formatter.setMaximumFractionDigits(2); j2.setText(formatter.format(c)); } else { JOptionPane.showMessageDialog(null,"请填写你的华氏温度!!"); } } else if(e.getSource()==jb2) { if(!j2.getText().equals("")) { c=9d/5d*(Double.parseDouble(j2.getText())-32d); NumberFormat formatter = NumberFormat.getNumberInstance(); formatter.setMaximumFractionDigits(2); j1.setText(c.toString()); } else { JOptionPane.showMessageDialog(null,"请填写你的摄氏温度!!"); } } }}首先,j1.getText()是个String型,String型判断相等要用equals()方法,而=的方法只能判断=号两边是否指向同一内存地址;第二,是类型转换的问题,5/9*(Double.parseDouble(j1.getText())-32)编译器会首先计算5/9这个为int型并未转换为double型所以会造成数据丢失,改为5*(Double.parseDouble(j1.getText())-32)/9就没问题了;第三,弹出对话框最好用JOptionPane来做。 有本java事件编程,清华大学出版社的挺不错建议您抽时间找来看看 还有,就是NumberFormat对数据进行格式化,setMaximumFractionDigits(2)就是小数部分最大允许2位保留。9d/5d*(Double.parseDouble(j2.getText())-32d)这个也可以,将9和5都事先显示的告诉编译器他们是double型的,这样计算结果也是double型。好累啊,给分吧,哈哈 还真不是事件的问题,全都是java得基础问题,楼主要好好补习一下基本类型啦(当然也包括String) 想请问 这个函数Double.parseDouble是不是新的函数我用的都是Double.valueOf(g2.getText()).doubleValue() 挺麻烦的 TO:angues1980(石头心)(JSP学习中)好象按你的代码还是执行不了!编译通不过!请再看一下好吗? 我用Eclicpse 3.0进行编译,提示:c=5d/9d*(Double.parseDouble(j1.getText())-32d);这一行Type mismatch:Cannot convert from double to Double import java.awt.event.*;import java.awt.*;import javax.swing.*;import java.text.*;public class Temperature extends JFrame implements ActionListener{ JPanel jp; JLabel L1; JLabel L2; JTextField j1,j2; JButton jb1,jb2; Temperature()//构造函数设定一些组件和布局 { jp=new JPanel(new GridLayout(3,2,5,5)); L1=new JLabel("华氏温度:"); L2=new JLabel("摄氏温度:"); j1=new JTextField(0); j2=new JTextField(0); jb1=new JButton("华氏转"); jb2=new JButton("摄氏转"); jp.add(L1,JLabel.CENTER); jp.add(L2); jp.add(j1); jp.add(j2); jp.add(jb1); jp.add(jb2); setContentPane(jp); jb1.addActionListener(this); jb2.addActionListener(this); } public static void main(String args[])//新建一个Temperatrure对象 { Temperature t=new Temperature(); t.setTitle("温度转换"); t.setSize(200,200); t.setVisible(true); } public void actionPerformed(ActionEvent e)//响应按钮事件 { double c=0d; if(e.getSource()==jb1) { if(!j1.getText().equals("")) { c=5d/9d*(Double.parseDouble(j1.getText())-32d); NumberFormat formatter = NumberFormat.getNumberInstance(); formatter.setMaximumFractionDigits(2); j2.setText(formatter.format(c)); } else { JOptionPane.showMessageDialog(null,"请填写你的华氏温度!!"); } } else if(e.getSource()==jb2) { if(!j2.getText().equals("")) { c=9d/5d*Double.parseDouble(j2.getText())+32d; NumberFormat formatter = NumberFormat.getNumberInstance(); formatter.setMaximumFractionDigits(2); j1.setText(formatter.format(c)); } else { JOptionPane.showMessageDialog(null,"请填写你的摄氏温度!!"); } } }}声明的时候c声明为double型。还有,你这个转换根本不对嘛,转换的逻辑写错了,我也给改了。 不知道为什么将我以前的c.toString()改成:String.valueOf(c)就可以运行了,也就是说将你现在改的NumberFormat formatter = NumberFormat.getNumberInstance(); formatter.setMaximumFractionDigits(2); j1.setText(formatter.format(c));改成:String.valueOf(c)也可以运行了.不知toString()与String.valueOf(c),这两种转换有什么区别呢?在网上找了,看了一些还不是很明白!! toString()是从Object继承过来的方法,可以重写,就是将对象转换成字符串。所以这个方法是针对对象来说的,也就是只有Double型可以调用它;而String.valueOf()里面的c是基本类型double而不是Double型的对象,String.valueOf()方法是将c的值转换成一个字符串。所以你声明的c如果是Double型,就要调用toString()方法转换字符串,而如果声明为基本类型double型就要用String.valueOf()方法。 Java中怎么把字符串数组转为整形数组 java面试题求救 帮忙? 关于排序 java 问题。 求算法:把一个数组中的元素,分别保存到N个数组中。 有关多线程和异常处理 我彻底凌乱了 一个初学者的自白求助帖 通过char将String转换成byte数组 如何配置使tomcat5新建的虚拟目录运行时可以支持bean和servlet等完整的WEB程序? 请问如何将一棵树的某一个节点进行重命名,我命名它不能更新,不知道怎么 刚开始学习JAVA遇到的一个问题 运行过程中停住不动了
import java.awt.*;
import javax.swing.*;
import java.text.*;
public class Temperature extends JFrame implements ActionListener{
JPanel jp;
JLabel L1;
JLabel L2;
JTextField j1,j2;
JButton jb1,jb2;
Temperature()//构造函数设定一些组件和布局
{
jp=new JPanel(new GridLayout(3,2,5,5));
L1=new JLabel("华氏温度:");
L2=new JLabel("摄氏温度:");
j1=new JTextField(0);
j2=new JTextField(0);
jb1=new JButton("华氏转");
jb2=new JButton("摄氏转");
jp.add(L1,JLabel.CENTER);
jp.add(L2);
jp.add(j1);
jp.add(j2);
jp.add(jb1);
jp.add(jb2);
setContentPane(jp);
jb1.addActionListener(this);
jb2.addActionListener(this);
}
public static void main(String args[])//新建一个Temperatrure对象
{
Temperature t=new Temperature();
t.setTitle("温度转换");
t.setSize(200,200);
t.setVisible(true);
}
public void actionPerformed(ActionEvent e)//响应按钮事件
{
Double c=new Double(0.0);
if(e.getSource()==jb1)
{
if(!j1.getText().equals(""))
{
c=5d/9d*(Double.parseDouble(j1.getText())-32d);
NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMaximumFractionDigits(2);
j2.setText(formatter.format(c));
}
else
{
JOptionPane.showMessageDialog(null,"请填写你的华氏温度!!");
}
}
else if(e.getSource()==jb2)
{
if(!j2.getText().equals(""))
{
c=9d/5d*(Double.parseDouble(j2.getText())-32d);
NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMaximumFractionDigits(2);
j1.setText(c.toString());
}
else
{
JOptionPane.showMessageDialog(null,"请填写你的摄氏温度!!");
}
}
}}
首先,j1.getText()是个String型,String型判断相等要用equals()方法,而=的方法只能判断=号两边是否指向同一内存地址;第二,是类型转换的问题,5/9*(Double.parseDouble(j1.getText())-32)编译器会首先计算5/9这个为int型并未转换为double型所以会造成数据丢失,改为5*(Double.parseDouble(j1.getText())-32)/9就没问题了;第三,弹出对话框最好用JOptionPane来做。
挺不错
建议您抽时间找来看看
9d/5d*(Double.parseDouble(j2.getText())-32d)这个也可以,将9和5都事先显示的告诉编译器他们是double型的,这样计算结果也是double型。
好累啊,给分吧,哈哈
Type mismatch:Cannot convert from double to Double
import java.awt.*;
import javax.swing.*;
import java.text.*;public class Temperature extends JFrame implements ActionListener{
JPanel jp;
JLabel L1;
JLabel L2;
JTextField j1,j2;
JButton jb1,jb2;
Temperature()//构造函数设定一些组件和布局
{
jp=new JPanel(new GridLayout(3,2,5,5));
L1=new JLabel("华氏温度:");
L2=new JLabel("摄氏温度:");
j1=new JTextField(0);
j2=new JTextField(0);
jb1=new JButton("华氏转");
jb2=new JButton("摄氏转");
jp.add(L1,JLabel.CENTER);
jp.add(L2);
jp.add(j1);
jp.add(j2);
jp.add(jb1);
jp.add(jb2);
setContentPane(jp);
jb1.addActionListener(this);
jb2.addActionListener(this);
}
public static void main(String args[])//新建一个Temperatrure对象
{
Temperature t=new Temperature();
t.setTitle("温度转换");
t.setSize(200,200);
t.setVisible(true);
}
public void actionPerformed(ActionEvent e)//响应按钮事件
{
double c=0d;
if(e.getSource()==jb1)
{
if(!j1.getText().equals(""))
{
c=5d/9d*(Double.parseDouble(j1.getText())-32d);
NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMaximumFractionDigits(2);
j2.setText(formatter.format(c));
}
else
{
JOptionPane.showMessageDialog(null,"请填写你的华氏温度!!");
}
}
else if(e.getSource()==jb2)
{
if(!j2.getText().equals(""))
{
c=9d/5d*Double.parseDouble(j2.getText())+32d;
NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMaximumFractionDigits(2);
j1.setText(formatter.format(c));
}
else
{
JOptionPane.showMessageDialog(null,"请填写你的摄氏温度!!");
}
}
}
}
声明的时候c声明为double型。还有,你这个转换根本不对嘛,转换的逻辑写错了,我也给改了。
formatter.setMaximumFractionDigits(2);
j1.setText(formatter.format(c));
改成:String.valueOf(c)也可以运行了.
不知toString()与String.valueOf(c),这两种转换有什么区别呢?在网上找了,看了一些还不是很明白!!
而String.valueOf()里面的c是基本类型double而不是Double型的对象,String.valueOf()方法是将c的值转换成一个字符串。
所以你声明的c如果是Double型,就要调用toString()方法转换字符串,而如果声明为基本类型double型就要用String.valueOf()方法。