Java 使用UIManager更改JTextField的边框
我想使用UIManager自定义项目中的所有jTextFields。它可以使用此代码来完成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.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)));
}
}
}
}