如何在Java中获取JFormattedTextField的长度?
我在尝试获取JFormattedTextField的大小时遇到问题。实际上,我需要用户输入一个简单的pinCode,然后得到他输入的内容的大小,然后在它后面循环。如果他输入了4位数字就可以了,否则他必须再输入一次。但当我运行我的项目时,我有一个无限循环,“Pin必须是4位” 我已经找到了这个,但它并没有解决我的问题 这是我的密码:如何在Java中获取JFormattedTextField的长度?,java,eclipse,swing,jframe,jformattedtextfield,Java,Eclipse,Swing,Jframe,Jformattedtextfield,我在尝试获取JFormattedTextField的大小时遇到问题。实际上,我需要用户输入一个简单的pinCode,然后得到他输入的内容的大小,然后在它后面循环。如果他输入了4位数字就可以了,否则他必须再输入一次。但当我运行我的项目时,我有一个无限循环,“Pin必须是4位” 我已经找到了这个,但它并没有解决我的问题 这是我的密码: package codePin; import java.io.*; import java.text.NumberFormat; import java.util
package codePin;
import java.io.*;
import java.text.NumberFormat;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel container = new JPanel();
private JFormattedTextField jtf = new JFormattedTextField(NumberFormat.getIntegerInstance());
private JLabel label = new JLabel("Enter Pin: ");
private JButton b = new JButton("OK");
public Main() {
this.setTitle("APP");
this.setSize(300, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
container.setBackground(Color.white);
container.setLayout(new BorderLayout());
JPanel top = new JPanel();
Font police = new Font("Arial", Font.BOLD, 14);
jtf.setFont(police);
jtf.setPreferredSize(new Dimension(150, 30));
jtf.setForeground(Color.BLUE);
b.addActionListener(new BoutonListener());
top.add(label);
top.add(jtf);
top.add(b);
this.setContentPane(top);
this.setVisible(true);
}
class BoutonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
int nbTry = 0;
boolean authenticated = false;
do {
do {
if (jtf.getText().length() != 4) {
System.out.println("Pin must be 4 digits");
} else {
System.out.println("Checking...");
}
ArrayList<Integer> pins = new ArrayList<Integer>();
readPinsData(new File("bdd.txt"), pins);
String[] thePins = new String[pins.size()];
for (int i = 0; i < thePins.length; i++) {
thePins[i] = pins.get(i).toString();
}
String passEntered = String.valueOf(jtf);
for (int i = 0; i < thePins.length; i++) {
if (passEntered.equals(thePins[i]) && jtf.getText().length() == 4) {
System.out.println(":)");
authenticated = true;
break;
}
}
} while (jtf.getText().length() != 4);
if (!authenticated && jtf.getText().length() == 4) {
System.out.println(":(");
nbTry++;
}
} while (nbTry < 3 && !authenticated);
//System.out.println("TEXT : jtf " + jtf.getText());
}
}
// Function to read/access my pins database (file bdd.txt)
static public boolean readPinsData(File dataFile, ArrayList<Integer> data) {
boolean err = false;
try {
Scanner scanner = new Scanner(dataFile);
String line;
while (scanner.hasNext()) {
line = scanner.nextLine();
try {
data.add(Integer.parseInt(line));
} catch (NumberFormatException e) {
e.printStackTrace();
err = true;
}
}
scanner.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
err = true;
}
return err;
}
public static void main(String[] args) {
Main fen = new Main();
}
}
我该怎么做?有什么想法吗
谢谢,Florent。你可以得到一个
JFormattedTextField
的文本长度,在这里用这种方式说jtf:
jtf.getText().length();
注意:根据您的需要使用:
String s = jtf.getText();
s = s.replaceAll(",", "");
if (s.length() != 4)
但问题在于你使用循环的方式
我认为当用户准确输入数字时,您希望显示一种反应,如果是这样,您根本不需要循环
根据评论:
- 拆下回路(nTry<3…)
- 定义
int nbTry=0作为类成员编写>并在动作侦听器中跟踪它
- 在
中,检查是否一切正常,否则执行nTry++,如果nTry>=3,则执行任意操作BoutonListener
import java.io.*;
导入java.text.NumberFormat;
导入java.util.*;
导入javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
公共类主框架{
//-------------------------------这里
int-nbTry=0;
//-------------------------------这里
私有静态最终长serialVersionUID=1L;
私有JPanel容器=新JPanel();
私有JFormattedTextField jtf=新的JFormattedTextField(NumberFormat.getIntegerInstance());
专用JLabel标签=新JLabel(“输入Pin:”);
私有JButton b=新JButton(“OK”);
公用干管(){
jtf.getText().length();
本文件为setTitle(“APP”);
这个。设置大小(300500);
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
此.setLocationRelativeTo(空);
容器.立根台(颜色.白色);
container.setLayout(新的BorderLayout());
JPanel top=新的JPanel();
字体警察=新字体(“Arial”,Font.BOLD,14);
联合特遣部队(警察);
jtf.setPreferredSize(新尺寸(150,30));
联合特遣部队设置前景(颜色:蓝色);
b、 addActionListener(新的BoutonListener());
添加(标签);
添加(联合特遣部队);
顶部。添加(b);
此.setContentPane(顶部);
此.setVisible(true);
}
类BoutonListener实现ActionListener{
已执行的公共无效操作(操作事件e){
字符串s=jtf.getText();
s=s.replaceAll(“,”,“);
系统输出打印项次;
System.out.println(s.length());
布尔值=假;
如果(nbTry>3){
//哎呀,够了!
}
如果(s.length()!=4){
System.out.println(“Pin必须是4位数字”);
}否则{
System.out.println(“检查…”);
//检查这里!
ArrayList引脚=新的ArrayList();
readPinsData(新文件(“bdd.txt”)、PIN;
字符串[]thePins=新字符串[pins.size()];
for(int i=0;i
您的代码中有一个无限循环,因此当第一次调用BoutonListener.actionPerformed
时,它只在那里旋转而不退出
您必须对代码进行重大修改。首先将do while条件中使用的变量提取到字段中,并在每次调用
actionPerformed
时更新这些字段。您将陷入一个无休止的循环,因为如果PIN与长度不匹配,则用户没有机会重新输入PIN
循环和侦听器以这种方式工作得不太好。你为什么不把相关变量(例如,
nbTry
)保留为成员,在不循环的情况下执行检查呢?你似乎误解了actionListener的概念:Listener只听你的答案,其他什么都不做。您在侦听器中有等待正确位数的循环-这是错误的,您只需要处理侦听器中的一个输入(再次单击后,将再次调用侦听器)。因此,可以肯定的是,因为你的循环只有用户输入的一个答案,所以你得到了一个无终止的循环。只需处理一个输入
String s = jtf.getText();
s = s.replaceAll(",", "");
if (s.length() != 4)
import java.io.*;
import java.text.NumberFormat;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main extends JFrame {
//-------------------------------here
int nbTry = 0;
//-------------------------------here
private static final long serialVersionUID = 1L;
private JPanel container = new JPanel();
private JFormattedTextField jtf = new JFormattedTextField(NumberFormat.getIntegerInstance());
private JLabel label = new JLabel("Enter Pin: ");
private JButton b = new JButton("OK");
public Main() {
jtf.getText().length();
this.setTitle("APP");
this.setSize(300, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
container.setBackground(Color.white);
container.setLayout(new BorderLayout());
JPanel top = new JPanel();
Font police = new Font("Arial", Font.BOLD, 14);
jtf.setFont(police);
jtf.setPreferredSize(new Dimension(150, 30));
jtf.setForeground(Color.BLUE);
b.addActionListener(new BoutonListener());
top.add(label);
top.add(jtf);
top.add(b);
this.setContentPane(top);
this.setVisible(true);
}
class BoutonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String s = jtf.getText();
s = s.replaceAll(",", "");
System.out.println(s);
System.out.println(s.length());
boolean authenticated = false;
if (nbTry > 3) {
//Oops, enough!
}
if (s.length() != 4) {
System.out.println("Pin must be 4 digits");
} else {
System.out.println("Checking...");
//and check here!
ArrayList<Integer> pins = new ArrayList<Integer>();
readPinsData(new File("bdd.txt"), pins);
String[] thePins = new String[pins.size()];
for (int i = 0; i < thePins.length; i++) {
thePins[i] = pins.get(i).toString();
}
String passEntered = String.valueOf(jtf);
for (int i = 0; i < thePins.length; i++) {
if (passEntered.equals(thePins[i]) && jtf.getText().length() == 4) {
System.out.println(":)");
authenticated = true;
break;
}
}
if (authenticated) {
//Congratulation!
}
else {
nbTry++;
}
}
}
}
// Function to read/access my pins database (file bdd.txt)
static public boolean readPinsData(File dataFile, ArrayList<Integer> data) {
boolean err = false;
try {
Scanner scanner = new Scanner(dataFile);
String line;
while (scanner.hasNext()) {
line = scanner.nextLine();
try {
data.add(Integer.parseInt(line));
} catch (NumberFormatException e) {
e.printStackTrace();
err = true;
}
}
scanner.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
err = true;
}
return err;
}
public static void main(String[] args) {
Main fen = new Main();
}
}
for (int i = 0; i < thePins.length; i++) {
if (passEntered.equals(thePins[i]) && jtf.getText().length() == 4) {
System.out.println(":)");
authenticated = true;
break;
}
}
if (jtf.getText().replaceAll("\u00A0","").length() != 4) {
System.out.println("Pin must be 4 digits");
JOptionPane.showMessageDialog(null,"Pin must be 4 digits");
return;
}
package codePin;
import java.io.*;
import java.text.NumberFormat;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.concurrent.atomic.AtomicInteger;
public class Main extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel container = new JPanel();
private JFormattedTextField jtf = new JFormattedTextField(NumberFormat.getIntegerInstance());
private JLabel label = new JLabel("Enter Pin: ");
private JButton b = new JButton("OK");
public Main() {
this.setTitle("APP");
this.setSize(300, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
container.setBackground(Color.white);
container.setLayout(new BorderLayout());
JPanel top = new JPanel();
Font police = new Font("Arial", Font.BOLD, 14);
jtf.setFont(police);
jtf.setPreferredSize(new Dimension(150, 30));
jtf.setForeground(Color.BLUE);
b.addActionListener(new BoutonListener());
top.add(label);
top.add(jtf);
top.add(b);
this.setContentPane(top);
this.setVisible(true);
}
class BoutonListener implements ActionListener {
private final AtomicInteger nbTry = new AtomicInteger(0);
ArrayList<Integer> pins = readPinsData("bdd.txt");
public void actionPerformed(ActionEvent e) {
if (nbTry.get() > 2) {
JOptionPane.showMessageDialog(null, "Number of tries exceeded");
return;
}
final String passEntered=jtf.getText().replaceAll("\u00A0", "");
if (passEntered.length() != 4) {
System.out.println("Pin must be 4 digits");
JOptionPane.showMessageDialog(null, "Ping must be 4 digits");
return;
}
System.out.println("Checking...");
SwingWorker worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
boolean authenticated = false;
if (pins.contains(Integer.parseInt(passEntered))) {
System.out.println(":)");
authenticated = true;
}
if (!authenticated) {
System.out.println(":(");
nbTry.incrementAndGet();
}
return null;
}
};
worker.execute();
}
}
// Function to read/access my pins database (file bdd.txt)
static public ArrayList<Integer> readPinsData(String dataFile) {
final ArrayList<Integer> data=new ArrayList<Integer>();
try {
BufferedReader reader = new BufferedReader(new FileReader(new File(dataFile)));
String line;
try {
while ((line = reader.readLine()) != null) {
try {
data.add(Integer.parseInt(line));
} catch (NumberFormatException e) {
e.printStackTrace();
System.err.printf("error parsing line '%s'\n", line);
}
}
} finally {
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
System.err.println("error:"+e.getMessage());
}
return data;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Main fen = new Main();
}
});
}
}