对于我使用过的大多数 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/