设置自定义边框时如何保持 JComponent 的突出显示边框
我有一个 JTextField,在其中设置了一些自定义属性:
nameField.setPreferredSize(new Dimension(275,40));
nameField.setBackground(bgColor);
nameField.setForeground(txtColor);
nameField.setFont(new Font("HelveticaNeue",Font.PLAIN,22));
nameField.setBorder(BorderFactory.createLineBorder(Color.WHITE, 2));
当组件获得焦点时,该字段周围不会显示突出显示。在 Mac 上,它通常是一个蓝色发光矩形,表示该组件具有焦点。
如果我注释掉 nameField.setBorder(...),突出显示就会重新出现。如何保留突出显示以及我的自定义边框!?
基本上,我只想在组件获得焦点时显示突出显示边框,在组件未获得焦点时显示无边框。
请注意,原始边框的类型为 com.apple.laf.AquaTextFieldBorder
。
I have a JTextField, where I've set some custom properties:
nameField.setPreferredSize(new Dimension(275,40));
nameField.setBackground(bgColor);
nameField.setForeground(txtColor);
nameField.setFont(new Font("HelveticaNeue",Font.PLAIN,22));
nameField.setBorder(BorderFactory.createLineBorder(Color.WHITE, 2));
When the component has focus, there is no highlight shown around the field. On a Mac, it is usually a blue glowing rectangle, indicating that this component has focus.
If I comment out the nameField.setBorder(...), the highlight reappears. How do I keep the highlight, but also my custom border!?
Basically, I just want the highlight-border to show when the component has focus, and no border when the component is unfocused.
Note that the original border is of type com.apple.laf.AquaTextFieldBorder
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您需要使用 FocusListener。首先您需要保存当前的边框。然后在 focusLost 上将 Border 设置为 null,在 focusGained 上使用保存的 Border。
或者您可以使用 UIManager 获取组件的默认边框。
The you need need to use a FocusListener. First you need to save the current Border. Then on focusLost you set the Border to null and on focusGained you use the saved Border.
Or you can get the default Border for the component by using the UIManager.
您也许可以使用CompoundBorder 来做到这一点。
在 Windows 下,使用 Nimbus 的外观和感觉我可以重现该问题。
我可以使用以下代码显示两个边框:
You might be able to do this with a CompoundBorder.
Under Windows with the Nimbus look and feel I can reproduce the problem.
I can get both borders to display with the following code: