- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个为其设置输入 validator 的表单。
我希望当用户为文本字段键入正确的值并想转到其他文本字段时,除了文本字段之外还应该显示一个复选图标。但是现在在我的代码中,当用户在第一个文本字段中键入正确的值并转到其他文本字段时,两个图标一起显示!
public class UserDialog extends JDialog {
JButton cancelBtn, okBtn;
JTextField fNameTf, lNameTf;
JRadioButton maleRb, femaleRb;
ButtonGroup group;
JLabel fNameLbl, fNamePicLbl, lNameLbl, lNamePicLbl, genderLbl, tempBtn, temp3;
public UserDialog() {
add(createForm(), BorderLayout.CENTER);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLocation(400, 100);
pack();
setVisible(true);
}
public JPanel createForm() {
JPanel panel = new JPanel();
ImageIcon image = new ImageIcon("Check.png");
okBtn = new JButton("Ok");
cancelBtn = new JButton("Cancel");
tempBtn = new JLabel();
fNameLbl = new JLabel("First Name");
fNamePicLbl = new JLabel(image);
fNamePicLbl.setVisible(false);
lNameLbl = new JLabel("Last Name");
lNamePicLbl = new JLabel(image);
lNamePicLbl.setVisible(false);
genderLbl = new JLabel("Gender");
maleRb = new JRadioButton("Male");
femaleRb = new JRadioButton("Female");
temp3 = new JLabel();
group = new ButtonGroup();
group.add(maleRb);
group.add(femaleRb);
fNameTf = new JTextField(10);
fNameTf.setName("FnTF");
fNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb, okBtn}));
lNameTf = new JTextField(10);
lNameTf.setName("LnTF");
lNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb, okBtn}));
panel.add(fNameLbl);
panel.add(fNameTf);
panel.add(fNamePicLbl);
panel.add(lNameLbl);
panel.add(lNameTf);
panel.add(lNamePicLbl);
panel.add(genderLbl);
JPanel radioPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
radioPanel.add(maleRb);
radioPanel.add(femaleRb);
panel.add(radioPanel);
panel.add(temp3);
panel.add(okBtn);
panel.add(cancelBtn);
panel.add(tempBtn);
panel.setLayout(new SpringLayout());
SpringUtilities.makeCompactGrid(panel, 4, 3, 50, 10, 80, 60);
return panel;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new UserDialog();
}
});
}
public class MyVerifier extends InputVerifier {
private JComponent[] component;
public MyVerifier(JComponent[] components) {
component = components;
}
@Override
public boolean verify(JComponent input) {
String name = input.getName();
if (name.equals("FnTF")) {
String text = ((JTextField) input).getText().trim();
if (text.matches(".*\\d.*") || text.length() == 0) {
//disable dependent components
for (JComponent r : component) {
r.setEnabled(false);
}
return false;
}
} else if (name.equals("LnTF")) {
String text = ((JTextField) input).getText();
if (text.matches(".*\\d.*") || text.length() == 0) {
//disable dependent components
for (JComponent r : component) {
r.setEnabled(false);
}
return false;
}
}
//enable dependent components
for (JComponent r : component) {
r.setEnabled(true);
}
fNamePicLbl.setVisible(true);
lNamePicLbl.setVisible(true);
return true;
}
}
}
}
已更新
public class MyVerifier extends InputVerifier {
private JComponent[] component;
public MyVerifier(JComponent[] components) {
component = components;
}
@Override
public boolean verify(JComponent input) {
String name = input.getName();
if (name.equals("FnTF")) {
String text = ((JTextField) input).getText().trim();
if (text.matches(".*\\d.*") || text.length() == 0) {
return false;
}
} else if (name.equals("LnTF")) {
String text = ((JTextField) input).getText();
if (text.matches(".*\\d.*") || text.length() == 0) {
return false;
}
}
return true;
}
@Override
public boolean shouldYieldFocus(JComponent input) {
boolean isValidDate = verify(input);
if (isValidDate) {
for (JComponent r : component) {
r.setEnabled(true);
}
} else {
for (JComponent r : component) {
r.setEnabled(false);
}
}
return isValidDate;
}
最佳答案
But now in my code, when user type a correct value on first text field an go to other, Two icons displayed together!
因为你这样做了:(阅读评论)
public boolean verify(JComponent input) {
String name = input.getName();
if (name.equals("FnTF")) {
// your code
}
} else if (name.equals("LnTF")) {
// your code
}
//enable dependent components
for (JComponent r : component) {
r.setEnabled(true);
}
/* And Now we are here */
fNamePicLbl.setVisible(true);
lNamePicLbl.setVisible(true);
// making visible two of them at once as soon as verify is called
// on any one of the components, verifier is registered
return true;
}
setVisible
也应该由 if-else
条件控制。为了更好地理解你需要做这样的事情:
if (text.matches(".*\\d.*") || text.length() == 0) {
// your code
}
else
{
fNamePicLbl.setVisible(true);
}
第二期:
fNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb, okBtn}));
lNameTf = new JTextField(10);
lNameTf.setName("LnTF");
lNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb, okBtn}));
MyVerfier
具有验证两个输入字段的通用代码。但是您正在使用相同的组件实例创建它的两个实例。创建一个并将其设置为两个字段的输入 validator 。
您可能想为两个文本字段创建两个不同的 InputVerifier 类。 FnTFVerifier
和 LnTFVerifier
。然后输入与它们相关的验证码,例如,启用单选按钮并显示带有 check.png
的标签。大多数 if-else
检查都会消失。
但我认为,这不应该是更好的方式。由于两个文本字段具有共同的功能,一个 InputVerifier
类和实例就足够了。您只需将输入文本字段和相关的 cehckLabel 封装到一个组件,然后将 InputVerifier 实例注册到该组件。
第三个问题:您误用了验证功能:
验证函数仅用于验证数据:数据是否符合用户要求的条件是否有效。它不应该做更多的事情。 InputVerifier
有另一个函数 boolean ShouldYieldFocus(Jcomponent)
:在焦点转移到另一个请求它的 Swing 组件之前,输入 validator 的 shouldYieldFocus
方法被调用,它决定被验证的组件是否应该失去焦点。仅当此方法返回 true
时才会转移焦点。但是,您应该在此函数内编写所需的组件状态更改。
public boolean shouldYieldFocus(JComponent input) {
boolean isDataValid = verify(input);
if(isDataValid); //do stuff
return isDataValid; // if verify is true(valid) return true;
}
关于java - InputVerifier 不显示每个组件图标(标签),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19499692/
我有代码: public class SerialNumberInputVerifier extends InputVerifier { @Override public boolean verify
我正在开发一种向用户提供“实时”验证的表单,但我遇到了一个问题。 目标是在字段附近放置一个标签(在本例中为 JSpinner),以向用户显示数据是否被接受或拒绝,与基于 javascript 的 va
我有一个为其设置输入 validator 的表单。 我希望当用户为文本字段键入正确的值并想转到其他文本字段时,除了文本字段之外还应该显示一个复选图标。但是现在在我的代码中,当用户在第一个文本字段中键入
我有一个带有 JTextFields 的 swing 应用程序,我将 InputVerifiers 附加到该应用程序。我通过 setText 方法将有效的默认值应用于字段,例如 this.myFiel
我有两个类 public class Finestra extends javax.swing.JFrame{ ........ jtextField.setinputVerifier
我有一个 GUI 应用程序,它使用 InputVerifier 在产生焦点之前检查文本字段的内容。这都是很正常的。然而,昨天发现了一个问题——它似乎是一个错误,但我在任何地方都找不到任何提及。在我将此
我真的很惊讶this is not in the documentation或at least google . 我有一个类可能需要删除 validator 或将其替换为另一个 validator 。
我有这个代码: public class Anagrafica implments ClientiInterface{ InputVerifier verifierAliquotaIva =
这里我将 InputVerifier 设置为我的文本字段 (tf1): public class MyInputVerifier extends InputVerifier { @Override p
我正在使用 NetBeans IDE 使用 java 和 swing 设计图形用户界面。 GUI 的目的是获取用户输入,然后生成一些文本文件,用作用 Fortran 编写的程序的输入。 问题是 For
我目前正在开发一个 Swing 应用程序,我有几个 JTextAreas 将被解析、转换为日期,然后添加到 MySQL 数据库中。一个是日期字段,其他是日期时间,我正在尝试做的是使用 InputVer
我有一个带有自定义 inputVerifyer 的 JComboBox 设置为可编辑时限制 MaxLength。 验证方法似乎永远不会被调用。 可以在 JTextField 上调用相同的 valida
我有一个 Swing JComboBox,其中 InputVerifier 设置正确。 我正在使用组合框来设置一个整数。 如果我在字段中键入“cat”并点击 Tab,我的 InputVerifier
我是一名优秀的程序员,十分优秀!