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

时间:2017-04-18 15:11:44

标签: java linux swing user-interface border

我正在尝试为Border红色的JTextField着色,然后将其更改为" normal"稍后的。当我使用Linux(还有Ubuntu)时,初始Border与使用Border获得的UIManager.getBorder("TextField.border");不同,其中一个是SynthBorder,一个是{ {1}}。 "正确"一个是FieldBorder

SSCCE:

SynthBorder

我已经尝试过了:

  • 使用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 ); } } (无效果)
  • 使边框归零(废弃布局)
  • 保留它(不是正确的方式)

有没有人有更好的主意?

4 个答案:

答案 0 :(得分:2)

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

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

当你使用任何带有“UIResource”的包装类时,这告诉LAF组件是LAF的一部分而不是自定义实现

然后恢复边框:

SwingUtilities.updateComponentTreeUI( tf );

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

阅读How to Set the LAF上的Swing教程中的部分以获取更多信息。

当然,这不如简单地保存边框并重置它一样有效,因为文本字段的所有属性都将由updatComponentTreeUI(...)更新(如果这样做)。

仍然不明白为什么你无法保存边境。您可以使用putClientProperty(...)类的JComponent方法保存边框,然后使用getClientProperty(...)方法将其恢复。

您甚至可以通过添加PropertyChangeListener来监听边框中的更改来自动执行此操作。如果getClientProperty(...)返回null,则会生成事件,然后您从PropertyChangeEvent保存旧值。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

yourJTextField.setBorder(new JTextField().getBorder());

答案 3 :(得分:0)

您可以在创建组件后立即获取边框以进行保存,然后再重新设置。

Activity