¿Botones redondos en java?

Estado
Cerrado para nuevas respuestas.

=LT=totobany

Lanero Reconocido
12 Feb 2002
1,237
Me pregi¿unto si alguien sabe como hacer botones en java que no sean rectangulares.

Particularmente estoy interesado en el diseño redondo si alguien sabe por fabor diganme como carajos lo hago.

tanks.

:reir:
 
Tienes varias alternativas:

1. Creas tu propia clase de botones que heredan de JButton pero sobreescriben la función de dibujar, escribiendo tu propio código para eso.

2. Creas una imagen (que puede ser redonda si utilizas por ejemplo un gif) y le asignas una acción para cuando se haga click en esta.

Para simular que el boton es presionado, puedes utilizar dos imagenes: una normal y otra cuando el boton está hundido.
 
De casualidad tenes un ejmplo de la segunda opcion que me podas facilitar.
En estos momentos me encuentro trabajando en la primera opcion y hasta ahora todo va bien, pero me gustaria ensayar la otra forma.

tanks.

:reir:
 
Busca en internet, hay paginas especializadas en coleccionar aplets de java, alli encontraras botones, menus y un resto de cosas
 
Esa fue una de mis primeras soluciones, la proxima vez ojala que sea algo mas concreto.

:reir:
 
Totobany, necesitas simplemente que sea 3D?

Necesitas algún tipo de animación?
Si no es así puedes usar cualquier programa con que puedas generar imágenes, mientras mas poderosa sea la herramienta mas puedes explotar tu creatividad.
 
Tomado de alguna pagina en la red (no recuerdo el link):

El ejemplo java1430.java (adjuntado a este mensaje) trata de mostrar el modo de conseguir un botón redondo. Esta figura se usa por simplicidad, pero nada impide al lector crear un botón con una figura arbitraria.

Hay dos cosas a tener en cuenta a la hora de crear este tipo de botón. Por un lado es necesario sobrescribir los métodos de pintado del botón para que se adecúen a la nueva figura. Por otro lado, es necesario controlar la zona de respuesta a las pulsaciones de los botónes del ratón, para que solamente se responda cuando el cursor del ratón se encuentre en el interior del botón.

El código completo del ejemplo es el que se muestra a continuación, en donde se tienen en cuenta las dos circunstancias que se acaban de citar. El código, como puede comprobar el lector, es sumamente sencillo.

Código:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

public class java1430 extends JButton {

  // Constructor del Botón Redondo
  public java1430( String rotulo ) {
    super( rotulo );

    // Igualamos las dimensiones para que el botón sea un círculo en vez de
    // una elipse
    Dimension tamano = getPreferredSize();
    tamano.width = tamano.height = Math.max( tamano.width,tamano.height );
    setPreferredSize( tamano );

    // Hacemos que el JButton no pinte su fondo, de este modo podremos
    // nosotros hacer que el color de fondo que se salga de la figura sea
    // del mismo color que el fondo de la ventana
    setContentAreaFilled( false );
    }

  // Este es el método que pinta el botón en el color correspondiente al estado
  // en que se encuentre, y también coloca el rótulo que se haya indicado en el
  // centro del botón
  protected void paintComponent( Graphics g ) {
    if( getModel().isArmed() ) {
      // Se puede hacer que la característica de Pulsado sea una propiedad de
      // esta clase
      g.setColor( Color.lightGray );
      } 
    else {
      g.setColor( getBackground() );
      }
    g.fillOval( 0,0,getSize().width-1,getSize().height-1 );

    // Llamando al método de la clase padre, haremos que aparezca el rótulo y
    // hacemos que el restángulo correspondiente al botón sea el que controla
    // el foco
    super.paintComponent( g );
    }

  // Pintamos el borde del botón con una línea simple
  protected void paintBorder( Graphics g ) {
    g.setColor( getForeground() );
    g.drawOval( 0,0,getSize().width-1,getSize().height-1 );
    }

