Java 设置自定义边框时,如何保持JComponent的高亮边框

Java 设置自定义边框时,如何保持JComponent的高亮边框,java,focus,border,highlight,jcomponent,Java,Focus,Border,Highlight,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.createL

我有一个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.setboorder(…),突出显示将重新出现。如何保持高光和自定义边框

基本上,我只想在组件有焦点时显示高亮边框,而在组件未聚焦时不显示边框

请注意,原始边框的类型为
com.apple.laf.AquaTextFieldBorder

基本上,我只想要 高亮显示边框以显示 组件有焦点,没有边框 当组件未聚焦时

您需要使用FocusListener。首先,您需要保存当前边框。然后在focusLost上将边框设置为null,在FocusGoven上使用保存的边框


或者,您可以使用UIManager获取组件的默认边框。

您可以使用CompoundBorder来实现这一点

在Windows下,使用Nimbus的外观和感觉,我可以重现问题。 我可以使用以下代码显示两个边框:

  Border lineBorder = BorderFactory.createLineBorder(Color.WHITE, 2);
  Border originalBorder = nameField.getBorder();
  CompoundBorder compoundBorder = new CompoundBorder(lineBorder, originalBorder);
  nameField.setBorder(compoundBorder);

你的两个答案在某种程度上都有效。但有一个问题。原始边框似乎是一个复合边框,突出显示为外层,白色1px线边框为内层。我不要内边框!注意:我在OSX上安装过,原始边框的类型实际上是com.apple.laf.AquaTextFieldBorder