es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de personalización de JTextField

He creado un marco y colocado un botón y un campo de texto en él. Estoy usando el método setMargin para establecer un margen entre el cursor y el borde del campo de texto y funciona perfectamente bien hasta que agrego un borde a él.

Después de agregar el borde, el método de llamada setMargin no funciona.

¿Podrías ayudarme a entender el origen del problema y encontrar una alternativa para tener tanto un borde como un margen determinado?

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("nombre");
        //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("enviar");
        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);
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el método setMargin que no funciona después de agregar un borde al campo de texto se debe al hecho de que el borde en sí tiene su propio padding/margin que está sobrescribiendo el margen establecido por el método setMargin.

    Para tener tanto un borde como un margen específico, puedes usar un CompoundBorder para combinar el borde deseado con un EmptyBorder que tenga el margen deseado. Por ejemplo, reemplaza la línea //textfield0.setBorder(border9); con lo siguiente:

    textfield0.setBorder(BorderFactory.createCompoundBorder(border7, BorderFactory.createEmptyBorder(0, 7, 0, 5)));
    

    Esto crea un borde compuesto con el borde de guiones deseado border7 y un borde vacío con el margen deseado de 7 píxeles en el lado izquierdo y 5 píxeles en el lado derecho.

    Con este cambio, deberías poder tener tanto el borde como el margen deseado en el campo de texto.

Comments are closed.