Java Swing закругленная граница для Jtextfield - PullRequest
4 голосов
/ 15 декабря 2011

Когда я делаю:

LineBorder lineBorder =new LineBorder(Color.white, 8, true);
jTextField2.setBorder(lineBorder );

Я получаю такой результат как:

enter image description here

Как я могу иметь закругленные границы без видимых прямоугольных углов и наполовину вырезанного текста?

Большое спасибо.

С наилучшими пожеланиями

Ответы [ 4 ]

13 голосов
/ 15 декабря 2011

Вы можете переопределить JTextFiled построить свой собственный Закругленный угол JTextField.Вы должны переопределить методы paintComponent(), paintBorder() и contains().Вам нужно нарисовать roundRect как форму текстового поля.

Пример:

public class RoundJTextField extends JTextField {
    private Shape shape;
    public RoundJTextField(int size) {
        super(size);
        setOpaque(false); // As suggested by @AVD in comment.
    }
    protected void paintComponent(Graphics g) {
         g.setColor(getBackground());
         g.fillRoundRect(0, 0, getWidth()-1, getHeight()-1, 15, 15);
         super.paintComponent(g);
    }
    protected void paintBorder(Graphics g) {
         g.setColor(getForeground());
         g.drawRoundRect(0, 0, getWidth()-1, getHeight()-1, 15, 15);
    }
    public boolean contains(int x, int y) {
         if (shape == null || !shape.getBounds().equals(getBounds())) {
             shape = new RoundRectangle2D.Float(0, 0, getWidth()-1, getHeight()-1, 15, 15);
         }
         return shape.contains(x, y);
    }
}

Чтобы увидеть это в действительности:

    JFrame frame = new JFrame("Rounded corner text filed demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 400);
    frame.setLayout(new FlowLayout());
    JTextField field = new RoundJTextField(15);
    frame.add(field);
    frame.setVisible(true);
2 голосов
/ 18 марта 2013

Здесь есть простой пример: http://java -swing-tips.blogspot.com.ar / 2012/03 / округло-граница-для-jtextfield.html

Привет! * * 1006

1 голос
/ 15 декабря 2011

Очень похоже на ответ @Harry Joy - просто пройти всю дистанцию, как указано в недавнем ответе

  • определяет тип границы, которая выставляет форму
  • уведомляет компонент о возможной форме границы
  • если он обнаруживает сформированную границу, возьмите фоновую краску в paintComponent внутри фигуры (не нужно трогать paintBorder)
0 голосов
/ 13 июля 2017

Это изменит любой JTextField, который вы создаете во всем приложении

Удалите его только в начале вашего самого первого окна, это повлияет на каждый JTextField.

    UIManager.put("TextField.background", Color.WHITE);
    UIManager.put("TextField.border", BorderFactory.createCompoundBorder(
            new CustomeBorder(), 
            new EmptyBorder(new Insets(4,4,4,4))));

Пользовательскийбордюр

@SuppressWarnings("serial")
public static class CustomeBorder extends AbstractBorder{
    @Override
    public void paintBorder(Component c, Graphics g, int x, int y,
            int width, int height) {
        super.paintBorder(c, g, x, y, width, height);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setPaint(COLOR_BORDE_SIMPLE);
        Shape shape = new RoundRectangle2D.Float(0, 0, c.getWidth()-1, c.getHeight()-1,9, 9);
        g2d.draw(shape);
    }
}
...