这是一个很老的问题,但我需要它,这为我解决了它。
请注意:此解决方案假定不使用 i18n。如果您启用了 i18n 函数,请查看 javax.swing.plaf.basic.BasicTextFieldUI.create(Element) 以找到正确的类。
您可以自定义 FieldView 中的垂直文本位置:
public static class MyTextfieldUI extends com.sun.java.swing.plaf.windows.WindowsTextFieldUI /* TODO which UI class is really used? */ {
public static ComponentUI createUI(JComponent c) {
return new MyTextfieldUI();
}
@Override
public View create(Element elem) {
return new FieldView(elem) {
@Override
protected Shape adjustAllocation(final Shape shape) {
if (shape instanceof Rectangle) {
final Rectangle result = (Rectangle) super.adjustAllocation(shape);
/* set vertical text position to top */
result.y = ((Rectangle) shape).y;
return result;
}
return super.adjustAllocation(shape);
}
};
}
}
public class Test extends JPanel {
private Test() {
super(new BorderLayout());
final JTextField northField = new JTextField();
northField.setBackground(Color.YELLOW);
northField.setText("north");
final JTextField eastField = new JTextField();
eastField.setBackground(Color.GREEN);
eastField.setText("east");
eastField.setPreferredSize(new Dimension(200, -1));
final JTextField centerField = new JTextField();
centerField.setBackground(Color.CYAN);
centerField.setText("center");
centerField.setHorizontalAlignment(SwingConstants.CENTER);
final JTextField westField = new JTextField();
westField.setBackground(Color.GRAY);
westField.setText("west");
westField.setHorizontalAlignment(SwingConstants.RIGHT);
westField.setPreferredSize(new Dimension(200, -1));
final JTextField southField = new JTextField();
southField.setBackground(Color.MAGENTA);
southField.setText("south");
southField.setHorizontalAlignment(SwingConstants.RIGHT);
add(northField, BorderLayout.NORTH);
add(eastField, BorderLayout.EAST);
add(centerField, BorderLayout.CENTER);
add(westField, BorderLayout.WEST);
add(southField, BorderLayout.SOUTH);
}
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
/* Set custom look and feel for all text fields */
UIManager.put("TextFieldUI", MyTextfieldUI.class.getName());
final JFrame frame = new JFrame("TextDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Test());
frame.setSize(800, 500);
frame.setVisible(true);
}
}