Java Swing rounded border for Jtextfield

天大地大妈咪最大 提交于 2019-12-12 08:12:01

问题


When I do :

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

I get this result like:

How can I have rounded borders without the squared corners visible and the text half cut ?

Thank you very much.

Best regards


回答1:


You can override JTextFiled build your own Rounded corner JTextField. You have to override it's paintComponent(), paintBorder(), and contains() methods. You need to draw roundRect as the shape of text field.

Example:

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);
    }
}

To see this in effect:

    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:


There is a simple example here: http://java-swing-tips.blogspot.com.ar/2012/03/rounded-border-for-jtextfield.html

Regards!




回答3:


Very similar to @Harry Joy's answer - just going the full distance, as outlined in a recent answer

  • define a border type which exposes a shape
  • make the component aware of a possibly shaped border
  • if it detects the shaped border, take over the background painting in paintComponent inside the shape (no need to touch paintBorder)



回答4:


This will modify any JTextField that you create in the entire application

Drop it just at the beginning of your very first window, it will affect every JTextField.

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

The custom border

@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);
    }
}


来源:https://stackoverflow.com/questions/8515601/java-swing-rounded-border-for-jtextfield

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!