请教一个比较入门的问题
以下是我写的一个用于股票计算的applet:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Gupiaojisuan extends JApplet implements ActionListener
{
JLabel mrjL,mrlL,sglL,mcjL,mclL,zcbL,zcglL,syL,pjcbL;
JTextField mrjF,mrlF,sglF,mcjF,mclF,zcbF,zcglF,syF,pjcbF;
JButton button1,button2;
double mrj,mrl,sgl,mcj,mcl,zcb,zcgl,sy,pjcb;
public void init()
{
Container container = getContentPane();
container.setLayout(new FlowLayout());
mrjL = new JLabel( "买入价 ");
container.add(mrjL);
mrjF = new JTextField(10);
container.add(mrjF);
mrlL = new JLabel( "买入量 ");
container.add(mrlL);
mrlF = new JTextField(10);
container.add(mrlF);
sglL = new JLabel( "送股量 ");
container.add(sglL);
sglF = new JTextField(10);
container.add(sglF);
mcjL = new JLabel( "卖出价 ");
container.add(mcjL);
mcjF = new JTextField(10);
container.add(mcjF);
mclL = new JLabel( "卖出量 ");
container.add(mclL);
mclF = new JTextField(10);
container.add(mclF);
zcbL = new JLabel( "总成本 ");
container.add(zcbL);
zcbF = new JTextField(10);
zcbF.setEditable(false);
container.add(zcbF);
zcglL = new JLabel( "总持股量 ");
container.add(zcglL);
zcglF = new JTextField(10);
zcglF.setEditable(false);
container.add(zcglF);
syL = new JLabel( "收益 ");
container.add(syL);
syF = new JTextField(10);
syF.setEditable(false);
container.add(syF);
pjcbL = new JLabel( "平价成本 ");
container.add(pjcbL);
pjcbF = new JTextField(10);
pjcbF.setEditable(false);
container.add(pjcbF);
button1 = new JButton( "计算 ");
button1.addActionListener(this);
container.add(button1);
}
public void actionPerformed(ActionEvent e)
{
mrj = Double.parseDouble(mrjF.getText());
mrl = Double.parseDouble(mrlF.getText());
mcj = Double.parseDouble(mcjF.getText());
mcl = Double.parseDouble(mclF.getText());
sgl = Double.parseDouble(sglF.getText());
zcb = mrj * mrl * 1.004;
zcgl = mrl + mrl / 10 * sgl;
pjcb = zcb / zcgl;
sy = mcj * mcl * 0.994;
zcglF.setText(Double.toString(zcgl));
zcbF.setText(Double.toString(zcb));
zcglF.setText(Double.toString(zcgl));
pjcbF.setText(Double.toString(pjcb));
syF.setText(Double.toString(sy));
}
}
我想请教以下如何实现如下功能:
在输入完“买入价”、“买入量”、“送股量”之后,自动的显示出“总成本”、“总持股量”以及“平均成本”的数值,再点击“计算”按钮后,显示出“收益”的数值。
初学者,程序可能写的非常乱,非常难看,请见谅……
[解决办法]
是否是在输入“送股量”之后按回车,然后自动计算出结果,然后显示出“总成本”、“总持股量”以及“平均成本”的数值?如果是这样的话,那么在表示“送股量”的JTextFild中添加接收回车的事件addActionListener(),在它的事件处理函数中,设置“总成本”、“总持股量”以及“平均成本”对应的组件的文本就可以了。
在“计算”按钮中也添加事件处理来计算“收益”。
可以看一下这个程序,对你也许有帮助:
http://www.it315.org/soucecode/java11.htm
[解决办法]
帮你改了一下,限制输入数字
package gui;
import java.awt.*;
import java.awt.event.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class Gupiaojisuan extends JApplet implements ActionListener {
JLabel mrjL, mrlL, sglL, mcjL, mclL, zcbL, zcglL, syL, pjcbL;
JTextField mrjF, mrlF, sglF, mcjF, mclF, zcbF, zcglF, syF, pjcbF;
JButton button1, button2;
double mrj, mrl, sgl, mcj, mcl, zcb, zcgl, sy, pjcb;
public void init() {
Container container = getContentPane();
container.setLayout(new FlowLayout());
mrjL = new JLabel( "买入价 ");
container.add(mrjL);
mrjF = new JTextField(10);
mrjF.setDocument(new OnlyDigit(mrjF));
container.add(mrjF);
mrlL = new JLabel( "买入量 ");
container.add(mrlL);
mrlF = new JTextField(10);
mrlF.setDocument(new OnlyDigit(mrlF));
container.add(mrlF);
sglL = new JLabel( "送股量 ");
container.add(sglL);
sglF = new JTextField(10);
sglF.setDocument(new OnlyDigit(sglF));
container.add(sglF);
mcjL = new JLabel( "卖出价 ");
container.add(mcjL);
mcjF = new JTextField(10);
mcjF.setDocument(new OnlyDigit(mcjF));
container.add(mcjF);
mclL = new JLabel( "卖出量 ");
container.add(mclL);
mclF = new JTextField(10);
mclF.setDocument(new OnlyDigit(mclF));
container.add(mclF);
zcbL = new JLabel( "总成本 ");
container.add(zcbL);
zcbF = new JTextField(10);
zcbF.setEditable(false);
container.add(zcbF);
zcglL = new JLabel( "总持股量 ");
container.add(zcglL);
zcglF = new JTextField(10);
zcglF.setEditable(false);
container.add(zcglF);
syL = new JLabel( "收益 ");
container.add(syL);
syF = new JTextField(10);
syF.setEditable(false);
container.add(syF);
pjcbL = new JLabel( "平价成本 ");
container.add(pjcbL);
pjcbF = new JTextField(10);
pjcbF.setEditable(false);
container.add(pjcbF);
button1 = new JButton( "计算 ");
button1.addActionListener(this);
container.add(button1);
}
public void actionPerformed(ActionEvent e) {
/*mrj = Double.parseDouble(mrjF.getText());
mrl = Double.parseDouble(mrlF.getText());
mcj = Double.parseDouble(mcjF.getText());
mcl = Double.parseDouble(mclF.getText());
sgl = Double.parseDouble(sglF.getText());
zcb = mrj * mrl * 1.004;
zcgl = mrl + mrl / 10 * sgl;
pjcb = zcb / zcgl;
sy = mcj * mcl * 0.994;
zcglF.setText(Double.toString(zcgl));
zcbF.setText(Double.toString(zcb));
zcglF.setText(Double.toString(zcgl));
pjcbF.setText(Double.toString(pjcb));*/
syF.setText(Double.toString(sy));
}
private void tryCalculate(){
String str;
boolean all=true;
if(!(str=mrjF.getText().trim()).equals( " ")){
mrj = Double.parseDouble(str);
}
else
all = false;
if(!(str=mrlF.getText().trim()).equals( " ")){
mrl = Double.parseDouble(str);
}
else
all=false;
if(!(str=mcjF.getText().trim()).equals( " ")){
mcj = Double.parseDouble(str);
}
else
all = false;
if(!(str=mclF.getText().trim()).equals( " ")){
mcl = Double.parseDouble(str);
}
else
all = false;
if(!(str=sglF.getText().trim()).equals( " ")){
sgl = Double.parseDouble(str);
}
else
all = false;
if(all){
zcb = mrj * mrl * 1.004;
zcgl = mrl + mrl / 10 * sgl;
pjcb = zcb / zcgl;
sy = mcj * mcl * 0.994;
zcglF.setText(Double.toString(zcgl));
zcbF.setText(Double.toString(zcb));
zcglF.setText(Double.toString(zcgl));
pjcbF.setText(Double.toString(pjcb));
//syF.setText(Double.toString(sy));
}
else{
zcglF.setText( " ");
zcbF.setText( " ");
zcglF.setText( " ");
pjcbF.setText( " ");
syF.setText( " ");
}
}
/**
* this class is used to restrict the input, it makes sure that
* the text of the text field is a digit string.that is, 'a ', 'Z ',
* '_ ', '$ 'and so on are all forbidden.
* @author feng
*
*/
private class OnlyDigit extends PlainDocument{
private JTextField f;
public OnlyDigit(JTextField f){
this.f = f;
}
public void insertString(int offset,
String str,
AttributeSet attSet)
throws BadLocationException{
StringBuffer tmp = new StringBuffer(f.getText());
tmp.insert(offset,str);
Pattern p = Pattern.compile( "^-?\\d*(\\.)?\\d*$ ");
Matcher m = p.matcher(tmp.toString());
if(m.matches()){
super.insertString(offset,str,attSet);
tryCalculate();
}
}
}
}
[解决办法]
其实楼主都做得差不多了,只需要
买入价 买入量 送股量 这几个JTextField增加一个监听就好了, 我对你的程序不需要的只是注释了一下.增加了一点点代码.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Gupiaojisuan extends JApplet //implements ActionListener
{
JLabel mrjL,mrlL,sglL,mcjL,mclL,zcbL,zcglL,syL,pjcbL;
JTextField mrjF,mrlF,sglF,mcjF,mclF,zcbF,zcglF,syF,pjcbF;
JButton button1,button2;
double mrj,mrl,sgl,mcj,mcl,zcb,zcgl,sy,pjcb;
public void init()
{
Container container = getContentPane();
container.setLayout(new FlowLayout());
mrjL = new JLabel( "买入价 ");
container.add(mrjL);
mrjF = new JTextField(10);
container.add(mrjF);
mrlL = new JLabel( "买入量 ");
container.add(mrlL);
mrlF = new JTextField(10);
container.add(mrlF);
sglL = new JLabel( "送股量 ");
container.add(sglL);
sglF = new JTextField(10);
container.add(sglF);
mcjL = new JLabel( "卖出价 ");
container.add(mcjL);
mcjF = new JTextField(10);
container.add(mcjF);
mclL = new JLabel( "卖出量 ");
container.add(mclL);
mclF = new JTextField(10);
container.add(mclF);
zcbL = new JLabel( "总成本 ");
container.add(zcbL);
zcbF = new JTextField(10);
zcbF.setEditable(false);
container.add(zcbF);
zcglL = new JLabel( "总持股量 ");
container.add(zcglL);
zcglF = new JTextField(10);
zcglF.setEditable(false);
container.add(zcglF);
syL = new JLabel( "收益 ");
container.add(syL);
syF = new JTextField(10);
syF.setEditable(false);
container.add(syF);
pjcbL = new JLabel( "平价成本 ");
container.add(pjcbL);
pjcbF = new JTextField(10);
pjcbF.setEditable(false);
container.add(pjcbF);
button1 = new JButton( "计算 ");
//button1.addActionListener(this);
container.add(button1);
//注册事件
ComputeListener computeListener = new ComputeListener();
button1.addActionListener(computeListener);
mrjF.addActionListener(computeListener);
mrlF.addActionListener(computeListener);
sglF.addActionListener(computeListener);
mcjF.addActionListener(computeListener);
mclF.addActionListener(computeListener);
}
//public void actionPerformed(ActionEvent e)
class ComputeListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
//这里如果转换为double形不成功的话,会抛出异常
//这种方法处理很死,不过还是可以用的
try
{
mrj = Double.parseDouble(mrjF.getText());
}
catch(Exception ex)
{
mrj = 0;
}
try
{
mrl = Double.parseDouble(mrlF.getText());
}
catch(Exception ex)
{
mrl = 0;
}
try
{
mcj = Double.parseDouble(mcjF.getText());
}
catch(Exception ex)
{
mcj = 0;
}
try
{
mcl = Double.parseDouble(mclF.getText());
}
catch(Exception ex)
{
mcl = 0;
}
try
{
sgl = Double.parseDouble(sglF.getText());
}
catch(Exception ex)
{
sgl = 0;
}
zcb = mrj * mrl * 1.004;
zcgl = mrl + mrl / 10 * sgl;
pjcb = zcb / zcgl;
sy = mcj * mcl * 0.994;
zcglF.setText(Double.toString(zcgl));
zcbF.setText(Double.toString(zcb));
zcglF.setText(Double.toString(zcgl));
pjcbF.setText(Double.toString(pjcb));
syF.setText(Double.toString(sy));
}
}
}
