如何根据按钮的位置(列,行)创建整数?

时间:2016-05-05 16:50:19

标签: java swing jbutton

我正在尝试制作一个由按钮组成的乘法表,其上有数学事实,当按下时会改变产品,然后再次按下时返回到事实。得到第一部分,但无法弄清楚如何让它返回到原始按钮设置。我的程序由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);
            }


            }

第二个类定义按下时按钮的作用。我做了两个案子。第一个是默认值,第二个是更改按钮以显示产品。这在第一次按下时工作正常。当第二次按下按钮时,我收到错误消息,没有任何变化。我可以将我的第一个案例改为基于的整数 按钮在面板上的位置(列,行)?我该怎么做呢?其他建议?

    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 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

答案在这里:)

首先,你用开关的东西是非常凌乱的,所以我用正则表达式纠正它:它检查文本是否只是一个数字或其他东西,所以如果它在表格上#34; 64&#34;或&#34; 8 x 8&#34;通过例子

在你的情况下,我不会使用列和行。想象一下,你突然添加了一行......你应该使用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
            }
        }
     }

希望它有所帮助:)

答案 2 :(得分:1)

我认为因为这一行而出现错误信息;

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

如果显示结果,请说明42prob.indexOf(" ")返回-1,因此它等同于{{1}由于prob.substring(2, 2);只有2个字符长,因此您无法达到它的42 nd索引,这将是第3个字母。另外,我不这么认为

2

做得很多。 v始终为int v=0; v++; v%=2;

解决问题的最简单方法是将原始文本解析为1构造函数。您可能还想使用JToggleButton代替FactButton来让它显示其状态。

JButton