繁体   English   中英

JTextField-将边框重置为系统默认值

[英]JTextField - Reset Border to System Default

我正在尝试将JTextFieldBorder颜色设置为红色,然后稍后将其更改回“正常”状态。 当我使用Linux(Ubuntu的另外),初始Border从不同的Border ,你通过得到UIManager.getBorder("TextField.border"); 其中一个是SynthBorder ,另一个是FieldBorder “正确”的将是SynthBorder

SSCCE:

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Main
{
  private static boolean switched;

  public static void main( final String[] args )
      throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException
  {
    UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );

    JFrame frame = new JFrame( "Test border change" );
    frame.getContentPane().setLayout( new BoxLayout( frame.getContentPane(), BoxLayout.LINE_AXIS ) );
    JTextField tf = new JTextField();
    JButton button = new JButton( "Switch" );
    button.addActionListener( action ->
    {
      if ( switched )
      {
        tf.setBorder( UIManager.getBorder( "TextField.border" ) );
        switched = !switched;
      }
      else
      {
        tf.setBorder( BorderFactory.createLineBorder( Color.RED ) );
        switched = !switched;
      }
    } );
    frame.getContentPane().add( tf );
    frame.getContentPane().add( button );
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame.pack();
    frame.setVisible( true );
  }
}

我已经尝试过:

  • 使用JComponent.updateUI() (无效)
  • 使边框无效(破坏布局)
  • 保存(不正确的方法)

有谁有更好的主意吗?

当您更换边框时,请尝试使用:

Border uiBorder = BorderUIResource( BorderFactory.createLineBorder( Color.RED ) );
tf.setBorder( uiBorder );

当您将任何包装器类与“ UIResource”一起使用时,这会告诉LAF该组件是LAF的一部分,而不是自定义实现

然后恢复边框:

SwingUtilities.updateComponentTreeUI( tf );

希望这会伪造UI来重置LAF属性,特别是Border。

阅读Swing教程中有关如何设置LAF的部分, 获取更多信息。

当然,这不如简单地保存Border updatComponentTreeUI(...)设边框那样有效,因为updatComponentTreeUI(...)将更新文本字段的所有属性(如果updatComponentTreeUI(...) )。

仍然不明白为什么您不能保存边界。 您可以使用JComponent类的putClientProperty(...)方法保存Border,然后使用getClientProperty(...)方法将其还原。

您甚至可以通过添加PropertyChangeListener来监听边框的变化,从而实现自动化。 如果getClientProperty(...)返回null时生成事件,则可以保存PropertyChangeEvent的旧值。

您可以使用以下代码在UIManager获取默认边框

jTextField2.setBorder(UIManager.getLookAndFeel().getDefaults().getBorder("TextField.border"));
yourJTextField.setBorder(new JTextField().getBorder());

您可以在创建要保存的组件后立即获得边框,然后稍后再进行设置。

Border defaultBorder = tf.getBorder();
...
tf.setBorder(defaultBorder);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM