2016-05-05 1 views
2

私は実際に数学的な事実を持つ掛け算表を作成しようとしていますが、それは押されたときに製品に変わり、その後再び押されたときの事実に戻ります。最初の部分を手に入れましたが、元のボタン設定に戻す方法を理解できません。私のプログラムは2つのクラスで構成されています。最初にボタンを作成し、オリジナルのファクトを挿入します。ネストされたループを使用して、ボタンにテキスト(数学ファクト)を書き込みます。ボタンの位置(列、行)に基づいて整数を作成するにはどうすればよいですか?

import java.awt.ComponentOrientation; 
    import java.awt.GridLayout; 
    import javax.swing.JPanel; 
    import javax.swing.JFrame; 


    public class Grid { 
     public static void main(String args[]){ 

      JFrame frame = new JFrame("Grid Layout"); 
      frame.setVisible(true); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setSize(600, 600); 
      frame.setResizable(false); 

      JPanel panel = new JPanel(); 
      panel.setLayout(new GridLayout (9, 9, 5, 5)); 
      panel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 

      int i, j; 
      for (i = 1; i<=9; i++){ 
      for (j = 1; j <= 9; j++){ 
       FactButton button =new FactButton(); 
       button.setText(i + " x " + j); 
       panel.add(button); 
       }  
      } 
      frame.add(panel); 
      } 


      } 

2番目のクラスでは、押されたときのボタンの種類を定義します。私は2つのケースを作った。最初はデフォルトで、2番目のボタンは製品を提示するために変更されます。初めて押すとうまく動作します。ボタンを2回押すとエラーメッセージが表示され、何も変わりません。最初のケースをパネルのボタンの位置(列、行)の に基づく整数に変更できますか?これはどうすればいいですか?その他の提案?

import javax.swing.JButton; 
    import java.awt.event.ActionListener; 
    import java.awt.Color; 
    import java.awt.event.ActionEvent; 



    public class FactButton extends JButton implements ActionListener{ 

     private static final long serialVersionUID = 1L; 

     public FactButton() { 
      this.addActionListener(this); 
     } 
     public void actionPerformed(ActionEvent e){ 
      String prob = this.getText(); 

      String left = prob.substring(0, prob.indexOf(" ")); 
      String right = prob.substring(prob.indexOf(" ")+3, prob.length() ); 
      int i = Integer.parseInt(left); 
      int j = Integer.parseInt(right); 

      int v=0; 
      v++; 
      v%=2; 
      switch(v){ 
      case 0: 
       this.setText(null); 
       break; 
      case 1:  
       this.setText(i*j+""); 
       this.setBackground(Color.WHITE); 
       this.setContentAreaFilled(false); 
       this.setOpaque(true); 
       break; 

      } 
     } 
    } 

最初に押すと製品に切り替わります。秒で壊れます。空白のボタンに戻ると思った。元の数学の事実を表示するにはどうしたらいいですか?

答えて

3

FactButtonのメンバーをメンバーにしてください。その後、いつでも使用できます。現在の状況では、ボタンのテキストから数値を解析しています。しかし、ボタンの最初のクリックテキストが変化している。したがって、インスタンス化中に設定した数値が失われています。

これであなた FactButtonを変更

import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.Color; 
import java.awt.event.ActionEvent; 

public class FactButton extends JButton implements ActionListener { 

    private final static int PRODUCT_STATE = 0; 
    private final static int FACT_STATE = 1; 

    private int buttonState = FACT_STATE; 

    private int firstNumber; 
    private int secondNumber; 

    public FactButton(int firstNumber, int secondNumber) { 
     this.firstNumber = firstNumber; 
     this.secondNumber = secondNumber; 
     this.setText(firstNumber + " x " + secondNumber); 
     this.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 

     switch (buttonState) { 
     case PRODUCT_STATE: 
      this.setText(firstNumber + " x " + secondNumber); 
      this.setBackground(null); 
      this.setContentAreaFilled(true); 

      buttonState = FACT_STATE; 
      break; 
     case FACT_STATE: 
      this.setText(firstNumber * secondNumber + ""); 
      this.setBackground(Color.WHITE); 
      this.setContentAreaFilled(false); 
      this.setOpaque(true); 
      buttonState = PRODUCT_STATE; 
      break; 
     } 
    } 
} 

とインスタンス化した後、ボタンのテキストを設定しないでください。このようにしてください:

FactButton button =new FactButton(i, j); 
//not needed 
//button.setText(i + " x " + j); 
panel.add(button); 
+0

これは別の関連するオプションです:) – Cukic0d

+0

私も "これも試してみるよあなたたちは素晴らしいですe! – Brook

1

この行のためにエラーメッセージが表示されると思います。

String right = prob.substring(prob.indexOf(" ")+3, prob.length() ); 

結果が表示されている場合は、のは、それは42だとしましょう、prob.indexOf(" ")戻り-1、したがって、それは42のでprob.substring(2, 2);と同等だが、唯一の2文字の長さで、あなたはそれが第三だろう2番目のインデックス、です到達することはできません文字。また、私はそうではないと思う。

