Java 如何使JSpinner对象突出显示其全部内容,以便在获得焦点时不需要删除用户输入?
标题问题没什么可补充的 以下是切换到第一个框的情况,光标位于字段中的第一个字符之前,因此,如果用户希望输入自己的月、日或年数,则必须删除该字符: 这是我想要的,当该字段被标记为(或以其他方式选择)时,用户不必删除显示的字符,如果他希望输入自己的年份,等等: 我可以为Java 如何使JSpinner对象突出显示其全部内容,以便在获得焦点时不需要删除用户输入?,java,user-interface,jspinner,Java,User Interface,Jspinner,标题问题没什么可补充的 以下是切换到第一个框的情况,光标位于字段中的第一个字符之前,因此,如果用户希望输入自己的月、日或年数,则必须删除该字符: 这是我想要的,当该字段被标记为(或以其他方式选择)时,用户不必删除显示的字符,如果他希望输入自己的年份,等等: 我可以为JTextField这样做,例如: txtDateFrom.select(0,99); 但是.select()不是JSpinner的方法 (我意识到这提出了一个问题,“为什么要使用微调器?”但显而易见的答案是,我希望两种选择方法
JTextField
这样做,例如:
txtDateFrom.select(0,99);
但是.select()
不是JSpinner
的方法
(我意识到这提出了一个问题,“为什么要使用微调器?”但显而易见的答案是,我希望两种选择方法都可用,这在设计中很常见。)
(一个不那么紧迫但相关的问题……我制作了一个名为
years
的100年日期的整数数组,并使用SpinnerListModel(years)
因为当使用SpinnerNumberModel
时,一年将显示为2014年。我可以接受我所做的事情,但有没有一种更简单的方法?没有一种方法包含“格式”,我可以找到这种方法。)这在Java 1.7.0\u 51、Windows和Linux中工作。我没有能力在OSX中测试它
JSpinner.DefaultEditor editor =
(JSpinner.DefaultEditor) spinner.getEditor();
editor.getTextField().addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent event) {
final JTextField textField = (JTextField) event.getComponent();
EventQueue.invokeLater(new Runnable() {
public void run() {
EventQueue.invokeLater(new Runnable() {
public void run() {
textField.selectAll();
}
});
}
});
}
});
旁注:您是否考虑过用这样一个JSpinner替换三个JSpinner
JSpinner spinner = new JSpinner(new SpinnerDateModel());
spinner.setEditor(new JSpinner.DateEditor(spinner, "MM/dd/yyyy"));
上/下箭头按钮(和箭头键)将更改包含文本光标的任何字段
它不会解决您的焦点问题,但您可能会认为该问题不是问题。如果我使用已初始化为例如
01/18/2014
的JTextField
,Java使双击“mm”或“dd”或“yyyy”变得非常用户友好mm/dd/yyyy字段的一部分突出显示该部分,以便用户输入内容覆盖选择内容而无需删除,例如01/18
/2014。如果我的问题没有相对容易的解决方法,我可能会回复到上面的问题。我认为你的问题在这个可能的副本中得到了很好的描述。还有一个解决方案可能对您有效。@HovercraftFullOfEels——您认为这是一个重复的解决方案是对的。链接上的建议是危险的,很难遵循,所以我必须更仔细地研究它们。对于这样一个共同的需求,似乎要经历很多。我可能会接受VGR的两行注释,因为它使我的3-spinner方法看起来很幼稚,而且很容易按原样实现。DSlomer:VGR的建议与我提供的链接中Rob Camick的建议(camickr)没有什么不同,Rob的回答提供了比VGR更多的信息。昨天我本可以发布同样的内容,但我想为什么要重复已经发布的内容呢?这两个建议的问题是,虽然它们似乎适用于Windows平台,但它们不适用于大多数Mac电脑,这就是为什么程序员增加了额外延迟的原因。如果需要的话,Swing定时器也可以提供类似的延迟。如果我发布了链接中已经存在的内容,我深表歉意。我通读了一遍,看到了使用单个invokeLater的建议,看到了使用启发式延迟的建议,但实际上我没有看到任何使用两个invokeLater调用(一个在另一个内部)的建议。我很想知道双调用器方法在OS X中是否有效。@VGR——我是编辑新手,所以我需要做一些搜索和阅读,但我计划尝试一下你的两行“旁注”。谢谢。没花多长时间——我比我的3个纺纱机更喜欢它!多谢。我仍然需要阅读关于.setEditor等的内容。我昨晚在一篇文章中找到了它,但是这个示例没有两行,所以我推迟了。你的两行是天赐之物。我对得到null指针异常感到失望,但松了一口气,因为它很容易修复:spinner.setValue(newdate())代码>。。。这将今天的日期作为默认微调器值:01/20/2014#,其中“#”是微调器的上下对象。想象一下,我花了太多时间才意识到,在“MM/dd/yyyy”格式字符串中,大小写很重要,这让我感到惊讶!简而言之,“mm”代表分钟。除了我那愚蠢的举动,我喜欢你的“旁注”,因为它已经成为我的主注!太干净了!多谢!