2017-04-18 67 views
0

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

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()(无效果)
  • 归零边界(遗址的布局)
  • 保留它(不正确的方式)

希望任何人有更好的主意。

认为马塞尔

+0

可能重复[重置/删除边框在Swing](http://stackoverflow.com/questions/726808/reset-remove-a-border-in-swing) – Berger

+0

我已经尝试过,工作正常该示例,但由于事件而在生产用例中抛出异常。尽管如此,我可能会仔细考虑一下。 – ScriptKiddy

+1

对上述链接中的答案的一个评论建议在调用'updateUI()'之前调用'setBorder(null)'。 – Berger

回答

2

当您更换边境尝试使用:

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

我将保留使用put/getClientProperty方法。此外,uodateComponentTreeUI运行良好,但保存更好地适合我的情况; D – ScriptKiddy

0

您可以创建保存它的成分之后得到的边界,后来又再次设定。

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

保留不是一个选项; D – ScriptKiddy

+0

@ScriptKiddy,“保留不是一个选项” - 为什么不呢? – camickr

相关问题