精華區beta b885060xx 關於我們 聯絡資訊
import java.applet.*; import java.awt.*; import java.awt.event.*; import java.lang.Math.*; public class calculate extends Applet implements ActionListener, ItemListener, KeyListener { AudioClip gong[]; AudioClip StartAudio,ZeroAudio,BackAudio,ModeChangeAudio,ACAudio; Label InputLabel = null; Label MemoryLabel = null; Checkbox TwoCheckbox; Checkbox EightCheckbox; Checkbox TenCheckbox; Checkbox TenSixCheckbox; String NumberButtonName[] = {" 0 "," 1 "," 2 "," 3 "," 4 ", " 5 "," 6 "," 7 "," 8 "," 9 ", " A "," B "," C "," D "," E ", " F "}; Button NumberButton[] = new Button[16]; Button PointButton; int xy[][] = { {3,4},{3,3},{6,3},{9,3},{3,2},{6,2},{9,2},{3,1}, {6,1},{9,1},{0,5},{3,5},{6,5},{9,5},{12,5},{15,5}}; public void init() { super.init(); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); setFont(new Font("DialogInput",Font.PLAIN,20)); addKeyListener(this); Panel TextPanel = new Panel(); TextPanel.setBackground(Color.green); TextPanel.setLayout(new GridBagLayout()); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 0; gbc.ipadx = 200; gbc.ipady = 50; add(TextPanel,gbc); TextPanel.addKeyListener(this); InputLabel = new Label(); InputLabel.setBackground(Color.white); InputLabel.setAlignment(Label.RIGHT); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 20; gbc.gridy = 10; gbc.ipadx = 300; gbc.ipady = 10; InputLabel.setText("0"); TextPanel.add(InputLabel,gbc); InputLabel.addKeyListener(this); MemoryLabel = new Label(""); MemoryLabel.setBackground(Color.white); MemoryLabel.setAlignment(Label.CENTER); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 10; gbc.gridy = 10; gbc.ipadx = 10; gbc.ipady = 10; TextPanel.add(MemoryLabel,gbc); MemoryLabel.addKeyListener(this); Panel WholePanel = new Panel(); WholePanel.setBackground(Color.blue); WholePanel.setLayout(new GridBagLayout()); gbc.gridx = 0; gbc.gridy = 1; gbc.ipadx = 200; gbc.ipady = 100; gbc.fill = GridBagConstraints.BOTH; add(WholePanel,gbc); WholePanel.addKeyListener(this); gbc.gridwidth = 3; gbc.gridheight = 1; gbc.ipadx = 7; gbc.ipady = 5; gbc.fill = GridBagConstraints.BOTH; CheckboxGroup cbg = new CheckboxGroup(); gbc.gridx = 0; gbc.gridy = 0; TenSixCheckbox = new Checkbox("16", cbg, true); WholePanel.add(TenSixCheckbox,gbc); TenSixCheckbox.addItemListener(this); TenSixCheckbox.setForeground(Color.yellow); gbc.gridx = 3; gbc.gridy = 0; TenCheckbox = new Checkbox("10", cbg, true); WholePanel.add(TenCheckbox,gbc); TenCheckbox.addItemListener(this); TenCheckbox.setForeground(Color.yellow); gbc.gridx = 6; gbc.gridy = 0; TwoCheckbox = new Checkbox("2", cbg, false); WholePanel.add(TwoCheckbox,gbc); TwoCheckbox.addItemListener(this); TwoCheckbox.setForeground(Color.yellow); gbc.gridx = 9; gbc.gridy = 0; EightCheckbox = new Checkbox("8", cbg, false); WholePanel.add(EightCheckbox,gbc); EightCheckbox.addItemListener(this); EightCheckbox.setForeground(Color.yellow); Button BackButton = new Button(" <-"); BackButton.addActionListener(this); gbc.gridx = 12; gbc.gridy = 0; WholePanel.add(BackButton,gbc); Button ClearAllButton = new Button(" AC"); ClearAllButton.addActionListener(this); gbc.gridx = 15; WholePanel.add(ClearAllButton,gbc); Button MRButton = new Button(" MR"); MRButton.addActionListener(this); gbc.gridx = 0; gbc.gridy = 1; WholePanel.add(MRButton,gbc); gong = new AudioClip[16]; for(int i=0;i<16;i++) { NumberButton[i] = new Button(NumberButtonName[i]); NumberButton[i].addActionListener(this); NumberButton[i].setEnabled(i<10); gbc.gridx = xy[i][0]; gbc.gridy = xy[i][1]; WholePanel.add(NumberButton[i],gbc); gong[i] = getAudioClip(getDocumentBase(),new Integer(i).toString()+".au"); } Button DivideButton = new Button(" / "); DivideButton.addActionListener(this); gbc.gridx = 12; gbc.gridy = 1; WholePanel.add(DivideButton,gbc); Button ClearButton = new Button("_C_"); ClearButton.addActionListener(this); gbc.gridx = 15; gbc.gridy = 1; WholePanel.add(ClearButton,gbc); Button MCButton = new Button(" MC"); MCButton.addActionListener(this); gbc.gridx = 0; gbc.gridy = 2; WholePanel.add(MCButton,gbc); Button MutipleButton = new Button(" x "); MutipleButton.addActionListener(this); gbc.gridx = 12; gbc.gridy = 2; WholePanel.add(MutipleButton,gbc); Button SqrtButton = new Button("Sqr"); SqrtButton.addActionListener(this); gbc.gridx = 15; gbc.gridy = 2; WholePanel.add(SqrtButton,gbc); Button MMinusButton = new Button(" M-"); MMinusButton.addActionListener(this); gbc.gridx = 0; gbc.gridy = 3; WholePanel.add(MMinusButton,gbc); Button MinusButton = new Button(" - "); MinusButton.addActionListener(this); gbc.gridx = 12; gbc.gridy = 3; WholePanel.add(MinusButton,gbc); Button ReverseButton = new Button("1/x"); ReverseButton.addActionListener(this); gbc.gridx = 15; gbc.gridy = 3; WholePanel.add(ReverseButton,gbc); Button MPlusButton = new Button(" M+"); MPlusButton.addActionListener(this); gbc.gridx = 0; gbc.gridy = 4; WholePanel.add(MPlusButton,gbc); Button SignButton = new Button("+/-"); SignButton.addActionListener(this); gbc.gridx = 6; gbc.gridy = 4; WholePanel.add(SignButton,gbc); PointButton = new Button(" . "); PointButton.addActionListener(this); gbc.gridx = 9; gbc.gridy = 4; WholePanel.add(PointButton,gbc); Button AddButton = new Button(" + "); AddButton.addActionListener(this); gbc.gridx = 12; gbc.gridy = 4; WholePanel.add(AddButton,gbc); Button EqualButton = new Button(" = "); EqualButton.addActionListener(this); gbc.gridx = 15; gbc.gridy = 4; WholePanel.add(EqualButton,gbc); for(int i=0;i<WholePanel.getComponentCount();i++) { WholePanel.getComponents()[i].addKeyListener(this); } StartAudio = getAudioClip(getDocumentBase(), "gong.au"); StartAudio.play(); ZeroAudio = getAudioClip(getDocumentBase(), "adapt-or-die.au"); BackAudio = getAudioClip(getDocumentBase(), "ip.au"); ModeChangeAudio = getAudioClip(getDocumentBase(), "drip.au"); ACAudio = getAudioClip(getDocumentBase(), "return.au"); } public void actionPerformed(ActionEvent e) { for(int i=1;i<16;i++) { if(e.getActionCommand().equals(NumberButtonName[i])) { gong[i].play(); if(Mode==0) { if( !(currentValue.length()==1 && currentValue.equals(NumberButtonName[0].trim())) && !(currentValue.length()==2 && currentValue.charAt(0)=='-'&&currentValue.charAt(1)=='0') ) currentValue += NumberButtonName[i].trim(); } else if(Mode==1||Mode==2||Mode==3||currentValue.trim().equals("0")) { Mode = 0; currentValue = NumberButtonName[i].trim(); } break; } } if(e.getActionCommand().equals(NumberButtonName[0])) { gong[0].play(); if(Mode==0) { if(!(currentValue.length()==1 && currentValue.equals(NumberButtonName[0].trim())) && !(currentValue.length()==2 && currentValue.charAt(0)=='-' && currentValue.charAt(1)=='0') ) currentValue += NumberButtonName[0].trim(); } else if(Mode==1||Mode==2||Mode==3||currentValue.trim().equals("0")) { currentValue = "0"; Mode = 0; } } else if(e.getActionCommand().equals(" . ")) { if( (Mode==0||currentValue.equals("")||currentValue.equals("0")) && Base==10) { if(currentValue.indexOf(".")==-1) { currentValue += "."; Mode = 0; } } else if(Mode==2||Mode==3) { currentValue = "."; Mode = 0; } } else if(e.getActionCommand().equals("_C_")) { currentValue = ""; } else if(e.getActionCommand().equals(" / ")) { if(Mode==0||Mode==2) { allValue = MyCount(allValue,currentValue,Sign,Base); Sign = 4; Mode = 3; currentValue = allValue; } else if(Mode==3) Sign = 4; } else if(e.getActionCommand().equals(" x ")) { if(Mode==0||Mode==2) { allValue = MyCount(allValue,currentValue,Sign,Base); Sign = 3; Mode = 3; currentValue = allValue; } else if(Mode==3) Sign = 3; } else if(e.getActionCommand().equals(" - ")) { if(Mode==0||Mode==2) { allValue = MyCount(allValue,currentValue,Sign,Base); Sign = 2; Mode = 3; currentValue = allValue; } else if(Mode==3) Sign = 2; } else if(e.getActionCommand().equals(" + ")) { if(Mode==0||Mode==2) { allValue = MyCount(allValue,currentValue,Sign,Base); Sign = 1; Mode = 3; currentValue = allValue; } else if(Mode==3) Sign = 1; } else if(e.getActionCommand().equals(" M+")) { MemoryNumber += Double.valueOf(currentValue).doubleValue(); } else if(e.getActionCommand().equals(" M-")) { MemoryNumber -= Double.valueOf(currentValue).doubleValue(); } else if(e.getActionCommand().equals(" MC")) { MemoryNumber = 0; } else if(e.getActionCommand().equals(" MR")) { currentValue = Double.toString(MemoryNumber); Mode = 2; } else if(e.getActionCommand().equals("+/-")) { if(currentValue.length()!=0) { if(currentValue.charAt(0)=='-') currentValue = currentValue.substring(1); else currentValue = "-" + currentValue; } } else if(e.getActionCommand().equals(" AC")) { ACAudio.play(); allValue = ""; currentValue = ""; Sign = 0; Mode = 1; } else if(e.getActionCommand().equals("1/x")) { temp = Double.valueOf(currentValue).doubleValue(); if(temp!=0) temp = 1 / temp; currentValue = Double.toString(temp); Mode = 2; } else if(e.getActionCommand().equals("Sqr")) { temp = Double.valueOf(currentValue).doubleValue(); temp = Math.sqrt(temp); currentValue = Double.toString(temp); Mode = 2; } else if(e.getActionCommand().equals(" <-")) { BackAudio.play(); if(currentValue.length()>0) { currentValue = currentValue.substring(0,currentValue.length()-1); if(currentValue.equals("0")|| currentValue.equals("-0")|| currentValue.equals("")) Mode = 2; } } else if(e.getActionCommand().equals(" = ")) { if(Sign!=0) { allValue = MyCount(allValue,currentValue,Sign,Base); currentValue = allValue; Sign = 0; Mode = 2; } else { ZeroAudio.play(); } } if(Math.abs(MemoryNumber)<0.000000000001) MemoryLabel.setText(""); else MemoryLabel.setText(" M "); if(Base!=10) { int use = currentValue.indexOf((int)'.'); if(use==-1) use = currentValue.length(); String test = currentValue.substring(0,use); if(Base==10) currentValue = Integer.toString(Compute(test,Base)); else if(Base==8) currentValue = Integer.toOctalString(Compute(test,Base)); else if(Base==16) currentValue = Integer.toHexString(Compute(test,Base)).toUpperCase(); else if(Base==2) currentValue = Integer.toBinaryString(Compute(test,Base)); } InputLabel.setText(currentValue); repaint(); } public void keyTyped(KeyEvent e) { /* InputLabel.setText(new Character(e.getKeyChar()).toString()); */ for(int i=0;i<Base;i++) if(e.getKeyChar()==NumberButtonName[i].charAt(1) ||e.getKeyChar()==NumberButtonName[i].toLowerCase().charAt(1)) { ActionEvent Fake = new ActionEvent(e.getSource(), e.getID(), NumberButtonName[i]); actionPerformed(Fake); } if(e.getKeyChar()=='+') { ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," + "); actionPerformed(Fake); } else if(e.getKeyChar()=='-') { ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," - "); actionPerformed(Fake); } else if(e.getKeyChar()=='*') { ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," x "); actionPerformed(Fake); } else if(e.getKeyChar()=='x') { ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," x "); actionPerformed(Fake); } else if(e.getKeyChar()=='/') { actionPerformed(new ActionEvent(e.getSource(),e.getID()," / ")); } else if(e.getKeyChar()==13) { ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," = "); actionPerformed(Fake); } else if(e.getKeyChar()=='=') { ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," = "); actionPerformed(Fake); } else if(e.getKeyChar()==KeyEvent.VK_BACK_SPACE) { ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," <-"); actionPerformed(Fake); } else if(e.getKeyChar()=='.') { ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," . "); actionPerformed(Fake); } else if(e.getKeyChar()==27) { ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," AC"); actionPerformed(Fake); } else if(e.getKeyChar()=='!') { TenSixCheckbox.setState(true); HelperForStateChange(16); } else if(e.getKeyChar()=='@') { TenCheckbox.setState(true); HelperForStateChange(10); } else if(e.getKeyChar()=='#') { TwoCheckbox.setState(true); HelperForStateChange(2); } else if(e.getKeyChar()=='$') { EightCheckbox.setState(true); HelperForStateChange(8); } } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { } private int Compute(String Source,int Base) { int answer = 0 , num; for(int i=0;i<Source.length();i++) { if(Source.charAt(i)<='F'&&Source.charAt(i)>='A') num = 10 + Source.charAt(i) - 'A'; else num = Source.charAt(i) - '0'; answer += num * (int)Math.pow((double)Base,(double)(Source.length()-i-1)); } return answer; } private void HelperForStateChange(int temp) { ModeChangeAudio.play(); String test = null; int use = 0; for(int i=0;i<16;i++) NumberButton[i].setEnabled(i<temp); if(temp!=10) PointButton.setEnabled(false); else PointButton.setEnabled(true); use = currentValue.indexOf((int)'.'); if(use==-1) use = currentValue.length(); test = currentValue.substring(0,use); if(temp==10&&Base!=10) currentValue = Integer.toString(Compute(test,Base)); else if(temp==8) currentValue = Integer.toOctalString(Compute(test,Base)); else if(temp==16) currentValue = Integer.toHexString(Compute(test,Base)).toUpperCase(); else if(temp==2) currentValue = Integer.toBinaryString(Compute(test,Base)); Base = temp; InputLabel.setText(currentValue); } public void itemStateChanged(ItemEvent e) { int temp = Integer.valueOf(e.getItem().toString()).intValue(); HelperForStateChange(temp); } private String MyCount(String all,String current,int Type,int Base) { if(Type==0) return current; String answer = null; if(Base==10) { double temp1 = Double.valueOf(all).doubleValue(), temp2 = Double.valueOf(current).doubleValue(); switch(Type) { case 1: answer = Double.toString(temp1 + temp2); break; case 2: answer = Double.toString(temp1 - temp2); break; case 3: answer = Double.toString(temp1 * temp2); break; case 4: answer = Double.toString(temp1 / temp2); break; } } else { int temp1 = Compute(all,Base); int temp2 = Compute(current,Base); switch(Type) { case 1: if(Base==2) answer = Integer.toBinaryString (new Integer(temp1+temp2).intValue()); else if(Base==8) answer = Integer.toOctalString (new Integer(temp1+temp2).intValue()); else if(Base==16) answer = Integer.toHexString (new Integer(temp1+temp2).intValue()).toUpperCase(); break; case 2: if(Base==2) answer = Integer.toBinaryString (new Integer(temp1-temp2).intValue()); else if(Base==8) answer = Integer.toOctalString (new Integer(temp1-temp2).intValue()); else if(Base==16) answer = Integer.toHexString (new Integer(temp1-temp2).intValue()).toUpperCase(); break; case 3: if(Base==2) answer = Integer.toBinaryString (new Integer(temp1*temp2).intValue()); else if(Base==8) answer = Integer.toOctalString (new Integer(temp1*temp2).intValue()); else if(Base==16) answer = Integer.toHexString (new Integer(temp1*temp2).intValue()).toUpperCase(); break; case 4: if(Base==2) answer = Integer.toBinaryString (new Integer(temp1/temp2).intValue()); else if(Base==8) answer = Integer.toOctalString (new Integer(temp1/temp2).intValue()); else if(Base==16) answer = Integer.toHexString (new Integer(temp1/temp2).intValue()).toUpperCase(); break; } } return answer; } private int Base = 10; private String allValue = ""; private String currentValue = "0"; private int Sign = 0; /* 0 empty 1 + 2 - 3 * 4 / */ private int Mode = 1; /* 0 normal 1 right after Sign */ private double temp = 0.0; private double MemoryNumber = 0.0; }