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
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.
Caraca, comecei a usar e achei bem mais tranquilo, Obrigado pela segestão!!