  // Este es el método que controla la posición del ratón en el momento de
  // pulsar su botón. Se sobreescribe para controlar los cambios de tamaño
  // del botón
  Shape figura;
  public boolean contains( int x,int y ) {
    // En caso de que el botón cambie de tamaño, hay que conseguir una nueva
    // figura que se adapte a ese nuevo tamaño
    if( figura == null || !figura.getBounds().equals(getBounds()) ) {
      figura = new Ellipse2D.Float( 0,0,getWidth(),getHeight() );
      }
    return( figura.contains( x,y ) );
    }


  public static void main( String args[] ) {
    JFrame ventana = new JFrame( "Tutorial de Java, Swing" );
    ventana.getContentPane().setLayout( new FlowLayout() );
    ventana.getContentPane().setBackground( Color.yellow );

    ventana.addWindowListener( new WindowAdapter() {
      public void windowClosing( WindowEvent evt ) {
        System.exit( 0 );
        }
      } );
    
    // Se crea el botón y se le pone fondo rojo
    JButton boton = new java1430( "Boton" );
    boton.setBackground( Color.red );
    // Se incorpora a la ventana
    ventana.getContentPane().add( boton );
    ventana.setSize( 300,150 );
    ventana.show();
    }
  }

La clase que implementa el botón redondo extiende a la clase JButton para mantener toda la funcionalidad de un botón, excepto aquello que interesa en este caso particular. Por ejemplo, en el constructor de la clase se llama al método setContentAreaFilled(), que es el encargado de pintar la zona correspondiente al foco del botón, para que en este caso no pinte el fondo del botón.

La primera parte interesante del ejemplo es el método sobrescrito paintComponent(). En él se utiliza el método fillOval() de la clase Graphics para pintar un círculo relleno, y acto seguido se hace una llamada al mismo método de la superclase para que pinte el rótulo del botón sobre el círculo.

También se sobrescribe el método paintBorder() para pintar un borde alrededor del botón, llamando al método drawOval() de la clase Graphics.

El siguiente código interesante es el encargado de responder solamente cuando el usuario pulsa el botón del ratón con el cursor posicionado dentro del círculo, y no hacer nada cuando se hace fuera. Por defecto, un objeto de tipo JButton responde a las pulsaciones de ratón en un área rectangular alrededor del ratón. No obstante, el objeto JButton no tiene idea de la forma real del botón, así que asume que es rectangular. Para indicar al objeto JButton la forma real del botón, es necesario sobreescribir el método contains(). A este método se le pasa una coordenada y responde true si la coordenada está dentro del botón y false en caso contrario. El método, en este caso concreto del botón redondo, utiliza un objeto Shape (Ellipse2D) para determinar si la coordenada se encuentra dentro o fuera del círculo.

En el JDK 1.2.2 hay un pequeño bug en la implementación del objeto JButton, concretamente en el tratamiento de los eventos de arraste del ratón. En un funcionamietno correcto, si se pulsa dentro del círculo y se arrastra el cursor fuera del perímetro del círculo (manteniendo pulsado el botón) se debería producir un cambio en la apariencia del botón. Al devolver el cursor al círculo, el botón debería recuperar su apariencia inicial, la misma que antes de iniciar el arrastre. Desafortunadamente, el código que implementa esta funcionalidad no llama al método contains(); en su lugar, utiliza los límites del botón (el área más pequeña que contiene al botón). El lector puede observar que si arrastra el cursor lentamente fuera del círculo, pero sin salirse del área rectangular del botón, éste no altera su apariencia. La única solución a este pequeño defecto consiste en implementar toda la funcionalidad uno mismo.
 
No necesariamente necesito que sea animado Solo que sea redondo, o de cualquier otra forma diferente de la convensional estrellas, ovalos, o diferentes poligonos; de todas formas gracias por la info.

:reir:
 
ah, mano, si no quiere leer, no programe, arriba MigPosada le dio la mejor solucion, escriba una clase que herede de la clase JButton (o Button).

Y VictorV, me parece un detallazo suyo haberse fajado con ese codigo, pero no sea alcahuete, deje que el muchacho use la cabeza...

Campana en contra de la "pereza Mental" ...
 
Y campaña en contra de "dejemos que los manes de LANeros me respondan la tarea"!

