2010-06-11 13 views
18

Ho un JButton che per vari motivi che voglio agire come un pulsante, ma l'aspetto di un JLabel. In realtà non deve essere una JLabel sotto il cofano, ma non voglio che il bordo del bottone sollevato si mostri.Disegnare un JButton per assomigliare ad un JLabel (o almeno senza margini tasto?)

C'è un modo semplice per disattivare il pulsante "look" per JButtons ma mantenere tutte le funzionalità del pulsante?

Potrei creare una sorta di iperbutton sottoclasse composto che ha delegato a una jlabel per scopi di visualizzazione, ma spero davvero che ci sia qualcosa sulla falsariga di button.lookLikeAButton(false).

+2

Non potresti usare direttamente un 'JLabel' e gestire' onClickEvents'? –

+0

Beh, per cominciare, ho letteralmente bisogno di qualcosa che possa passare come JButton. Inoltre, non ho solo bisogno di onClickEvents, in realtà ho bisogno dell'intero "cosa" del pulsante - azioni, inserimento, ecc. –

risposta

24

Si vuole effettuare le seguenti operazioni:

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

Si consiglia di escludere setFocusPainted(false) se si vuole dipingere in realtà la messa a fuoco (per esempio tratteggiata linea di confine su Windows look and feel).

Ho usato il codice di cui sopra nei casi in cui ho voluto pulsante un "solo l'icona".

+1

Perfetto! Questo ha fatto esattamente quello che stavo cercando. Grazie! –

+0

Ho aggiunto questi, e poi sembrava proprio come la JLabel e il cursore si trasformava in una mano così l'utente sa che è cliccabile: 'setBorder (new EmptyBorder (0,0,0,0)); setCursor (Cursor.getPredefinedCursor (Cursor.HAND_CURSOR)); ' – hepcat72

+0

In alternativa, è anche possibile modificare l'icona (ad esempio l'ombreggiatura) o il cambiamento del colore di sfondo per consentire all'utente di sapere che è selezionabile. – Avrom

2

Impostare il colore di sfondo trasparente, e il confine a un'istanza EmptyBorder.

E.g.

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

Il testo sarà ancora muoversi su e giù, come si fa clic sul pulsante, e il pulsante può essere ancora "armati" facendo clic, la detenzione, e "disarmato", spostando il mouse fuori dall'area del pulsante.

Se non si desidera questo comportamento, allora probabilmente non si vuole utilizzare un pulsante, e utilizzare un vero e proprio marchio, invece.

-1

Potrebbe effettivamente essere più facile solo per aggiungere un listener del mouse per un JLabel? È possibile regolare i colori su mousePremuto e mouseRelasciati ed eseguire l'elaborazione dell'azione sul mouseClicked?

+2

C'è molto di più in un pulsante di un ascoltatore di mouse. Che ne dici di collegarlo a un'azione? Che dire di armati/pressati/rilasciati? Che dire del debouncing? Fare in modo che un'etichetta si comporti come un pulsante è molto più complicata di un pulsante che sembra un'etichetta, quindi vai con l'amputazione del pixel, sarà meno doloroso. – shemnon

+0

@shemnon: esattamente. –

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

Queste tre linee fanno il trucco.