当前位置: 首页 > 面试题库 >

这是将FocusListener添加到Java中的JTextFields的正确方法吗?

墨星鹏
2023-03-14
问题内容

JTextFields在Java应用程序中有成百上千的应用程序,我想添加FocusListener所有这些来 设置 文本的“
水平对齐” ,并在每个这些文本字段上 添加FocusListener
。因此,我做了这种方法,效果很好。但是我只是想知道这种正确的方法还是其中存在错误,或者我违反某种OOP规则?

这是代码

public void CreateFocusListenerForFields(JTextField txt)
{
    txt.setHorizontalAlignment(JTextField.RIGHT);
    txt.addFocusListener(new FocusListener() 
    {
        @Override
        public void focusGained(FocusEvent e) {
        }

        @Override
        public void focusLost(FocusEvent e) {
            if(!NumberUtils.isNumber(txt.getText()))
            {
                txt.setBackground(new Color(254,157,157));
                txt.requestFocus();
            }
            else
            {
                txt.setBackground(Color.white);
            }
        }
    });
}

并将此方法应用于我的文本字段

CreateFocusListenerForFields(MyTextField);

现在,当我运行代码时,它非常有用,只是想知道这是否正确,如果不正确,那么当您必须在数百个字段上设置对齐方式和焦点侦听器时,还有另一种方法吗?多谢您的建议。


问题答案:

再次,我的偏见是使用InputVerifier而不是FocusListener,仅是因为InputVerifier是较高级别的构造,并且在适用的情况下,使用它们代替较低级别(更接近金属)的构造对我来说总是更安全。

两者的一个示例:

import java.awt.Color;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.*;
import javax.swing.text.JTextComponent;

public class TestFieldVerification {
   public static final Color ERROR_COLOR = new Color(254,157,157);
   private static final int COLS = 8;
   private JPanel mainPanel = new JPanel();
   private JTextField verifiedField = new JTextField(COLS);
   private JTextField focusCheckedField = new JTextField(COLS);
   private Color defaultBackground = null;

   public TestFieldVerification() {
      verifiedField.setInputVerifier(new MyVerfier(this));
      focusCheckedField.addFocusListener(new MyFocusCheck(this));

      mainPanel.add(new JLabel("With InputVerfier:"));
      mainPanel.add(verifiedField);
      mainPanel.add(new JLabel("With FocusListener:"));
      mainPanel.add(focusCheckedField);
   }

   public boolean verifyText(String text) {
      try {
         Integer.parseInt(text);
         return true;
      } catch (NumberFormatException nfe) {
         return false;
      }
   }

   public void setFieldBackground(JComponent component, boolean verified) {
      if (defaultBackground == null) {
         defaultBackground = component.getBackground();
      }
      Color bg = verified ? defaultBackground : ERROR_COLOR;
      component.setBackground(bg);
   }

   public JComponent getMainPanel() {
      return mainPanel;
   }

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

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

class MyVerfier extends InputVerifier {
   private TestFieldVerification gui;

   public MyVerfier(TestFieldVerification gui) {
      this.gui = gui;
   }

   @Override
   public boolean shouldYieldFocus(JComponent input) {
      gui.setFieldBackground(input, super.shouldYieldFocus(input));
      return super.shouldYieldFocus(input);
   }

   @Override
   public boolean verify(JComponent input) {
      String text = ((JTextComponent) input).getText();
      return gui.verifyText(text);
   }

}

class MyFocusCheck extends FocusAdapter {
   private TestFieldVerification gui;

   public MyFocusCheck(TestFieldVerification gui) {
      this.gui = gui;
   }

   @Override
   public void focusLost(FocusEvent e) {
      JTextComponent textComp = (JTextComponent) e.getSource();
      String text = textComp.getText();
      boolean verified = gui.verifyText(text);
      gui.setFieldBackground(textComp, verified);
      if (!verified) {
         textComp.requestFocusInWindow();
      }
   }
}


 类似资料:
  • 我有一个现有的spring boot项目和一个数据库。现在,我想添加liquibase来处理进一步的数据库迁移。做这件事的正确步骤是什么? 我已经跟随本文添加liquibase并生成Changelog。我发现的大多数文章都在讨论从零开始在项目中使用liquibase,或者对实现并不太详细。到目前为止,我已经完成了以下工作: 在src/main/resources下添加了 更新了src/main/r

  • 问题内容: 在IntelliJ IDEA中创建新的Java项目时,将创建以下目录和文件: 我想配置IntelliJ IDEA,以将我的依赖项JAR包含到项目中。在IntelliJ IDEA中实现此目标的正确方法是什么? 问题答案: 在IntelliJ IDEA中添加外部jar的步骤: Click File from the toolbar Project Structure (CTRL + SHI

  • 问题内容: 我能够使用三个链接来组合一个简化的完整History.js示例,以从整个页面加载内容片段,而无需更新页面和更新浏览器历史记录。 这是相关的代码段- 完整的工作示例在此处http://jsfiddle.net/PT7qx/show 我想知道这是否正确。以前的版本可以使用#url绑定到事件。我没有看到使用此最新版本将事件绑定到url的任何示例,因此我使用了.on()click事件来调用Hi

  • 问题内容: 我以旧的方式使用Docker和卷容器: 但是现在我通过创建命名卷更改为新方法: 我将此新卷绑定到新的Jenkins容器。我只剩下一个文件夹,其中有我以前的jenkins容器的文件夹。(通过使用)现在,我要用该文件夹的内容填充新的命名卷。 我可以复制该文件夹的内容到吗? 问题答案: 您 可以 数据无疑直接复制到,但这样做你: 依靠对Docker主机的物理访问。如果您正在与远程docker

  • 我正试图在Android Studio项目中添加库,但我得到了一个错误: 错误:找不到名称为“default”的配置。 我所做的只是遵循堆栈溢出的教程和指南 null 图书馆链接

  • 我正在尝试将“{”文本“:”添加到字符串的开头,将“}”添加到字符串的结尾。 我一直在环顾四周,玩下面不同版本的游戏 甚至可以附加到扩展属性吗? 给我试图实现的目标添加更多信息 空的传递给