No mentiras, tranquilos, pregunten lo que quieran, para eso está este foro.
 
Hey! paz paz!!! toto solo quiere saber si alguien sabe una forma alterna!!! o es q acaso no leyeron donde dice q ya había hecho lo de sobreescribir el metodo paint de JButton (por cierto no tiene q ser un boton de swing).

Y creo q el señor ODDG posteo como por postear porque obviamente el problema no es crear una imagen sino convertirla en boton y no creo q eso de "cualquier progrma q genere imagenes..." tenga algo q ver.

A veces los foros pueden ser para discutir cosas menos triviales como la opinión sobre un juego ¿no.

No reinvente la rueda, dice mi libro de c++...
 
Entonces estás interesado en otra solución?

Como dije anteriormente puedes utilizar cualquier componente como boton, añadiendole un mouse listener para que haga determinadas acciones cuando se hace click, o el puntero del mouse pasa simplemente sobre el objeto. No sólo puedes tener botones muy curiosos, sino que puedes cambiar la imagen de este cuando el mouse pasa por encima de él.

Creo que la idea basta, y puedes implementar tu mismo el código.
 
Aqui puedes ver que no contesté por contestar.... Uno puede desarrollar una imagen en cualquier programa, no tiene que ser el mejor, simplemente en el que mejor se adapte.

Este es una muestra de un boton que acabo de hacer en la universidad en Paint!
Paint Rulz! jauajauaj
 

Archivos adjuntos

  • dibujo.bmp
    35.2 KB · Visitas: 861
ah, mano, si no quiere leer, no programe, arriba MigPosada le dio la mejor solucion, escriba una clase que herede de la clase JButton (o Button).

Y VictorV, me parece un detallazo suyo haberse fajado con ese codigo, pero no sea alcahuete, deje que el muchacho use la cabeza...

Campana en contra de la "pereza Mental" ...


Yo no estoy pidiendo que me al***************teen la pereza, a demas me parece que aqui estamos es por colaborarnos y aprender mutuamente.

Las opcines que me dio Mig me parecieron excelentes, es mas en este momento tengo solucionado el problema casi en su totalidad.

El codigo que adjunto Victorv es muy similar a la solucion que ya habia implementado.

Aqui lo publico por si a alguien mas le interesa.

Código:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;
import javax.swing.*;



public class BotonRedondo extends JButton implements MouseListener
{
    private Graphics2D g2d, g2d2;
    private BufferedImage bimg;
    private Shape AreaCubierta;
    private Color descolorido, colorido, ColorClick, BGColor;
    private GradientPaint despintado, pintado, ClickPaint;
    private boolean mouseDown;

    public BotonRedondo(String label)
    {
        super(label);
        setContentAreaFilled(false);
        descolorido = new Color(39,164,17);
        colorido = new Color(181,0,0);
        ColorClick = new Color(255,130,130);
        setFocusable(false);
        addMouseListener(this);
    }
    public BotonRedondo(Icon im)
    {
    	super(im);
    	setContentAreaFilled(false);
        descolorido = new Color(0,0,0);
        colorido = new Color(181,0,0);
        ColorClick = new Color(255,130,130);
        addMouseListener(this);
    }

    public void mouseClicked(MouseEvent me){}
    public void mouseEntered(MouseEvent me){}
    public void mouseExited(MouseEvent me) {}

    public void mousePressed(MouseEvent me)
    {
        mouseDown = true;
    }

    public void mouseReleased(MouseEvent me)
    {
        mouseDown = false;
    }

