Bordas Arredondadas em java

Olá, eu estou desenvolvendo uma aplicação e gostaria de utilizar bordas arrendondadas em JPanels, JTextField e JButtons, mas não achei nada sobre como fazer isto, alguem teria algum material para me ajudar?

Você quer uma customização bem específica, ou só mudar do visual padrão?

A primeira indicação é mudar o look and feel, e ver se é isso que você quer. Basicamente, isso muda o estilo de todos os componentes visuais. Tem vários exemplos disso aqui no fórum e na internet afora.

Se quer algo mais específico (ex: mudar somente os JButtons), possivelmente terá que estender a classe que quiser, desenhando da forma que deseja, e usando essa nova classe estendida em vez da classe base.

Abraço.

Um começo seria implementar uma nova borda estendendo a classe AbstractBorder e então configurar a borda criada no componente.

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.AbstractBorder;

/**
 *
 * @author David Buzatto
 */
public class Janela extends JFrame {
    
    public Janela() {
        
        setTitle( "Bordas" );
        setSize( 600, 600 );
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setLocationRelativeTo( null );
        
        JLabel label = new JLabel( "um label" );
        label.setBorder( new BordaCantoArredondado() );
        
        JTextField field = new JTextField( "um campo de texto" );
        field.setBorder( new BordaCantoArredondado() );
        
        JPanel painel = new JPanel();
        painel.setBorder( new BordaCantoArredondado() );
        //painel.setBackground( Color.RED );
        painel.setPreferredSize( new Dimension( 150, 150 ) );
        
        painel.add( label );
        painel.add( field );
        
        setLayout( new FlowLayout() );
        add( painel );
        
    }
    
    public static void main( String args[] ) {
        EventQueue.invokeLater( new Runnable() {
            public void run() {
                new Janela().setVisible( true );
            }
        });        
    }
    
    private class BordaCantoArredondado extends AbstractBorder {
        
        private static final BasicStroke CONTORNO = new BasicStroke( 2 );
                
        @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.create();
            g2d.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
            g2d.setStroke( CONTORNO );
            
            g2d.setColor( Color.BLACK );
            g2d.drawRoundRect( x, y, width-1, height-1, 20, 20 );
            
            g2d.dispose();
            
        }
        
    }
    
}

Veja que não é muito simples fazer funcionar da forma que vc quer. Por exemplo, remova o comentário da linha painel.setBackground( Color.RED ); para ver o que acontece. Como eu disse, é um começo.

Sujestões de leitura:
https://docs.oracle.com/javase/tutorial/uiswing/components/border.html
https://docs.oracle.com/javase/8/docs/api/javax/swing/border/AbstractBorder.html

1 curtida

Opa TerraSkilll eu consegui utilizar isto de sobrescrever o método “paintComponent” do JPanel, mas quando tentei aplicar o mesmo em um JTextField ele ficou todo bugado, a ideia é deixar meu layout “mais moderno”, tirar aquela cara quadradona do java, pra deixar tudo de certa forma mais “suave”

Opa David, obrigado pelos materiais e pelo exemplo! Da forma que tu apresentou acho que seria a maneira mais performatica pra isto, vou tentar implementar e se achar mais algum método posto aqui!

Se vc quer dar um visual mais moderno, pode usar o Look and Feel FlatLaf. Eu acho muito bom e vc não vai precisar ficar passando raiva em mexer com Look and Feel que não é algo simples.

https://www.formdev.com/flatlaf/

No próprio site tem as instruções para usar. É bem tranquilo.

1 curtida

Caraca, comecei a usar e achei bem mais tranquilo, Obrigado pela segestão!!