2010-06-11 13 views
18

Mam JButton, który z różnych powodów chcę działać jak przycisk, ale wygląda jak JLabel. To wcale nie musi być JLabel pod maską, po prostu nie chcę, żeby uniesiona krawędź przycisku pojawiła się.Narysuj JButton wyglądać jak JLabel (lub przynajmniej bez krawędzi przycisku?)

Czy istnieje łatwy sposób na wyłączenie "wyglądu przycisku" w przypadku przycisków JButtons, ale zachowaj wszystkie funkcje przycisków?

Mogłabym zbudować jakiś skomponowany hiperprzestrzen podklasowy, który zostałby przeniesiony do jlabla w celach wyświetlania, ale mam nadzieję, że jest coś podobnego do linii button.lookLikeAButton(false).

+2

Nie możesz użyć 'JLabel' bezpośrednio i obsługiwać' onClickEvents'? –

+0

Cóż, na początek, dosłownie potrzebuję czegoś, co mogę przekazać jako JButton. Ponadto, nie potrzebuję tylko onClickEvents, faktycznie potrzebuję całego przycisku "thing" - akcji, uzbrojenia, itd. –

Odpowiedz

24

Będziemy chcieli, aby wykonać następujące czynności:

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

Możesz wykluczyć setFocusPainted(false) jeśli chcesz to faktycznie malować ostrość (np przerywana linia graniczna na wyglądzie systemu Windows i czuć).

Użyłem powyższego kodu w przypadkach, w których chciałem przycisk "tylko ikona".

+1

Idealny! To było dokładnie to, czego szukałem. Dzięki! –

+0

Dodałem te, a następnie wyglądało to tak, jak JLabel i kursor zmieniłby się w dłoń, aby użytkownik wiedział, że można kliknąć: 'setBorder (new EmptyBorder (0,0,0,0)); setCursor (Cursor.getPredefinedCursor (Cursor.HAND_CURSOR)); ' – hepcat72

+0

Alternatywnie można również zmienić ikonę (np. cieniowanie) lub zmianę koloru tła, aby użytkownik wiedział, że jest klikalny. – Avrom

2

Ustaw kolor tła jako przezroczysty, a obramowanie do instancji EmptyBorder.

E.g.

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

Tekst będzie nadal poruszać się w górę iw dół po kliknięciu przycisku, a przycisk wciąż może być „uzbrojony” poprzez kliknięcie, posiadania, a „rozbrojony” poprzez przesunięcie myszy z obszaru przycisku.

Jeśli nie chcesz tego zachowania, prawdopodobnie nie chcesz używać przycisku i zamiast niego użyj prawdziwej etykiety.

-1

Czy rzeczywiście łatwiej byłoby dodać słuchacza myszy do JLabel? Możesz dostosować kolory w mousePressed i mouseReleased i wykonać przetwarzanie akcji na mouseClicked?

+2

Jest o wiele więcej niż przycisk myszy. A co z powiązaniem go z działaniem? A co z uzbrojeniem/naciśnięciem/zwolnieniem? A co z debouncingiem? Sprawienie, by etykieta zachowywała się jak przycisk jest o wiele bardziej skomplikowana niż sprawienie, by przycisk wyglądał jak etykieta, więc z amputacją piksela będzie mniej bolesny. – shemnon

+0

@shemnon: dokładnie. –

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

Te trzy linie działają.