我想更改JSpinner的行为,以便在单击文本时将其选中。这样可以更轻松地将字段替换为所需的值。不幸的是,我无法使该行为起作用,它只是将光标插入文本中,而没有选择已经存在的内容。
我曾尝试通过既向JSpinner本身又向文本区域本身添加了一个焦点侦听器((DefaultEditor) this.getEditor()).getTextField()
,但这些似乎都没有达到预期的效果。我的代码(针对JSpinner本身)如下:
spinner.addFocusListener(new FocusAdapter(){
@Override
public void focusGained(FocusEvent e) {
((DefaultEditor) ((JSpinner) e.getSource()).getEditor()).getTextField().selectAll();
}
});
我不确定是什么问题。如果有关系,我正在运行Mac OS 10.7.5和Java 6u43。
编辑:我System.out.println
在focusGained方法的开头放了一个权利,发现它从未被调用过。因此,似乎专注于JSpinner并未注册。再次,我尝试将focusAdpater放在微调器和文本字段上(尽管不是同时)。
您面临的许多问题与在焦点事件(以及其他一些状态事件)发生后,旋转器如何验证旋转器中的任何值有关,这将避免突出显示。
MacOS甚至更糟。
我最终要做的是启动一个Thread
等待了很短时间(大约25毫秒)的代码,然后用来SwingUtilities.invokeLater
实际执行选择…
用示例更新
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.JTextComponent;
public class AutoFocusSpinner {
public static void main(String[] args) {
new AutoFocusSpinner();
}
public static final SelectOnFocusGainedHandler SHARED_INSTANCE = new SelectOnFocusGainedHandler();
public AutoFocusSpinner() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JSpinner spinner = new JSpinner(new SpinnerNumberModel(1, 0, 100, 1));
installFocusListener(spinner);
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
frame.add(spinner);
frame.add(new JButton("Here for testing"));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public void installFocusListener(JSpinner spinner) {
JComponent spinnerEditor = spinner.getEditor();
if (spinnerEditor != null) {
// This is me spending a few days trying to make this work and
// eventually throwing a hissy fit and just grabbing all the
// JTextComponent components contained within the editor....
List<JTextComponent> lstChildren = findAllChildren(spinner, JTextComponent.class);
if (lstChildren != null && lstChildren.size() > 0) {
JTextComponent editor = lstChildren.get(0);
editor.addFocusListener(SHARED_INSTANCE);
}
}
}
public static <T extends Component> List<T> findAllChildren(JComponent component, Class<T> clazz) {
List<T> lstChildren = new ArrayList<T>(5);
for (Component comp : component.getComponents()) {
if (clazz.isInstance(comp)) {
lstChildren.add((T) comp);
} else if (comp instanceof JComponent) {
lstChildren.addAll(findAllChildren((JComponent) comp, clazz));
}
}
return Collections.unmodifiableList(lstChildren);
}
public static class SelectOnFocusGainedHandler extends FocusAdapter {
@Override
public void focusGained(FocusEvent e) {
Component comp = e.getComponent();
if (comp instanceof JTextComponent) {
final JTextComponent textComponent = (JTextComponent) comp;
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(25);
} catch (InterruptedException ex) {
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
textComponent.selectAll();
}
});
}
}).start();
}
}
}
}
Now, right about now, I’m praying for some really nice, simple, undocumented
property that we can set that will mean we don’t need to do all this :P
问题内容: 我有文字输入。当输入获得焦点时,我想选择输入内的文本。 使用jQuery,我可以这样: 我四处搜寻以尝试找到Angular方式,但是我发现的大多数示例都在处理一个指令,该指令正在监视模式属性的更改。我假设我需要一个指令来监视接收焦点的输入。我该怎么办? 问题答案: 在Angular中执行此操作的方法是创建一个自定义指令,该指令会为您自动选择。 应用如下指令: Update1 :删除了j
问题内容: 单击复选框时,是否有一种更干净的方法将焦点委派给元素。这是我入侵的肮脏版本: 的HTML 的JavaScript JSFiddle:http : //jsfiddle.net/U4jvE/8/ 问题答案: 这个怎么样 ?矮人 @asgoth和@Mark Rajcok是正确的。我们应该使用指令。我只是懒惰。 这是指令版本。plunker我觉得一个好的理由将其作为指令是可以重用这件事。 因
我希望enter键的作用类似于JTable上的tab键。我知道这个问题已经问过几次了,我使用了本页中找到的解决方案:使用Enter键就像JTable上的Tab键一样。 因此,当我按下tab键时,下一个单元格被聚焦,其中的文本被选中,但当我键入enter键时,第一次单元格松开焦点,第二次enter键时,下一个单元格获得焦点,其中的文本被选中。 所以我的问题是:有没有一种方法可以让第一个从单元格中输入
另外,我想请求关注textArea,每次用户打开/关闭选项卡,并在选项卡之间切换(使用鼠标和键盘热键)。 这不起作用。我尝试了tab.getContent().requestFocus()-也不起作用。 关于当TabPane child处于焦点时更改选项卡:TabPane似乎得到了KeyEvent,但因为它不在焦点中(textArea处于焦点中),它只是跳过了这个事件。也许我可以通过在TabPan
我想得到一个文本字段,每当我点击/点击/聚焦该字段时,它可以选择该字段中当前的全部文本。我自己也在其他React应用程序中使用了一个执行,但这种方法似乎不适用于材质UI。使用Material UI TextFields,我可以看到所选内容简短地覆盖了全文,然后返回到文本末尾闪烁的光标。 你知道怎么做吗?
在C#windows应用程序中,要导航窗体的所有控件(使用Enter键),我使用以下代码: 任何人请帮帮我。