如果用户在我的suduku板中输入任何字母,它将不允许转到其他单元格,直到他将该字母表更改为数字。如果他按下tab也不会移动。如果他使用鼠标也不会进入其他单元格直到他改变那个字母。如果字母输入一个消息想要显示字母是不允许的。我的代码消息显示三次并重复。显示避免这个。我希望显示消息一次直到用户改变字母和焦点是在当前字母表中仅输入了单元格。
代码:
private void setPuzzle(){
for(int row=0;row<size;row++){
for(int col=0;col<size;col++){
cell[row][col]=new JTextField(3);
cell[row][col].setHorizontalAlignment(JTextField.CENTER);
cell[row][col].addFocusListener(this);
panel.add(cell[row][col]);
}
}
}
@Override
public void focusGained(FocusEvent e) {
// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void focusLost(FocusEvent e) {
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
String value=(cell[i][j].getText());
if(value.equals("")){
cell[i][j].setBackground(Color.WHITE);
}
else if (!value.matches("[1-9]+")){
cell[i][j].setBackground(Color.red);
cell[i][j].requestFocus();
JOptionPane.showMessageDialog(getParent(),"Alphabetsare not allowed");
}
}
}
}
}
答案 0 :(得分:0)
您可以使用e.getSource()
来获取触发焦点事件的单元格。
仅对此单元格进行检查,这样即使有其他单元格不包含数值,该消息也只会显示一次。
此外,为了能够从单元格中获取文本,您必须将e.getSource()
返回的对象强制转换为JTextField
。
例如:
JTextField cell = (JTextField) e.getSource()
@Override
public void focusLost(FocusEvent e) {
JTextField cell = (JTextField) e.getSource();
String value = cell.getText();
if(!value.matches("\\d+") && value.length() > 0){
cell.setText("");
cell.setBackground(Color.red);
cell.requestFocus();
JOptionPane.showMessageDialog(getParent(),"Alphabetsare not allowed");
}else{
cell.setBackground(Color.WHITE);
}
}
答案 1 :(得分:0)
在您验证号码的其他情况下,您正在请求焦点,然后显示消息框。所以它显然会触发lostFocus事件。
尝试将代码交换为:
else if (!value.matches("[1-9]+"))
{
cell[i][j].setBackground(Color.red);
JOptionPane.showMessageDialog(getParent(),"Alphabetsare not allowed");
cell[i][j].requestFocus();
}