对于我使用过的大多数GUI,当包含文本的控件获得焦点时,将选择控件的全部内容。这意味着如果刚开始输入,则完全替换以前的内容。
示例:具有使用零值初始化的旋转控件。选中它并键入“1”控件中的值现在为1。
使用Swing,这不会发生。未选择控件中的文本,克拉显示在现有文本的一端或另一端。继续上面的例子:
使用Swing JSpinner,当您选择旋转控件时,克拉位于左侧。键入“1”,控件中的值现在为10。
这让我,(和我的用户)走上了墙,我想改变它。更重要的是,我想全局更改它,因此新行为适用于JTextField,JPasswordField,JFormattedTextField,JTextArea,JComboBox,JSpinner等。我发现这样做的唯一方法是将FocusAdapter添加到每个控件并覆盖focusGained()方法来做正确的事[tm]。
必须有一种更简单,更不易碎的方式。请?
编辑:此特定案例的另一条信息。我正在使用的表单是使用Idea的表单设计器生成的。这意味着我通常不会编写代码来创建组件。有可能告诉Idea你想自己创建它们,但这是一个我想避免的麻烦。
发布于 2018-10-09 11:09:36
当我过去需要这个时,我已经创建了我想要添加“自动清除”功能的组件的子类。例如:
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代码中使用焦点侦听器 - 它将在更高级别处理。
发布于 2018-10-09 12:30:35
我自己没有试过这个(前面只涉及它),但你可以通过使用:KeyboardFocusManager(有一个静态方法getCurrentKeyboardFocusManager())向它添加一个PropertyChangeListener来获取当前聚焦的组件。从那里可以找出组件是否是JTextComponent并选择所有文本。
https://stackoverflow.com/questions/-100000832
复制相似问题