2009-01-08 86 views
13

Bueno, tengo una imagen que me gustaría poner como fondo de un botón (o algo clicable). El problema es que esta imagen es redonda, así que necesito mostrar esta imagen, sin bordes, etc.Swing redondeado JButton usando Java

El JComponent que contiene este botón tiene un fondo personalizado, por lo que el botón realmente necesita mostrar solo la imagen.

Después de buscar en Google, no pude lograrlo. He intentado todo lo siguiente, pero sin suerte:

button.setBorderPainted(false); 
button.setContentAreaFilled(false); 
button.setOpaque(true); 

Y después de que pinto el icono en el fondo, el botón pinta, pero tiene un fondo gris feo, con bordes, etc. También he intentado usa un JLabel y un JButton. Y para pintar un ImageIcon en él, pero si el usuario cambia el tamaño o minimiza la ventana, los iconos desaparecen.

¿Cómo puedo solucionar esto?

Sólo necesito para pintar y alrededor de una imagen a un JComponent y escuchar por los clics en él ...

+0

Puede comprobar la respuesta previamente hilo de la pregunta similar: http://stackoverflow.com/questions/5120116/how -to-create-rounded-jbutton-in-java/31699716 # 31699716 – GeekOnJava

Respuesta

0

opacidad se debe establecer en falso, por lo

button.setOpaque(false); 

ya que podría ser lo que quiere .

11

¿Has probado lo siguiente?

button.setOpaque(false); 
button.setFocusPainted(false); 
button.setBorderPainted(false); 
button.setContentAreaFilled(false); 
setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); // Especially important 

setBorder(null) podría funcionar, pero hay a bug described at Sun explicando que es por diseño que la interfaz de usuario establece una frontera en un componente a menos que el cliente establece una frontera no nulo que no implementa la interfaz UIResource.

En lugar de que el propio JDK establezca el borde en EmptyBorder cuando se pasa el nulo, los clientes deben establecer un EmptyBorder ellos mismos (una solución muy fácil). De esa forma no hay confusión sobre quién está haciendo qué en el código.

+0

Puede consultar el hilo de respuesta anterior de una pregunta similar: http://stackoverflow.com/questions/5120116/how-to-create-rounded-jbutton -in-java/31699716 # 31699716 – GeekOnJava

+0

@GeekOnJava Se ve bien. +1 – VonC

1

recomendaría método de pintura primordial (Graphics g) como tan:

class JImageButton extends JComponent implements MouseListener { 
    private BufferedImage img = null; 

    public JImageButton(BufferedImage img) { 
     this.img = img; 
     setMinimumSize(new Dimension(img.getWidth(), img.getHeight())); 
     setOpaque(false); 
     addMouseListener(this); 
    } 

    public void paintComponent(Graphics g) { 
     g.drawImage(img, 0, 0, img.getWidth(), img.getHeight(), null); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
    } 
} 
13

Crear un nuevo JButton:

JButton addBtn = new JButton("+"); 
    addBtn.setBounds(x_pos, y_pos, 30, 25); 
    addBtn.setBorder(new RoundedBorder(10)); //10 is the radius 
    addBtn.setForeground(Color.BLUE); 

al establecer la frontera para un JButton, llamar a la clase anulado javax.swing.border.Border.

addBtn.setBorder(new RoundedBorder(10)); 

Aquí es la clase

private static class RoundedBorder implements Border { 

    private int radius; 


    RoundedBorder(int radius) { 
     this.radius = radius; 
    } 


    public Insets getBorderInsets(Component c) { 
     return new Insets(this.radius+1, this.radius+1, this.radius+2, this.radius); 
    } 


    public boolean isBorderOpaque() { 
     return true; 
    } 


    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { 
     g.drawRoundRect(x, y, width-1, height-1, radius, radius); 
    } 
} 
+0

esta es casi la respuesta correcta – UVM

+2

@UVM esto es casi un comentario útil. ¿Cuidar para explicar por qué es "casi correcto"? – Pete

+0

probablemente porque el fondo rectangular es visible con radios mayores – giantas

1
  1. Arrastre un botón normal a su panel de

  2. haga clic con el botón derecho e ir a propiedades:

    boarder   = no barder 
    boarder painted = false 
    contentAreaFilled = false 
    focusPainted  = false 
    opaque   = false 
    
  3. Establecer an (icono) y a (rolloverIcon) importando al proyecto.

+3

"frontera"? ¿Debería ser "frontera"? "no barder"? ¿Debería ser "sin frontera"? "huésped pintado"? ¿Debería ser "pintado en el interior"? –

1

Puede intentar lo siguiente. Funciona bien para mí, y también enfrenté el mismo problema con el botón.

// Jbutton 
JButton imageButton = new JButton(); 

// Buffered Icon 
BufferedImage buttonIcon = null; 

try { 
    // Get the image and set it to the imageicon 
    buttonIcon = ImageIO.read(getClass().getClassLoader().getResource("images/login.png")); 
} 
catch(Exception ex) { 

} 

// Set the image icon here 
imageButton = new JButton(new ImageIcon(buttonIcon)); 
imageButton.setBorderPainted(false); 
imageButton.setContentAreaFilled(false); 
imageButton.setFocusPainted(false); 
imageButton.setOpaque(false); 
0

Puede crear un borde vacío al botón de la siguiente manera:

button.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));