int v=0; 
v++; 
v%=2; 

たくさんしています。あなたの問題にV常に1


最も簡単な解決策はただFactButtonコンストラクタに、元のテキストを解析することであろう。状態を示すためにJButtonの代わりにJToggleButtonを使用することもできます。

import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 

import javax.swing.JPanel; 
import javax.swing.JToggleButton; 
import javax.swing.JFrame; 

public class Grid { 
    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame("Grid Layout"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setSize(600, 600); 
       frame.setResizable(false); 

       JPanel panel = new JPanel(); 
       panel.setLayout(new GridLayout(9, 9, 5, 5)); 

       int i, j; 
       for (i = 1; i <= 9; i++) { 
        for (j = 1; j <= 9; j++) { 
         FactButton button = new FactButton(i + " x " + j); 
         panel.add(button); 
        } 
       } 
       frame.add(panel); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 

class FactButton extends JToggleButton { 

    private static final long serialVersionUID = 1L; 
    String orgText; 

    public FactButton(String orgText) { 
     this.orgText = orgText; 
     setText(orgText); 
     addItemListener(new ItemListener() { 
      public void itemStateChanged(ItemEvent evt) { 
       if (evt.getStateChange() == ItemEvent.SELECTED) { 
        String prob = getText(); 

        String left = prob.substring(0, prob.indexOf(" ")); 
        String right = prob.substring(prob.indexOf(" ") + 3, prob.length()); 
        int i = Integer.parseInt(left); 
        int j = Integer.parseInt(right); 
        setText(i * j + ""); 
       } else if (evt.getStateChange() == ItemEvent.DESELECTED) { 
        setText(orgText); 
       } 
      } 
     }); 
    } 
} 
+0

実際にはこれはJButtonを使い続けるための解決策ではありませんが、別のケースではうまくいっていたかもしれません... – Cukic0d

+0

@ Cukic0dこの場合、 'JToggleButton'を使うのはなぜいいのか説明できますか? –

+0

それはいいです:)しかし、彼は尋ねたものではありません...彼は "64"から "8 x 8"を得る方法を尋ねました – Cukic0d

2

回答は、ここですべての:)

まずあり、スイッチとのあなたの事は非常に厄介であるので、私は正規表現を使用して、それを修正:テキストはそう、唯一の番号または何か他のものであるかどうかはチェック例では "64"または "8 x 8"の形式の場合

あなたの場合、私は列と行を使用しません。あなたが突然行や何かを追加したと想像してみてください...あなたはこのように、その中のすべてのボタンのデフォルト値を設定することにより、HashMapを使用する必要があります。

Grid.java

import java.awt.Color; 
import java.awt.ComponentOrientation; 
import java.awt.GridLayout; 
import java.util.HashMap; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

    public class Grid { 

     static HashMap<JButton, String> map = new HashMap<JButton, String>(); 

     public static void main(String args[]){ 

       JFrame frame = new JFrame("Grid Layout"); 

       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setSize(800, 800); 
       frame.setResizable(false); 

       JPanel panel = new JPanel(); 
       panel.setLayout(new GridLayout (9, 9, 5, 5)); 
       panel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 

       int i, j; 
       for (i = 1; i<=9; i++){ 
        for (j = 1; j <= 9; j++){ 
         FactButton button =new FactButton(); 
         String txt = i + " x " + j; 
         button.setText(txt); 
         map.put(button, txt); 
         panel.add(button); 
        }  
       } 
       frame.add(panel); 
       frame.setVisible(true); 
      } 

     public static String getOriginalFromButton(JButton button){ 
      return map.get(button); 
     } 
} 

FactButton.java

import javax.swing.JButton; 
    import java.awt.event.ActionListener; 
    import java.awt.Color; 
    import java.awt.event.ActionEvent; 

    public class FactButton extends JButton implements ActionListener{ 

     private static final long serialVersionUID = 1L; 

     public FactButton() { 
      this.addActionListener(this); 
     } 
     public void actionPerformed(ActionEvent e){ 
      String prob = this.getText(); 

      int i = 0,j = 0; 

      if(!prob.matches("-?\\d+")){//it was on the "x*y" form 
       String left = prob.substring(0, prob.indexOf(" ")); 
       String right = prob.substring(prob.indexOf(" ")+3, prob.length()); 
       i = Integer.parseInt(left); 
       j = Integer.parseInt(right); 

       this.setText(i*j+""); 
       this.setBackground(Color.WHITE); 
       this.setContentAreaFilled(false); 
       this.setOpaque(true); 
      } else {//so it was on the form of a number 
       this.setText(Grid.getOriginalFromButton(this)); 
       //any other changes like color 
      } 
     } 
    } 

・ホープそれは助けた:)

+0

うわー!作品。元のボタンの色に戻りませんが、エラーはありません!ありがとう。赤ちゃん初の(チュートリアル上)コーディングプロジェクト。厄介なことに縛られている。 :-) – Brook

関連する問題