我正在尝试制作一个由按钮组成的乘法表,其上有数学事实,当按下时会改变产品,然后再次按下时返回到事实。得到第一部分,但无法弄清楚如何让它返回到原始按钮设置。我的程序由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;
}
}
}
首次按下时会切换到产品。打破第二。以为它会回到一个空白按钮。如何让它显示原始数学事实?
答案 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() );
如果显示结果,请说明42
,prob.indexOf(" ")
返回-1
,因此它等同于{{1}由于prob.substring(2, 2);
只有2个字符长,因此您无法达到它的42
nd索引,这将是第3个字母。另外,我不这么认为
2
做得很多。 v始终为int v=0;
v++;
v%=2;
解决问题的最简单方法是将原始文本解析为1
构造函数。您可能还想使用JToggleButton
代替FactButton
来让它显示其状态。
JButton