java - 有没有一种简单的方法可以在获得焦点时更改 Java/Swing 控件的行为?

标签 java user-interface swing

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

示例:您有一个初始化为零的旋转控件。您切换到它并键入“1”控件中的值现在是 1。

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

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

这让我(和我的用户)难以为继,我想改变它。更重要的是,我想全局更改它,以便新行为适用于 JTextField、JPasswordField、JFormattedTextField、JTextArea、JComboBox、JSpinner 等。我发现这样做的唯一方法是向每个控件添加一个 FocusAdapter 并覆盖 focusGained() 方法以做正确的事 [tm]。

必须有一种更简单、更不脆弱的方法。请问?

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

座右铭:所有优秀的程序员基本上都是懒惰的。

最佳答案

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

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 以检测是否存在新的小部件,并根据已添加的小部件添加相应的焦点监听器。 (eg:如果container事件是由添加TextField引起的,那么添加一个知道如何选择TextField中所有文本的焦点监听器,等等。)如果添加了Container,则需要递归添加ContainerListener以及那个新的子容器。

无论哪种方式,您都不需要在实际的 UI 代码中处理焦点监听器——所有这些都将在更高级别得到处理。

关于java - 有没有一种简单的方法可以在获得焦点时更改 Java/Swing 控件的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66455/

相关文章:

java - 在 Swing 中更新 JLabel 中的图像图标?使用 revalidate() 和 repaint() 但不起作用

java - 面板为什么不绘制(paint)?

java - JPanel 可能重叠?

java - 转换 Query.getResultList() 的输出

java:写入xml文件

c# - 使用 PowerShell 和模块化 GUI 吗?

iphone - 提醒应用程序 UI 是如何创建的?

java - 所有的动态绑定(bind)都是一种多态吗?

Java 数组声明困惑

user-interface - 为 GDB 编写前端