Java 使用UIManager更改JTextField的边框

Java 使用UIManager更改JTextField的边框,java,swing,Java,Swing,我想使用UIManager自定义项目中的所有jTextFields。它可以使用此代码来完成 UIManager.getDefaults().put("TextField.border", BorderFactory.createLineBorder(new java.awt.Color(0, 0, 255))); //Blue 但我喜欢在获得焦点时将文本字段的边框更改为红色,并将蓝色恢复为失去焦点时 BorderFactory.createLineBorder(new java.awt.Col

我想使用UIManager自定义项目中的所有jTextFields。它可以使用此代码来完成

UIManager.getDefaults().put("TextField.border", BorderFactory.createLineBorder(new java.awt.Color(0, 0, 255))); //Blue
但我喜欢在获得焦点时将文本字段的边框更改为红色,并将蓝色恢复为失去焦点时

BorderFactory.createLineBorder(new java.awt.Color(255, 0, 0))); //Red
是否可以不在每个文本字段的
focusagaind
FocusLost
事件中编码


我从Abra的答案中得到了这个UIManger代码,根据聚焦状态改变边框颜色有点复杂。对于这种情况,您必须提供一个新的UI类,该类提供边界更改。此类取决于您当前使用的UI。以下是一个例子:

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import javax.swing.border.LineBorder;
import javax.swing.plaf.BorderUIResource;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.UIResource;
import javax.swing.plaf.metal.MetalTextFieldUI;

/**
 * <code>FocusBorder</code>.
 */
public class FocusBorder {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(FocusBorder::startUp);
    }

    private static void startUp() {
        UIManager.put("TextFieldUI", ExMetalTextFieldUI.class.getName());
        JPanel mainPanel = new JPanel(new GridLayout(2, 2, 10, 10));
        for (int i = 0; i < 4; i++) {
            mainPanel.add(new JTextField(10));
        }
        JFrame frm = new JFrame();
        frm.add(mainPanel);
        frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frm.pack();
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    public static class ExMetalTextFieldUI extends MetalTextFieldUI {
        private JTextField field;

        public static ComponentUI createUI(JComponent c) {
            return new ExMetalTextFieldUI();
        }

        @Override
        public void installUI(JComponent c) {
            field = (JTextField) c;
            super.installUI(c);
            updateBorder(false);
            c.addFocusListener(new FocusListener() {

                @Override
                public void focusLost(FocusEvent e) {
                    updateBorder(false);
                }

                @Override
                public void focusGained(FocusEvent e) {
                    updateBorder(true);
                }
            });
        }

        private void updateBorder(boolean gained) {
            if (field.getBorder() instanceof UIResource) {
                Color c = gained ? Color.RED : Color.BLACK;
                field.setBorder(new BorderUIResource(new LineBorder(c)));
            }
        }
    }
}

根据聚焦状态改变边框颜色有点复杂。对于这种情况,您必须提供一个新的UI类,该类提供边界更改。此类取决于您当前使用的UI。以下是一个例子:

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import javax.swing.border.LineBorder;
import javax.swing.plaf.BorderUIResource;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.UIResource;
import javax.swing.plaf.metal.MetalTextFieldUI;

/**
 * <code>FocusBorder</code>.
 */
public class FocusBorder {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(FocusBorder::startUp);
    }

    private static void startUp() {
        UIManager.put("TextFieldUI", ExMetalTextFieldUI.class.getName());
        JPanel mainPanel = new JPanel(new GridLayout(2, 2, 10, 10));
        for (int i = 0; i < 4; i++) {
            mainPanel.add(new JTextField(10));
        }
        JFrame frm = new JFrame();
        frm.add(mainPanel);
        frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frm.pack();
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    public static class ExMetalTextFieldUI extends MetalTextFieldUI {
        private JTextField field;

        public static ComponentUI createUI(JComponent c) {
            return new ExMetalTextFieldUI();
        }

        @Override
        public void installUI(JComponent c) {
            field = (JTextField) c;
            super.installUI(c);
            updateBorder(false);
            c.addFocusListener(new FocusListener() {

                @Override
                public void focusLost(FocusEvent e) {
                    updateBorder(false);
                }

                @Override
                public void focusGained(FocusEvent e) {
                    updateBorder(true);
                }
            });
        }

        private void updateBorder(boolean gained) {
            if (field.getBorder() instanceof UIResource) {
                Color c = gained ? Color.RED : Color.BLACK;
                field.setBorder(new BorderUIResource(new LineBorder(c)));
            }
        }
    }
}