2010-06-11 47 views
18

Tengo un JButton que por diversas razones quiero actuar como un botón, pero se parece a un JLabel. En realidad, no tiene que ser una JLabel bajo el capó, simplemente no quiero que aparezca el borde del botón elevado.Dibuje un JButton para que parezca un JLabel (o al menos sin el borde del botón?)

¿Hay alguna manera fácil de desactivar el "aspecto del botón" para JButtons pero mantener todas las funciones del botón?

Podría construir algún tipo de hiperbotón de subclase compuesto que delegue en una jlabel para mostrarlo, pero realmente espero que haya algo parecido a button.lookLikeAButton(false).

+2

¿No podría usar 'JLabel' directamente y manejar' onClickEvents'? –

+0

Bueno, para empezar, literalmente necesito algo que pueda pasar como JButton. Además, no solo necesito onClickEvents, realmente necesito todo el botón "cosa": acciones, armado, etc. –

Respuesta

24

Usted tendrá que hacer lo siguiente:

 setFocusPainted(false); 
     setMargin(new Insets(0, 0, 0, 0)); 
     setContentAreaFilled(false); 
     setBorderPainted(false); 
     setOpaque(false); 

Es posible que desee excluir setFocusPainted(false) si lo desea pintar en realidad el enfoque (por ejemplo, la línea fronteriza de puntos en apariencia de Windows y se siente).

He utilizado el código anterior en los casos en los que he deseado un botón "solo icono".

+1

¡Perfecto! Esto hizo exactamente lo que estaba buscando. ¡Gracias! –

+0

Agregué estos, y luego se veía como JLabel y el cursor cambiaría a una mano para que el usuario sepa que puede hacer clic: 'setBorder (new EmptyBorder (0,0,0,0)); setCursor (Cursor.getPredefinedCursor (Cursor.HAND_CURSOR)); ' – hepcat72

+0

Como alternativa, también puede hacer que el ícono cambie (por ejemplo, el sombreado) o cambie el color de fondo para que también el usuario sepa que se puede hacer clic en él. – Avrom

2

Establezca el color de fondo en transparente y el borde en una instancia EmptyBorder.

E.g.

JButton button = new JButton(); 
    button.setBackground(null); 
    button.setOpaque(false); 
    button.setBorder(new EmptyBorder()); 

El texto todavía se mueven arriba y abajo mientras hace clic en el botón y el botón todavía puede ser "armado" haciendo clic, tenencia, y "desarmado" moviendo el ratón fuera del área del botón.

Si no desea este comportamiento, probablemente no desee utilizar un botón y utilice una etiqueta real en su lugar.

-1

¿Sería realmente más fácil simplemente agregar un oyente de ratón a un JLabel? Puede ajustar los colores en mousePressed y mouseReleased, y hacer su procesamiento de acciones en mouseClicked?

+2

Hay mucho más en un botón que un oyente de mouse. ¿Qué hay de vincularlo a una acción? ¿Qué hay de armado/presionado/liberado? ¿Qué hay sobre el antirrebote? Hacer que una etiqueta actúe como un botón es mucho más complicado que hacer que un botón se vea como una etiqueta, por lo tanto, vaya con la amputación de píxeles, será menos doloroso. – shemnon

+0

@shemnon: exactamente. –

1
button.setBorderPainted(false); 
button.setContentAreaFilled(false); // ? 
0
setContentAreaFilled(false); 
setBorderPainted(false); 
setOpaque(false); 

Estas tres líneas hacen el truco.

Cuestiones relacionadas