JTextField 自定义问题

JTextField customization issue

我制作了一个框架并在其中放置了一个按钮和一个文本字段。 我正在使用 setMargin 方法在插入符号和文本字段的边框之间设置边距,并且在我为其添加边框之前工作得很好。

添加边框后 setMargin 调用方法不起作用。

能否请您帮助我了解问题的根源并找到同时具有边框和一定边距的替代方案?

public class main extends JFrame  {

    public static void main(String[]args){
        JTextField textfield0;
        JButton button0;
        
        Border border7=BorderFactory.createDashedBorder(new Color(0xA524FF), 2, 5, 4, true);
        Border border8=BorderFactory.createCompoundBorder();
        Border border01=BorderFactory.createLineBorder(Color.RED);
        Border border02=BorderFactory.createLineBorder(Color.YELLOW);
        Border border9=BorderFactory.createCompoundBorder(border01, border02);
        
        textfield0=new JTextField();
        textfield0.setPreferredSize(new Dimension(300,30));
        textfield0.setFont(new Font("Consolas",Font.BOLD,15));
        textfield0.setCaretColor(Color.RED);
        textfield0.setBackground(Color.CYAN);
        textfield0.setForeground(Color.MAGENTA);
        textfield0.setText("name");
        //textfield0.setBorder(border9);
        textfield0.setSelectedTextColor(Color.YELLOW);
        textfield0.setMargin(new Insets(0,7,0,5));
        textfield0.setCaretPosition(0);
        textfield0.setSelectionColor(Color.PINK);

        button0=new JButton();
        button0.setText("submit");
        button0.setPreferredSize(new Dimension(100,30));    
        button0.setFocusable(false);
        button0.setBackground(textfield0.getBackground());
        button0.setFont(textfield0.getFont());
        button0.setBorder(textfield0.getBorder());
        
        JFrame frame00=new JFrame();
        frame00.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame00.setLayout(new FlowLayout()); 
        frame00.add(button0);
        frame00.add(textfield0);
        frame00.pack();
        frame00.setVisible(true);
    }
}

如果您阅读 Border 的 javadoc,它指出:“使用 EmptyBorder 创建普通边框(此机制取代了其前身 setInsets)”

因此,您可以将 CompoundBorder 与 PlainBorder 以及您正在设置的那个一起使用,或者覆盖现有 Border 上的 getBorderInsets(Component c)

我们可以在 JavaDoc 中找到答案,这需要一些额外的步骤:

Sets margin space between the text component's border and its text. The text component's default Border object will use this value to create the proper margin. However, if a non-default border is set on the text component, it is that Border object's responsibility to create the appropriate margin space (else this property will effectively be ignored).

来源:https://docs.oracle.com/javase/8/docs/api/javax/swing/text/JTextComponent.html#setMargin-java.awt.Insets-

要完成上述操作,我们可以做以下两件事之一,我们可以使用复合边框,如下所示:Java Swing - setting margins on TextArea with Line Border 或者我们可以采取以下步骤:

Overriding both AbstractBorder.getBorderInsets(Component c) and AbstractBorder.getBorderInsets(Component c, Insets insets) to provide the correct insets

来源:https://docs.oracle.com/javase/tutorial/uiswing/components/border.html#custom

我强烈建议通读以上 link 以更好地理解边界以及如何使用它们。