下面这个计算器程序有个问题,就是按钮的哪个面板始终加不进去,大家给帮忙看看吧,看添加面板的那一段就行了,急。。
//计算器
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.math.BigDecimal;public class Calculator extends JFrame implements ActionListener
{
JFrame frame=new JFrame();
final int INIT =0, RUN = 1, ERROR = 2, ADD = 1, SUB = 2, MUL = 3, DIV = 4;
JTextField screen;
Button button[] = new Button[16];
JPanel panel;
String buttonName[] = { "7", "8", "9", "+", "4", "5", "6", "-","1", "2", "3", "*", ".", "0", "=", "/" };
BigDecimal accumulator = new BigDecimal( 0 );//累加器
BigDecimal number = new BigDecimal( 0 );//第二个操作数
boolean decimal = false;//小数标记
int state = INIT, operate = INIT;//状态标记和操作标记
boolean countFinish = true, inputFinish = true;//计算完成标记和操作数输入完成标记

public Calculator()

Container container = frame.getContentPane();
frame.setTitle("计算器");
frame.setSize(180,200);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        }
        );
        //container.setLayout(null);
//container.setBounds(20,0,160,200);
screen = new JTextField();
screen.addKeyListener(
new KeyAdapter()
{
public void keyTyped( KeyEvent ke )
{
char ch = ke.getKeyChar();
Button action = null;
switch( ch )
{
case '7': action = button[0];break;
case '8': action = button[1];break;
case '9': action = button[2];break;
case '+': action = button[3];break;
case '4': action = button[4];break;
case '5': action = button[5];break;
case '6': action = button[6];break;
case '-': action = button[7];break;
case '1': action = button[8];break;
case '2': action = button[9];break;
case '3': action = button[10];break;
case '*': action = button[11];break;
case '.': action = button[12];break;
case '0': action = button[13];break;
case '/': action = button[15];break;
default : action = null;
}
if( ke.getKeyChar() == KeyEvent.VK_ENTER ) action = button[114];

}
}
);
screen.setText( "0.0" );
//screen.setBounds(10,0,160,20);
screen.setHorizontalAlignment( JTextField.RIGHT );
screen.setBackground( Color.cyan);
screen.setBounds(10,0,150,20);
screen.setEditable( false );
container.add( screen);
panel = new JPanel();
panel.setBounds(10,20,150,170);

for( int i = 0; i < buttonName.length; i++ )
{
button[i] = new Button( buttonName[i] );
panel.add( button[i] );
button[i].addActionListener( this );

}
panel.setLayout( new GridLayout(4,4));
container.add(panel);
}

public void actionPerformed( ActionEvent ae ) 
{
Button action = ( Button ) ae.getSource();
actionManage( action, ae.getActionCommand() );
screen.grabFocus();
}

private void actionManage( Button action, String num )
{
for( int i = 0; i < button.length; i ++ )
{
if( action == button[i] )
{
switch( i )
{
case 3://+
manageOperation();
operate = ADD;
break;
case 7://-
manageOperation();
operate = SUB;
break;
case 11://*
manageOperation();
operate = MUL;
break;
                                                case 15:///
manageOperation();
operate = DIV;
break;
case 12://.
decimal = true;
break;
case 14://=
pressEquals();
break;
default ://数字
pressNumber( num );
break;
}
}
}
}

private void pressEquals()
{
inputFinish = true;
decimal = false;
//当countFinish=false时说明计算没完成,屏幕显示为第二个操作数,要取下此操作数
//当countFinish=true并且state=RUN时说明第一个操作数和操作输入后按等号,此时没有第二个操作数
if( !countFinish || countFinish && state == RUN ) 
number = new BigDecimal( screen.getText() );
state = INIT;//按等号后一般说明计算结果,状态为初始化状态
count( operate );
}

private void manageOperation()
{
inputFinish = true;
decimal = false;
//当countFinish=true时说明输入的是下一次计算的操作,只记下下一次计算操作,不计算
if( !countFinish )
{
//当state!=INIT时说明要计算,取第二个操作数计算
if( state != INIT ) 
{
number = new BigDecimal( screen.getText() );
count( operate );
}
//当state=INIT时说明第一次输入操作,不用计算
else
{
state = RUN;//进入计算状态
countFinish = true;//防止初始化并输入第一个数据之后连续按两下运算时计算出结果
accumulator = new BigDecimal( screen.getText() );
}
}
}

private void count( int operate )
{
switch( operate )
{
case 1://+
accumulator = accumulator.add( number );
break;
case 2://-
accumulator = accumulator.subtract( number );
break;
case 3://*
accumulator = accumulator.multiply( number );
break;
case 4:///
try
{
accumulator = accumulator.divide( number, 15, 5 );
}catch(  ArithmeticException ae )
{
state = ERROR;
}

break;
}
setScreenText( accumulator );
if( state == ERROR ) screen.setText( "除数不能为零!" );
countFinish = true;
}

private void setScreenText( BigDecimal number )//去掉小数中最右边的0后显示
{
String result = number.toString();
if( result.indexOf( "." ) != -1 )
{
char ch = result.charAt( result.length() - 1 );
while( ch == '0' )
{
result = result.substring( 0, result.length() - 1 );
ch = result.charAt( result.length() - 1 );
}
}
else
{
result += ".";
}
screen.setText( result );
} private void pressNumber( String num )
{
//当inputFinish=true时说明上一步按了操作,现在要输入第二个操作数,屏幕清0
if( inputFinish )
{
screen.setText( "0." );
inputFinish = false;
}
countFinish = false;//当输入操作数时说明有新的计算,计算完成标记设为假
//输入第一位整数的处理
if( screen.getText().equals( "0." ) && decimal == false ) screen.setText( num + "." );
else
{
if( decimal == false )//输入为整数的处理
{
try
{
screen.setText( screen.getText( 0, screen.getText().length() - 1 )
+ num + "." );
}catch( Exception e ){ }
}
else//输入为小数的处理
{
screen.setText( screen.getText() + num );
}
}
}

public static void main( String args[] )
{
Calculator calc = new Calculator();
}
}

解决方案 »

  1.   

    没细看,可能错误:
    1、Button的坐标和Visible属性
    2、将Panel放入容器中
      

  2.   

    container连布局都没有啊
    container.setLayout(new BorderLayout());
    container.add(screen, BorderLayout.NORTH);
    container.add(panel, BorderLayout.CENTER);
    lz改成这样试一下.
    下次发长代码用一下csdn的java code吧,看着头疼.
      

  3.   

    把设置JPanel的布局管理放置到往里面添加按钮之前,我觉得可能是程序代码流程的原因
      

  4.   

    会不会是,swing 和awt 混各使用所出现的异常现象,把Button改用JButtom试一下呢