    public void paint(Graphics g)
    {
        Color col;
        if (BGColor == null)
        {
            if (getParent() != null)
                BGColor = getParent().getBackground();
            setBackground(BGColor);
        }
        if (AreaCubierta == null)
            AreaCubierta = new Ellipse2D.Float(0, 0, getSize().width-2, getSize().height-2);
        if (pintado == null)
            pintado = new GradientPaint(0, 0, colorido, 0, getSize().height, Color.white);
        if (despintado == null)
            despintado = new GradientPaint(0, 0, descolorido, 0, getSize().height, Color.white);
        if (ClickPaint == null)
            ClickPaint = new GradientPaint(0, getSize().height, ColorClick, 0, 0, Color.white);
    			
        g2d = createGraphics();
        if (mouseDown)
            g2d.setPaint(ClickPaint);
        else if (getModel().isArmed())
            g2d.setPaint(pintado);
        else
            g2d.setPaint(despintado);
        
           	 	
        g2d.fill(AreaCubierta);
        
        
        if (mouseDown)
            col = ColorClick;
        else if (getModel().isArmed())
            col = colorido;
        else
            col = descolorido;

        g2d.setColor(col);

        g2d.drawOval(0, 0, getSize().width-2, getSize().height-2);
        g2d.dispose();
        g.drawImage(bimg, 0, 0, this);
        super.paintComponent(g);
    }

    protected Graphics2D createGraphics()
    {
        Graphics2D g2 = null;
        if (bimg == null)
            bimg = (BufferedImage) createImage(getSize().width, getSize().height);
        g2 = bimg.createGraphics();
        g2.setBackground(getBackground());
        g2.clearRect(0, 0, getSize().width, getSize().height);
        Component parent = getParent();

        if (parent != null && parent instanceof SceneFrame)
        {
            Point point = getLocation();
            Image theBg = ((SceneFrame) parent).getClip(point.x, point.y, getWidth(), getHeight());
            if (theBg != null)
            {
                int x = 0, y = 0;
                if (point.x < 0)
                    x = -point.x;
                if (point.y < 0)
                    y = -point.y;
                g2.drawImage(theBg, x, y, getBackground(), this);
            }
        }
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

        return g2;
    }

    public boolean contains(int x, int y)
    {
        if (AreaCubierta == null)
            return false;
        return AreaCubierta.contains(x, y);
    }

}

class SceneFrame extends JPanel
{
    private ImageIcon myImage;
    private BufferedImage myBufImage;
    private JButton lastButton;
    public SceneFrame()
    {
        myImage = new ImageIcon("galaxy.jpg");
        setSize(myImage.getIconWidth(), myImage.getIconHeight());

        PixelGrabber grabber = new PixelGrabber(myImage.getImage(), 0, 0,
            myImage.getIconWidth(), myImage.getIconHeight(), true);

        try
        {
            if (grabber.grabPixels())
            {
                int[] thePixels = (int[]) grabber.getPixels();
                myBufImage = new BufferedImage(myImage.getIconWidth(), myImage.getIconHeight(), BufferedImage.TYPE_INT_RGB);
                myBufImage.setRGB(0,0, myImage.getIconWidth(), myImage.getIconHeight(), thePixels, 0, myImage.getIconWidth());
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }

    }

    public Image getClip(int x, int y, int width, int height)
    {
        if (x < 0)
            x = 0;
        if (y < 0)
            y = 0;

        if (x > myBufImage.getWidth() || x + width > myBufImage.getWidth())
            width = myBufImage.getWidth() - x;

        if (y > myBufImage.getHeight() || y + height  > myBufImage.getHeight())
            height = myBufImage.getHeight() - y;

        if (height < 0 || width < 0)
            return null;

        return myBufImage.getSubimage(x, y, width, height);
    }

    public void paint(Graphics g)
    {
        g.clearRect(0,0,getWidth(),getHeight());
        g.drawImage(myImage.getImage(), 0, 0, Color.white, this);
        paintComponents(g);
    }
}


Muchas gracias por su colaboracion.

:reir:
 
listo mejo DOOG ahora no es sino q lo implemente su imagencita como boton en java, con sus debidos listeners y mouse events:

Programador != diseñador gráfico
 
listo mejo DOOG ahora no es sino q lo implemente su imagencita como boton en java, con sus debidos listeners y mouse events:

Programador != diseñador gráfico

No digamos != digamos, las semejanzas son muy pocas.
 
Colaborar, no es darle el codigo a alguien para que lo meta en su proyecto, colaborar, es indicarle como llegar a la solucion.
 
Estado
Cerrado para nuevas respuestas.

Los últimos temas