我正在尝试为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 );
}
}
(无效果)有没有人有更好的主意?
答案 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