Autor Wątek: Własny guzik  (Przeczytany 2274 razy)

Offline Pirs01

  • Użytkownik

# Luty 12, 2007, 16:41:51
Chciałbym stworzyć guzik któy oprócz paru zmian powinien mieć właściwości JButton. Różnice polegałyby na tym że guzik ma kształ koła a nie prostokątu i powinienem mieć możliwość zdefiniowania obrazka który będzie wypełniał ten guzik tak żeby obrazk ten wizualnie stanowił guzik. Innymi słowy obrazek pokrywa się kształtem z guzikiem (wzasadzie będą to 3 obrazki biorąc pod uwagę że guzik musi zmieniać wygląd gdy znajdzie się nad nim kursor i gdy zostanie kliknięty). Nie mam doświadczenia w pisaniu w javie i nie wiem jak się za to zabrać. Oczywiście nie oczekują że ktoś poda mi gotowy kod a raczej pomysł jak to zrobić. Powinienem zainteresować się metodą setUI czy raczej metodą setLayout? A skoro jedyną wspólną cechą mojego guzika i JButton ma być fakt żę generuje zdarzenie przy jego kliknięciu to może nie powinienem się zajmować JButton tylko napisać swoją klasę od postaw nie dziedzicząc z JButton? A możę zrobić to jeszcze inaczej?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline sobol

  • Użytkownik

# Luty 12, 2007, 16:56:38
Nie znam Javy, ale powinna być albo możliwość ustawienia wyglądu jakoś, a jeśli nie to możesz dziedziczyć sobie po jakiejś tam klasie buttona i samemu napisać funkcję renderującą ;)

Offline parmezan

  • Użytkownik

# Luty 12, 2007, 22:47:33
Zobacz SwingSet2 z katalogu "demo" z jdk. Jest tam przykład jak uzyskać to ze standardowm JButton.

Offline Pirs01

  • Użytkownik

# Luty 12, 2007, 23:17:27
Uruchomiłem ten prgoram ale nie znajduję w nim żadnego guzika który nie miał by standardowego prostokątnego kształtu, gdzie dokładniej szukać?

Offline parmezan

  • Użytkownik

# Luty 13, 2007, 00:01:54
Button Demo -> Buttons -> Image Buttons
i w Display options odchaczasz: Paint Border, Paint Focus, Content Filled.

Offline Pirs01

  • Użytkownik

# Luty 13, 2007, 12:54:37
Rzeczywiście jest ale tylko to o czym mówił L0R czyli zmiana samego sposobu renderowania i to już mam, ale cały problem w tym że guzik zachował kształt prostokątku i swoją powierzchnią wykracza poza powierzchnię ikony i przez to reaguje nawet jak klikniemy obok ikony. Moja klasa będzie potrzebna tylko do jednego guzika w prgoramie i guzik ten będzie mały więc powyższa przypadłość nie będzie rażąca a wręcz niezauważalna więc poszedłem na kompromis i napisałem to podobnie jak w przykładzie:
class Guziczek extends JButton
{
ImageIcon ikonaNormalna;
ImageIcon ikonaNajechanie;
ImageIcon ikonaWcisniecie;
Image ikona;
boolean wcisniety;

public Guziczek()
{
wcisniety = false;

Toolkit zestaw = Toolkit.getDefaultToolkit();

ikona = zestaw.getImage("ikona1.gif");
ikonaNormalna = new ImageIcon(ikona);
ikona = zestaw.getImage("ikona2.gif");
ikonaNajechanie = new ImageIcon(ikona);
ikona = zestaw.getImage("ikona3.gif");
ikonaWcisniecie = new ImageIcon(ikona);

int szerokosc = ikonaNormalna.getIconWidth();
int wysokosc = ikonaNormalna.getIconHeight();

setIcon(ikonaNormalna);
Dimension rozmiar = new Dimension(szerokosc, wysokosc);
setMaximumSize(rozmiar);
setMinimumSize(rozmiar);
setPreferredSize(rozmiar);

setContentAreaFilled(false);

addMouseListener(new SluchaczZdarzenMyszy());
}

class SluchaczZdarzenMyszy implements MouseListener
{
public void mouseEntered(MouseEvent e)
{
if(wcisniety)
setIcon(ikonaWcisniecie);
else
setIcon(ikonaNajechanie);
}
public void mousePressed(MouseEvent e)
{
wcisniety = true;
setIcon(ikonaWcisniecie);
}
public void mouseReleased(MouseEvent e)
{
wcisniety = false;
if(getIcon() == ikonaWcisniecie)
setIcon(ikonaNajechanie);
}
public void mouseExited(MouseEvent e)
{
setIcon(ikonaNormalna);
}
public void mouseClicked(MouseEvent e){}
}
}

W moim przypadku uzależniam zmianę ikony od eventów myszy bo z jakeigoś poowdu metody setRolloverIcon i setPressedIcon nie działały. Program się kompilował i uruchamiał ale ikony które podawałem tym metodą nigdy się nie pojawiały na ekranie... Będe musiał jeszcze porównać mój kod z tym z przykładu żeby zobaczyć czemu tak się działo. W każdym razie problem pozostaje: Jak napisać klasę guzika o nieregularnym kształcie np koła? Mi to już nie potrzebne ale myślę że wątek jest ciekawy więc jak ktoś ma jakiś pomysł  niech pisze! Ja na początku próbowałem setUI i setLayout ale nie doszedłem do żadnych konkretów i nie wiem czy to właściwy trop.