• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

java 来源:ScriptKiddy 13次浏览

我正在尝试着色为JTextField红色的Border,然后稍后将其更改回“正常”。当我使用Linux(另外Ubuntu)时,最初的BorderBorder不同,你使用UIManager.getBorder("TextField.border");得到的其中之一是SynthBorder,另一个是FieldBorder。 “正确的”将是SynthBorder。JTextField – 将边框重置为系统默认值

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属性,特别是边界。

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

当然,这不如保存边框并重置它,因为文本字段的所有属性将被updatComponentTreeUI(...)更新(如果可以的话)。

还是看不出为什么你不能保存边框。您可以使用JComponent类的putClientProperty(...)方法保存边界,然后使用getClientProperty(...)方法恢复它。

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


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)