java - textFields 上的无限焦点循环

标签 java swing focus infinite-loop error-checking

我有 2 个 JTextFields:

JTextField txtJobType, txtPriorityCode;

这是我需要的功能:

当用户在 txtJobType 中输入“管理”并点击选项卡(或点击离开)时,将进行错误检查以查看该字段是否为空或输入的文本是否存在于数据库中。我这样做的方式是:

private void txtJobTypeFocusLost(java.awt.event.FocusEvent evt) {                                     
    System.out.println("JobType Focus Lost");
    if (!checkFieldExists(txtJobType.getText(), "jobType", "jobCode",
            JobType.class) || txtJobType.getText().isEmpty()) {
        txtJobType.requestFocusInWindow();
        txtJobType.selectAll();
    } else {
    }
} 

因此,如果该字段不存在或文本为空,则将焦点返回到 txtJobType 并突出显示所有文本(如果有)

这没有问题。但是,我有 txtPriorityCode 字段需要具有完全相同的行为。所以我做了:

private void txtPriorityCodeFocusLost(java.awt.event.FocusEvent evt) {                                          
    System.out.println("PriorityCode Focus Lost");
    if (!checkFieldExists(txtPriorityCode.getText(), "priority", "priorityCode",
            Priority.class) || txtPriorityCode.getText().isEmpty()) {
        txtPriorityCode.requestFocusInWindow();
        txtPriorityCode.selectAll();
    }
}

这就是问题开始的地方:如果用户将 jobType 和选项卡留给 Priority,那么代码会尝试将焦点返回到 jobtype,但是因为此时 priority 也是空白,它会尝试从 jobtype 取回焦点,结果在此输出中:

PriorityCode Focus Lost
JobType Focus Lost
PriorityCode Focus Lost
JobType Focus Lost

感谢任何有关如何实现此行为的帮助,因为我必须对至少 10 个其他文本字段执行此操作。

谢谢!

最佳答案

您不应该摆弄焦点丢失或其他低级结构。相反,为什么不根据 this example 简单地使用 InputVerifier和 this one too

例如,它可能看起来像这样:

import javax.swing.*;

public class InputVerifierEg {
   private JPanel mainPanel = new JPanel();
   private JTextField txtJobType = new JTextField(10);
   private JTextField txtPriorityCode = new JTextField(10);

   public InputVerifierEg() {
      txtJobType.setInputVerifier(new MyInputVerifier("jobType", "jobCode",
            JobType.class));
      txtPriorityCode.setInputVerifier(new MyInputVerifier("priority", "priorityCode",
            Priority.class));

      mainPanel.add(new JLabel("Job Type:"));
      mainPanel.add(txtJobType);
      mainPanel.add(Box.createHorizontalStrut(15));
      mainPanel.add(new JLabel("Priority Code:"));
      mainPanel.add(txtPriorityCode);

   }

   public JPanel getMainPanel() {
      return mainPanel;
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("InputVerifierEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new InputVerifierEg().getMainPanel());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MyInputVerifier extends InputVerifier {
   private String fieldName;
   private String codeName;
   private Class<?> classType;

   public MyInputVerifier(String fieldName, String codeName, Class<?> classType) {
      this.fieldName = fieldName;
      this.codeName = codeName;
      this.classType = classType;
   }

   @Override
   public boolean verify(JComponent input) {
      JTextField tField = (JTextField) input;

      // assuming that the checkFieldExists is a static method of a utility class
      if (!FieldCheckerUtil.checkFieldExists(tField.getText(), fieldName,
            codeName, classType)) {
         return false;
      }

      if (tField.getText().trim().isEmpty()) {
         return false;
      }
      return true;
   }

   @Override
   public boolean shouldYieldFocus(JComponent input) {
      JTextField tField = (JTextField) input;

      if (verify(input)) {
         return true;
      } else {
         tField.selectAll();
         // show JOptionPane error message?
         return false;
      }
   }
}

关于java - textFields 上的无限焦点循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12058212/

相关文章:

java - jpeg 字节到十六进制值

java - 将 getText() 函数与 JTextField 一起使用时出现空指针异常

c# - 当我显示另一个表单时,如何防止原始表单失去焦点?

java - 为什么 j8583 Configparser 失败且模板字段没有默认值?

java - 隐藏命令行输入

java - 当 HTTP 响应内容类型不包含空格时测试 org.apache.http.entity.ContentType

WPF ListBox 触发器不适用于 IsFocused 属性

java - 如何更改 JSplitPane 的颜色

java - 如何获得 Swing 组件的坐标,而不考虑其父组件?

javascript - Click-to-focus 和 focus-by-javascript 有什么区别?