Witam,
Tworzę własną kontrolkę buttona i niezbyt wiem jak mam wywołać jakąś funkcję po kliknięciu w przycisk. Np mam stworzoną metodę isClicked w klasie Button i czy mogę wywołać w tej metodzie inną dowolną funkcję którą zdefiniuję. A jeżeli nie to jaki jest inny sposób?
- Rejestracja:około 12 lat
- Ostatnio:ponad 9 lat
- Postów:99


- Rejestracja:ponad 12 lat
- Ostatnio:ponad rok
- Postów:490
Przesyłam tutoriala, bo nie umiem tłumaczyć :(
http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html
Jak juz przejdziesz do metody to w niej możesz spokojnie odwoływac się do dowolnej metody należącej do tej klasy, możesz tworzyć jakieś nowe obiekty i odwoływac się do metod tego obiektu itp.
- Rejestracja:około 12 lat
- Ostatnio:ponad 9 lat
- Postów:99
Mam taką klasę
class XButton extends MyComponent {
public String name;
public boolean invaded;
public XButton(String s) {
positionX = positionY = 100;
sizeX = 100;
sizeY = 30;
name = s;
isClicked = false;
invaded = false;
public void isClickedAction(){}
}
}
I jak kliknę w przycisk to wywołam metodę
sClickedAction()
tylko jak napisze w tej metodzie żeby np. wyświetlało tekst to będzie wyświetlało ten sam tekst dla każdego obiektu tej klasy. A ja chcę żeby mi wyświetlało coś innego.
Np. tworze se funkcji
void NewGame(){ ... }
i chcę to funkcji wywołać w public void isClickedAction(){}
- Rejestracja:ponad 18 lat
- Ostatnio:ponad 9 lat
Jak chcesz zeby ten tekst sie zmienial ?
Chodzi mi o to, ze tekst wcale nie musi byc identyczny, mozesz go wczytywac od użytkownika, może on być tworzony dynamicznie podczas trwania programu, moze byc zmieniany w konstruktorze. Wystarczy, ze zrobisz w klasie pole np. String message, a pozniej w sClickedAction() wykorzystujesz ten tekst.
- Rejestracja:ponad 18 lat
- Ostatnio:ponad 9 lat
W normalnym guziku masz tak:
Tworzys spbie kilka guzikow:
JButton start = new JButton("Start");
JButton stop = new JButton("Stop");
//a przy bardziej rozbudowanych napisach na guziku radze tak zrobic:
JButton cancel = new JButton("Anuluj zadanie");
cancel.setActionCommand("Cancel");
//sluchaczy
start.addActionListener(this);
//dodajesz guziki
frame.add(start);
Po nacisnieciu guzika generowane jest wydarzenie (event) i wywolywana jest metoda actionPerformed(ActionEvent e)
No i tam juz po nazwie sobie obslugujesz, albo mozesz użyć reflekcji (java.lang.reflect)
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
try {
Method m = this.getClass().getDeclaredMethod("task"+cmd);
m.invoke(this);
} catch(Exception exc) { exc.printStackTrace(); }
}
Co sprawi, ze po naciśnięciu np. guzika start zostanie wywołana funkcja taskStart();
W Twoim guziku musisz stworzyć klasę, która dziedziczy po AbstractButton
dodanie znaczników <code class="java"> - furious programming
- Rejestracja:ponad 18 lat
- Ostatnio:ponad 9 lat
Mozesz zrobic jeszcze tak:
(Znalazłem to w necie)
import javax.swing.*;
import java.awt.*;
class CustButton extends JButton {
public CustButton(String txt) {
super(txt);
setFont(new Font("Dialog", Font.PLAIN, 24));
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
int w = getWidth(); // aktualna szerokość ...
int h = getHeight(); // i wysokość komponentu
g.setColor(Color.red); // ustalenie koloru rysunku
// rysowanie kwadracików
g.fillRect(0, 0, 10, 10);
g.fillRect(w-10, 0, 10, 10);
g.fillRect(0, h-10, 10, 10);
g.fillRect(w-10, h-10, 10, 10);
}
}
public class ButtonTest extends JFrame {
public ButtonTest() {
CustButton mb = new CustButton("To jest przycisk");
add(mb);
setDefaultCloseOperation(EXIT_ON_CLOSE); // domyślna operacja zamknięcia okna: koniec pracy
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String args[]) {
new ButtonTest();
}
}
Tutaj guzik dziedziczy po klasie JButton, dzieki temu masz wszystkie opcje co normalny guzik.
dodanie znacznika <code class="java"> - furious programming