gpt4 book ai didi

java - InputVerifier 不显示每个组件图标(标签)

转载 作者:行者123 更新时间:2023-11-29 05:36:05 24 4
gpt4 key购买 nike

我有一个为其设置输入 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 类。 FnTFVerifierLnTFVerifier。然后输入与它们相关的验证码,例如,启用单选按钮并显示带有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com