首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当Java/Swing控件获得焦点时,是否有一种简单的方法来更改它的行为?

当Java/Swing控件获得焦点时,是否有一种简单的方法来更改它的行为?
EN

Stack Overflow用户
提问于 2018-10-09 03:06:00
回答 2查看 0关注 0票数 0

对于我使用过的大多数GUI,当包含文本的控件获得焦点时,将选择控件的全部内容。这意味着如果刚开始输入,则完全替换以前的内容。

示例:具有使用零值初始化的旋转控件。选中它并键入“1”控件中的值现在为1。

使用Swing,这不会发生。未选择控件中的文本,克拉显示在现有文本的一端或另一端。继续上面的例子:

使用Swing JSpinner,当您选择旋转控件时,克拉位于左侧。键入“1”,控件中的值现在为10。

这让我,(和我的用户)走上了墙,我想改变它。更重要的是,我想全局更改它,因此新行为适用于JTextField,JPasswordField,JFormattedTextField,JTextArea,JComboBox,JSpinner等。我发现这样做的唯一方法是将FocusAdapter添加到每个控件并覆盖focusGained()方法来做正确的事[tm]。

必须有一种更简单,更不易碎的方式。请?

编辑:此特定案例的另一条信息。我正在使用的表单是使用Idea的表单设计器生成的。这意味着我通常不会编写代码来创建组件。有可能告诉Idea你想自己创建它们,但这是一个我想避免的麻烦。

EN

回答 2

Stack Overflow用户

发布于 2018-10-09 11:09:36

当我过去需要这个时,我已经创建了我想要添加“自动清除”功能的组件的子类。例如:

代码语言:javascript
复制
public class AutoClearingTextField extends JTextField {
   final FocusListener AUTO_CLEARING_LISTENER = new FocusListener(){
      @Override
      public void focusLost(FocusEvent e) {
         //onFocusLost(e);
      }

      @Override
      public void focusGained(FocusEvent e) {
         selectAll();
      }
   };

   public AutoClearingTextField(String string) {
      super(string);
      addListener();
   }

   private void addListener() {
      addFocusListener(AUTO_CLEARING_LISTENER);      
   }
}

最大的问题是我没有找到一个“好”的方法来获得所有标准构造函数而不编写覆盖。添加它们,并强制调用addListener是我发现的最常用的方法。

另一种选择是在具有ContainerListeer的顶级容器上监视ContainerEvents以检测新窗口小部件的存在,并根据已添加的窗口小部件添加相应的焦点侦听器。(例如:如果容器事件是由添加TextField引起的,则添加一个知道如何选择TextField中所有文本的焦点侦听器,依此类推。)如果添加了Container,则需要递归添加ContainerListener到那个新的子容器。

无论哪种方式,您都不需要在实际的UI代码中使用焦点侦听器 - 它将在更高级别处理。

票数 0
EN

Stack Overflow用户

发布于 2018-10-09 12:30:35

我自己没有试过这个(前面只涉及它),但你可以通过使用:KeyboardFocusManager(有一个静态方法getCurrentKeyboardFocusManager())向它添加一个PropertyChangeListener来获取当前聚焦的组件。从那里可以找出组件是否是JTextComponent并选择所有文本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档