[英]JTextField - Reset Border to System Default
我正在尝试将JTextField
的Border
颜色设置为红色,然后稍后将其更改回“正常”状态。 当我使用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.