как удалить ненужный фон под округлым бордюром? - PullRequest
2 голосов
/ 20 марта 2012

я использовал класс, чтобы сделать округлую границу

класс:

public class RoundedBorder implements Border {
        int radius;

        public RoundedBorder(int radius) {
            this.radius = radius;
        }
    @Override
        public Insets getBorderInsets(Component c) {
            return new Insets(this.radius/2, this.radius, this.radius/2, this.radius);
        }
    @Override
        public boolean isBorderOpaque() {
            return true;
        }
    @Override
        public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
            Graphics2D graphics = (Graphics2D) g;
            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

            g.drawRoundRect(x,y,width-1,height-1,radius,radius);           
        }
    }

и для кнопки, которую я использовал:

JTextField login_nickname = new JTextField();

login_nickname.setBorder(new RoundedBorder(10));
login_nickname.setPreferredSize(new Dimension(150, 25));

и все работает нормально, но я хочу удалить неиспользуемый фон за пределами скругленной границы в углу, я прикрепил изображение, чтобы объяснить, что я имею в виду,

enter image description here

спасибо

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Я бы сделал что-то подобное в paintBorder ():

@Override
 public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
     Graphics2D graphics = (Graphics2D) g;
     graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     if (c.getParent() != null) {
         Color bc = g.getColor();
         g.setColor(c.getParent().getBackground());
         for (int r = 0; r<radius;r++){
            g.drawRoundRect(x, y, width - 1, height - 1, r, r);
         }
         g.setColor(bc);
     }
     g.drawRoundRect(x, y, width - 1, height - 1, radius, radius);
 }

Если у компонента есть некоторый родительский контейнер, я бы нарисовал сначала границу с цветом фона, а затем поверх нее - мою круглую границу.

1 голос
/ 20 марта 2012

Что вернуло?

boolean isBorderOpaque();

Не должно быть 'ложным'?

...