• 締切済み

javaのswingについて質問です。

1桁の演算をする簡単な電卓を書いてみたのですが。。。分からない所だけ少し抜粋しました。見て下さい。 class SampleKeyListener extends KeyAdapter { public void keyPressed(KeyEvent e) { if(flag==false){    //ここで演算子の処理を.....1 char key=e.getKeyChar(); switch(key){ case '-': lb1.setText("引き算をします。数字を入力して下さい。");lb2.setText(str);lb3.setText("-"); now="minus";break; case '+': lb1.setText("足し算をします。数字を入力して下さい。");lb2.setText(str);lb3.setText("+"); now="plus";break; case '*': lb1.setText("かけ算をします。数字を入力して下さい。");lb2.setText(str);lb3.setText("*"); now="kakeru";break; case '%': lb1.setText("割り算をします。数字を入力して下さい。");lb2.setText(str);lb3.setText("%"); now="waru";break; } } if(flag==true){   //ここから数字の処理を(1桁のみ)....2 int k=e.getKeyCode(); switch(k){ case KeyEvent.VK_0: str="0";if(now=="plus"){ sum=sum+0; } else if(now=="minus"){ sum=sum-0; } else if(now=="kakeru"){ sum=sum*0; } else if(now=="waru"){ sum=sum/0; } else{ sum=0; } flag=false;break; //以下9まで同じ処理をします。(数値だけ変更しますが) } b2.setText(str); lb3.setText(Integer.toString(sum)); } .... ここで数値と演算しを交互に入力させて、どちらかを続けて入力するとエラーをはくしくみにしたいのですが、最初の考えはint count=0;などをつくりメソッドが呼び出された回数を数え上のメモの1、2、を切り替えてswitch文の条件にないものを入力したときはエラーをという考えでした。しかしそうしてしまうと演算子のほうで乗算記号と8が自分のPCでは同じキー(乗算の演算子のときはshiftキーを押します)なのですが、乗算のときに乗算とともに8も反応してしまい結果がおかしくなるのと演算子と数字を交互に入力させる制限もうまくいきませんでした。そこで上の様にbooleanでフラグを作true,falseで分岐させると乗算演算子のときに8は反応しなくなったのですが(入力の制限もできています)みてお分かりになるように、数字の入力→演算子の入力でとまってしまいます。flagをfalseからtrueに変えるのをそれぞれの演算子の方のswitch文にいれるとこんどはまた8が反応してしまうのと入力制限ができないです。どこにflagの切り替えをまたはどのようにしたらうまくできるでしょうか

みんなの回答

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

コードは詳しく見ていませんが、とりあえず気がついた点だけ。 1.演算子の取得と数字の取得で違うメソッドを使っている。   (getKeyChar()とgetKeyCode()) 2.数字の処理内で文字列の比較を==で行っている。   × str="0";if(now=="plus"){   ○ str="0";if(now.equals("plus")){ 以上、返事があるか怪しいので、簡単に書きました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Javaのswingについて質問です。

    public class Enshu12 extends JApplet { private JLabel lb1; private JLabel lb2; int num=0; int now=0; public void init() { lb1=new JLabel("数字を入力してください。"); lb2=new JLabel(""+num+""); add(lb1,BorderLayout.NORTH); add(lb2,BorderLayout.SOUTH); addKeyListener(new SampleKeyListener()); } public class SampleKeyListener extends KeyAdapter { int i; public void keyPressed(KeyEvent e) { char c=e.getKeyChar(); int mod=e.getModifiersEx(); if(mod==InputEvent.SHIFT_DOWN_MASK||c=='-'||c=='/'){ select(c); } else{ inputNum(c); calc(); lb2.setText(""+num+""); } } public void select(char c) { switch(c){ case '+': now=1;lb1.setText("足し算をします。数字を入力して下さい。");break; case '-':now=2;lb1.setText("引き算をします。数字を入力してください。");break; case '*':now=3;lb1.setText("かけ算をします。数字を入力して下さい。");break; case '/':now=4;lb1.setText("割り算をします。数字を入力して下さい。");break; } } public void inputNum(char c) { switch(c){ case '0': i=0;break; case '1': i=1;break; case '2': i=2;break; case '3': i=3;break; case '4': i=4;break; case '5': i=5;break; case '6': i=6;break; case '7': i=7;break; case '8': i=8;break; case '9': i=9;break; } } public void calc() { switch(now){ case 1: num=num+i; break; case 2: num=num-i; break; case 3: num=num*i;break; case 4: num=num/i; break; default : num=i; break; } } } 簡単な電卓を作り電卓機能としてはできたのですが、数字と演算子を交互に入力させたいため、数字または演算子の入力が連続入力された場合は例外処理をさせたいのですが、例外のクラスは作るとしてどのような仕組みにしたら良いでしょうか?単純にbooleanでそれぞれの切り替えをするとうまく動きません・・><教えてください。

    • ベストアンサー
    • Java
  • javaの初心者です。

    コンピュータとじゃんけんをするプログラムをつくりたいのですが コンパイルしたところ、次のようなエラーが出てきました。 java:8: メソッドの宣言が不正です。戻り値の型が必要です。 すいませんが、どこをどう直したらいいのかわかりません。 よろしければお教え願います。 以下がプログラムです。 import java.awt.event.*; import java.awt.*; import javax.swing.*; import java.applet.AudioClip; class Zyanken extends YJFrame implements ActionListener{ JButton bt1,bt2,bt3; JLabel lb1,lb2,lb3; YJFrame(String s, int w, int h,int b){ super(s,w,h,b); String[] ttl={"グー","チョキ","パー","Exit"}; String[] tips={"グーです","チョキです","パーです","終了します"}; int i; setUp(); Icon[] ic=new Icon[4]; for(i=0;i<4;i++) ic[i]=new ImageIcon("icon"+i+".gif"); btn=new JButton[4]; for(i=0;i<4;i++){ btn[i]=new JButton(ttl[i],ic[i]); btn[i].setToolTipText(tips[i]); btn[i].addActionListener(this); } JPanel p=new JPanel(); for(i=0;i<4;i++) p.add(btn[i]); p.setBackground(Color.pink); pane.add(p,BorderLayout.SOUTH); panel=new JPanel(); pane.add(panel,BorderLayout.CENTER); } public void actionPerformed(ActionEvent e){ int com=(int)(Math.random()*4); if(com==1){ lb2.setText("COMはグーです。"); } else if(com==2){ lb2.setText("COMはチョキです。"); } else{ lb2.setText("COMはパーです。"); } if(e.getSource()==bt1){ if(com==1){ lb3.setText("あいこです。"); } else if(com==2){ lb3.setText("あなたの勝ちです。"); } else{ lb3.setText("あなたの負けです。"); } } else if(e.getSource()==bt2){ if(com==1){ lb3.setText("あなたの負けです。"); } else if(com==2){ lb3.setText("あいこです。"); } else{ lb3.setText("あなたの勝ちです。"); } } else{ if(com==1){ lb3.setText("あなたの勝ちです。"); } else if(com==2){ lb3.setText("あなたの負けです。"); } else{ lb3.setText("あいこです。"); } } } }

  • 一桁電卓(setText)

    //<applet code="Calc.class" width="250" height="150" ></applet> import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Calc extends JApplet implements ActionListener{ JTextField display; int row=4,column=4,value=0,d; char str,str2; JButton[][] button=new JButton[row][column]; String[][] buttonName={{"7","8","9","/"}, {"4","5","6","*"}, {"1","2","3","-"}, {"0","C","=","+"}}; public void init(){ Container pane=getContentPane(); JPanel panel=new JPanel(); panel.setLayout(new GridLayout(4,4)); display=new JTextField(String.valueOf(value)); pane.add(display); display.setHorizontalAlignment(JTextField.RIGHT); display.setEditable(false); for(int a=0;a<row;a++){ for(int b=0;b<column;b++){ button[a][b]=new JButton(buttonName[a][b]); panel.add(button[a][b]); button[a][b].addActionListener(this); } } pane.add(panel,BorderLayout.SOUTH); } public void setText(int c){ if(str2!='/'&&str2!='*'&&str2!='-'&&str2!='+'){ value=c; } else if(str=='='){ display.setText(String.valueOf(value)); } if(str!='/'&&str!='*'&&str!='-'&&str!='+'&&str!='='){ display.setText(String.valueOf(c)); if(str2=='/')value=value/c; if(str2=='*')value=value*c; if(str2=='-')value=value-c; if(str2=='+')value=value+c; } else{ display.setText(String.valueOf(value)); if(str2=='/')value=value/c; if(str2=='*')value=value*c; if(str2=='-')value=value-c; if(str2=='+')value=value+c; } } public void actionPerformed(ActionEvent e){ for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ if(e.getSource()==button[i][j]){ str=buttonName[i][j].charAt(0); switch(str){ case '/': str2=str; setText(1); break; case '*': str2=str; setText(1); break; case '-': str2=str; setText(0); break; case '+': str2=str; setText(0); break; case '=': setText(d); break; case 'C': str2=str; value=0; setText(value); break; default: d=Integer.parseInt(buttonName[i][j]); setText(d); break; } } } } } } 上のプログラムは一桁電卓です。 プログラムは思ったように動くんですが、 seText(0、または1)の部分がどういう役目を果たしているか、0と1でどう違ってくるのかが分かりません。できればsetText(char)の説明も交えて教えていただけませんか?

  • C言語 自然数の四則演算 エラー原因不明

    プログラミング初心者です 自然数の四則演算のプログラムを作ったところ コンパイル時にはエラーは起こりませんでしたが実行時にエラーが起こり、動作が停止してしまいました。 自分で原因が特定できなかったのでこちらを頼らせてもらうことにしました。 ご教授お願いします。 <環境> Windows 7 Home Premium 64-bit Visual Studio 2013 #include<stdio.h> #include<ctype.h> #include<stdlib.h> int main( void ) { char str[2][128]={{0}}; int i,j,err=0,cont=0,wari=0; double c,d,dans; long a,b,lans; puts("自然数の四則演算('+''-''*''/')を計算"); //被加数,被減数,被乗数,被除数と演算の判定 i=0; while((str[0][i]=getchar())!='\n'){ if(str[0][0]=='+' || str[0][0]=='*' || str[0][0]=='/' || str[0][0]=='-'){ err=1; } if(str[0][i]=='+' || str[0][i]=='*' || str[0][i]=='/' || str[0][i]=='-'){ cont=1; //2つ目の数字を読み込むか否かの判定 break; }else if(isdigit(str[0][i])==0){ err=1; //数字と演算方法以外の入力はエラー } i++; } //加数,減数,乗数,除数の判定 if(cont==1 && err!=1){ j=0; while(str[1][j]!='\n'){ if(isdigit(str[0][i])==0){ err=1; //数字以外の入力があればエラー } j++; } str[1][j]='\0'; if(err==1){ printf("エラー入力"); return 0; } switch(str[0][i]){ case '+': str[0][i]='\0'; a=atol(str[0]); b=atol(str[1]); lans=a+b; break; case '-': str[0][i]='\0'; a=atol(str[0]); b=atol(str[1]); lans=a-b; break; case '*': str[0][i]='\0'; a=atol(str[0]); b=atol(str[1]); lans=a*b; break; case '/': str[0][i]='\0'; c=atol(str[0]); d=atol(str[1]); dans=(double)c/d; wari=1; //割り算の判定 break; default: break; } } if(err==0){ if(wari==0){ printf("計算結果:%ld\n",lans); }else if(wari==1){ printf("計算結果:%f\n",dans); } }else{ printf("エラー入力です\n"); } return 0; }

  • 現在学校のjavaの課題電卓を作っています

    import java.io.*; class dentaku { public static void main(String[] args)throws IOException { BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); System.out.print("式を入力"); String input = r.readLine(); String sum[] = new String[input.length()]; String number = ""; int s = 0; int goukei =0; char enzan = ' '; for(int i=0; i < input.length(); i++) { //System.out.print(str[i]); //文字列から1文字ずつ抽出 char num = input.charAt(i); if(i == input.length()-1) { sum[s] = number; } else { if(num == '+' || num == '-'|| num == '*'|| num == '/') { //配列sumに代入 sum[s] = number; s++; sum[s] = String.valueOf(num); s++; } else { //変数numberにnumを代入 number = number + num; } } } for(int j=0; j<sum.length; j++) { if(sum[j] == null) { break; } if(j == 0) { goukei = Integer.parseInt(sum[j]); } else { if(sum[j].equals("+") || sum[j].equals("-")|| sum[j].equals("*")|| sum[j].equals("/")) { enzan = sum[j].charAt(0); } else { switch(enzan) { case '+': goukei += Integer.parseInt(sum[j]); break; case '-': goukei -= Integer.parseInt(sum[j]); break; case '*': goukei *= Integer.parseInt(sum[j]); break; case '/': goukei /= Integer.parseInt(sum[j]); break; } } } } System.out.print(goukei); } } までできたのですが 実行し 実際に 1+1+1とうってみると答えが23になってしまいます。 どのようにしたらいいのでしょうか

    • ベストアンサー
    • Java
  • javaで電卓を作りたいのですが(Swing

    こんにちは。プログラミング初心者なのでどうかご助言願います。 javaのSwing(JFRAME)で電卓を作ろうとしているのですが、一応動作はするのですが連続計算がうまくいきません たとえば66(画面表示は66)*3(画面表示は3)-(画面表示は198)8(画面表示は8)=190 という計算をさせたいのですが、途中でうまくいってないみたいで 最終的な答えが58、という答えが出てしまいます。(途中はきちんと198と表示されます) 下のメソッドのどこが間違っているかご指摘頂けるとありがたいです int val =0; int val0=0; String op = null; //数字 public void numberreturn(int i){ val=val*10+ i; resultTextField.setText((new Integer(val)).toString()); } //演算子 public void calculate(String x){ if(op==null){ if(val0!=0){ op=x; }else{ val0=val; val=0; op=x;} }else if(val==0){ op=x; }else if(val0!=0){ returning(val0,val,op); op=x; }else{ val0=val; val=0; op=x; } } //結果表示 public void ansreturn(int i){ resultTextField.setText((new Integer(i)).toString()); } //計算を行う関数 public void returning (int i,int j,String x){ if(x!=null){ int k; if(x=="plus"){ k=i+j; } else if(x=="minus"){ k=i-j; } else if(x=="mult"){ k=i*j; } else{ try{ k=i/j; }catch(Exception e){ k=0; } } i=k; ansreturn(i); j=0; x=null; }else{ j=0; x=null; } } ボタンのほうは一応こんな感じです private void minusButtonActionPerformed(java.awt.event.ActionEvent evt) { calculate("minus"); } private void equallButtonActionPerformed(java.awt.event.ActionEvent evt) { returning(val0,val,op); } よろしくお願いします

    • ベストアンサー
    • Java
  • 「checkText3」が処理されない

    とあるHOWTO本を見ながら、独学でPHPを勉強中です。 サンプルプログラムを動作させようとマニュアル通りに記述してみたのですが、一部分だけが上手く処理されません。 付属CDに収められているphpファイル自体がこのような記述になっている為、マニュアル自体に間違いがあるのかな?と思うのですが、 どこがおかしいのか解らずにいます。 お分かりになる方がいれば、ご教授願えませんでしょうか? 上手く処理されないのは「//テキストチェック3.バイバイされたらバイバイを返す」の部分です。 よろしくお願い致します<(_ _)> <?php $res = ""; if(isset($_POST['text1']) == false) {$res = getAisatsu();} else{$text1 = $_POST['text1']; if($text1 == "") {$res = "え? なんていったの?";} else{$flag =false; //まずcheckTextであいさつ文をチェック $str = checkText($text1); if($str != false) {$flag = true; $res = $str; } //続いてcheckText2で悪口の対応 if($flag == false) {$str = checkText2($text1); if($str != false) {$flag = true; $res = $str; } } //最後にcheckText3でさよならの対応 if($flag == false) {$srt = checkText3($text1); if($str != false) {$flag = true; $res = $str; } } //すべてダメならテキストを分解してチェック if($flag == false) {$arr = bunkatsu($text1); foreach($arr as $str) {if(getWordCheck($str) == true) {$flag = true; $res = $str . "って、なぁに?"; break; } } } //それでもダメなら全文で聞き返す if($flag == false) {$res = delTouten($text1) . "って、なぁに?";} } } //時間によって異なるあいさつ文を返す function getAisatsu(){ $arr = array('……ね、眠い','おはよう!','こんにちは~','こんばんわ',); $d = getdate(); $t = $d['hours']; $t2 = (int)($t / 6); return $arr[$t2]; } //テキストチェック。あいさつ文があれば対応する挨拶を返す function checkText($s){ if($s == ""){return false;} $res = false; $data = array('こんにちは','こんにちわ','こんちは','こんちわ'); foreach($data as $str) {if (mb_strpos($s,$str) !== false) {$res = 'どうも、' . $str . '!'; break; } } return $res; } //テキストチェック2.悪口が書かれていたら文句をいう function checkText2($s) {if ($s ==""){return false;} $res = false; $data = array('バカ','馬鹿','あほ','アホ','阿呆'); foreach($data as $str) {if(mb_strpos($s,$str) !== false) {$res =$str . 'じゃないもん!'; break; } } return $res; } //テキストチェック3.バイバイされたらバイバイを返す function checkText3($s) {if ($s == ""){return false;} $res = false; $data = array('ばいばい','バイバイ','じゃあね'); foreach($data as $str) {if(mb_strpos($s,$str) !== false) {$res = 'それじゃ' . $str . '!'; break; } } return $res; } //句読点を削除する function delTouten($s) {$res = str_replace('。','',$s); $res = str_replace('?','',$res); $res = str_replace('!','',$res); $res = str_replace('.','',$s); $res = str_replace('?','',$res); $res = str_replace('!','',$res); return $res; } //テキストを句読点で分割し、配列として返す function bunkatsu($s) {mb_regex_encoding("sjis"); $res = mb_ereg_replace('[。、?!,.!?]','',$s); $arr = mb_split(' ',$res); return $arr; } //主語や接続詞が含まれているかを調べる function getWordCheck($s) {if ($s == ""){return false;} $res = $s; $data = array('私','わたし','僕','ぼく','俺','おれ','オレ'); foreach($data as $str) {if(mb_strpos($s,$str) !== false) {$res = false; break; } } return $res; } //サニタライズ function getSeftyText($s) {$res = str_replace("<","<",$s); $res = str_replace(">",">",$res); return $res; } ?>

    • ベストアンサー
    • PHP
  • java練習

    import java.util.Scanner; class test { public static void main (String[ ] args) throws IOException { System.out.println("文章を入力してください。"); BufferedReader input = new BufferedReader (new InputStreamReader (System.in)); String str = input.readLine( ); if (str == A) { str ="10"; } else if (str == 64) { str ="100"; } else if (str == 3E8) { str ="1000"; } else if (str == FF) { str ="255"; } else if (str == 100) { str ="256"; } System.out.println(" str + "); } } 今プログラミングの練習で文字や数字を判別するプログラムを作っています。 とりあえず16進数を入力したら10進数に変換されるプログラムを書いてたんですけどコンパイルしたらどうしてもエラーが出てきてしまいます。 調べてもよくわかりません、助けてください。

  • Javaのeval関数処理

    Javaのeval関数処理 はじめまして、こんばんわ。 いつも利用させて頂いております。 現在、Javaの課題を出されており、InputStreamを使って、1行の四則計算のプログラムを作成しております。 もうすこしで成功!!っというところで、減算の処理がDoubleでキャストしたときに例外として処理されてしまうため、非常に困っております。 もしよろしければどなたかご教授おねがいします。 protected String startCalc(String numerical) { // 初期値を設定 double addVal = 0; double minusVal = 0; while (true) { String val; // 加算演算子の位置を検索 int addPosition = numerical.indexOf("+"); if (addPosition < 0) { val = numerical; } else { // 加算の演算子の前の式 val = numerical.substring(0, addPosition); } // 乗算、除算の計算を行う addVal += procCalc(val); if (addPosition < 0) { break; } else { // 加算の演算子の後の式 numerical = numerical.substring(addPosition + 1); } } return new DecimalFormat("0").format(addVal + minusVal); } private double procCalc(String numerical) { // 乗算、除算の初期値を設定 double valNum = 1; while (true) { String mNum = ""; // 乗算の演算子の位置を取得 int multiPosition = numerical.indexOf("*"); if (multiPosition < 0) { mNum = numerical; } else { // 乗算の前の式を抜き取る mNum = numerical.substring(0, multiPosition); } int kai = 0; double value = 1; while (true) { String dNum = ""; int dPosition = mNum.indexOf("/"); // "/"がない場合 if (dPosition < 0) { dNum = mNum; } else { // 最初の / より前の項 dNum = mNum.substring(0, dPosition); } // 最初の計算の場合 if (kai == 0) { value = Double.parseDouble(dNum); // TODO マイナスの場合、ここで例外 } else { value /= Double.parseDouble(dNum); } // "/"がない場合 if (dPosition < 0) { break; } else { kai++; // 最初の / より以降の項 mNum = mNum.substring(dPosition + 1); } } valNum *= value; // "*"がない場合 if (multiPosition < 0) { break; } else { // 乗算の演算子の位置を取得 numerical = numerical.substring(multiPosition + 1); } } return valNum; } }

    • ベストアンサー
    • Java
  • アプレットでのキー入力

    具体的にいうと以下のアプレットを実行した場合に矢印キーを入力しても反応(上、下、、、が表示されない。)がないのです。 一度アプレット自体をクリックしても反応がありません。 何が悪いのでしょうか?よろしくお願いします。 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class practice extends JApplet { private JLabel lb1,lb2; public void init() { Container cnt = getContentPane(); lb1 = new JLabel("矢印キーでお選びください。"); lb2 = new JLabel(); cnt.add(lb1,BorderLayout.NORTH); cnt.add(lb2,BorderLayout.SOUTH); addKeyListener(new practiceKeyListener()); } class practiceKeyListener extends KeyAdapter { public void KeyPressed(KeyEvent e) { String str; int k = e.getKeyCode(); switch(k){ case KeyEvent.VK_UP: str = "上";break; case KeyEvent.VK_DOWN: str = "下";break; case KeyEvent.VK_LEFT: str = "左";break; case KeyEvent.VK_RIGHT: str = "右";break; default: str = "他のキー"; } lb2.setText(str + "ですね。"); } } }

    • ベストアンサー
    • Java
このQ&Aのポイント
  • DCP-J4140Nのエンコーダー清掃を行わない場合、印刷結果がガタガタになる可能性があります。しかし、対象となった機種の場合は、別の代替案を探す必要があります。
  • 使用しているDCP-J4140Nがエンコーダー清掃の対象外とされているため、エンコーダー清掃を行わない代替案が必要です。
  • DCP-J4140Nのエンコーダー清掃ができない場合、印刷結果の品質に問題が生じる可能性があります。別の解決策を見つける必要があります。
回答を見る

専門家に質問してみよう