当前位置: 首页 > 知识库问答 >
问题:

textFields上的无限焦点循环

赫连照
2023-03-14

我有2个JTextFields:

JTextField txtJobType, txtPriorityCode;
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 {
    }
} 
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();
    }
}
PriorityCode Focus Lost
JobType Focus Lost
PriorityCode Focus Lost
JobType Focus Lost

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

谢谢你!

共有1个答案

赖浩荡
2023-03-14

你不应该摆弄焦点丢失或其他低级构造。相反,为什么不像这个例子和这个例子一样简单地使用InputVerifier呢?

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

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;
      }
   }
}
 类似资料:
  • 首先,我不是程序员(只是对PHP有一些了解)。我制作了一个带有事件列表的网站,其中有一个选择字段,每月使用Ajax加载过滤事件。 该代码在大约3个月的时间里运行良好。但5天前,它突然停止工作,开始生成一个无限循环。 我调试了代码,发现问题出在“同时”循环上。我试图理解为什么这在一段时间内是完美的,然后它就不会了。(用无限循环崩溃服务器)。 这个函数只给出下个月的第一天。很好用。 这一个,为选择字段

  • 在连接上创建infinte循环!很奇怪,直到现在才发生。我不知道出了什么问题。我试图重建包,我复制一些代码从旧的源代码和相同的结果...

  • 我正在尝试从uwsgi-doc 运行Ubuntu Focus al(全新安装[VM]) 这是我安装的所有内容 但是当我试着运行我得到的例子时 [...] JVM 11.0.14 9-Ubuntu-0ubuntu2.20.04初始化为0x555b6858c348(工作线程:1 pid:5177)线程“main”java.lang.NoClassDefFoundError:uwsgi由以下原因引起:j

  • 问题内容: 我显然面临着一个无限循环,如以下代码所示 一些相关问题解释了为什么如果输入流为true总是返回true ,但是我正在扫描一个。 请让我知道我要去哪里了。 我正在尝试计算唯一整数值​​的总和(它们出现的位置用空格分隔)。 编辑: 获得的经验教训 不会将指针移到下一行,因此扫描仪不会越过任何输入。正如在此问题的答案中以及此处所解释的。 问题答案: 好吧,据 如果此令牌不是,扫描仪将不会使用

  • 问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循

  • hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l