Ahoj,
mám problém s odchycením stisknutí tlačítka a už si nevím rady. Nejspíš tam bude někde nějakej "překlep", jinak fakt už nevím. Všechny potřebný metody snad mám. Jde o to, že si vytvářím JDialog na míru... Ale nedaří se mi reagovat na tlačítka... Přikládám screen toho JDialogu pro představu a samozřejmě kód...
A zde je kód...
private void zobrazInfoNovyUML() {
// vytvoreni dialogoveho okna pro vytvoreni noveho UML diagramu
final JDialog dialogOkno = new JDialog(this, "Vymazat aktuální UML diagram"
+ " a jeho soubory", true);
// popis akce JTextArea, ktera se po potvrzeni provede
JTextArea popisDialogOkna = new JTextArea("Opravdu chcete vymazat aktuální\n"
+ "UML diagram a jeho soubory z programu? ");
// zamezeni editovani popisu akce JTextArea
popisDialogOkna.setEditable(false);
// nastaveni pozadi popisu akce JTextArea
popisDialogOkna.setBackground(new Color(220, 220, 220));
// zruseni ohraniceni popisu akce JTextArea
popisDialogOkna.setBorder(null);
// nastaveni pozadi dialogoveho okna
dialogOkno.getContentPane().setBackground(new Color(220, 220, 220));
// nastaveni dialogoveho okna na zavreni po stisknuti krizku
dialogOkno.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
// nastaveni dialogoveho okna jako modalni - nejprve se musi okno potvrdit
dialogOkno.setModal(true);
// zamezeni zmeny velikosti dialogoveho okna
dialogOkno.setResizable(false);
// nastaveni layoutu dialogoveho okna
dialogOkno.setLayout(new FlowLayout());
// nastaveni velikosti dialogoveho okna
dialogOkno.setSize(310, 100);
// nastaveni, kde se ma dialogoveho okno zobrazovat - uprostred obrazovky
dialogOkno.setLocation((int) rozmeryOkna.getWidth() / 2,
(int) rozmeryOkna.getHeight() / 2);
// nastaveni rozmeru tlacitek v dialogovem okne
Dimension rozmeryTlacitek = new Dimension(60, 25);
// vytvoreni jednotlivych tlacitek
JButton buttonAno = new JButton("Ano");
JButton buttonNe = new JButton("Ne");
// nastaveni dane velikosti pro jednotliva tlacitka
buttonAno.setPreferredSize(rozmeryTlacitek);
buttonNe.setPreferredSize(rozmeryTlacitek);
// pridani tlacitek a JTextArea do dialogoveho okna
dialogOkno.add(popisDialogOkna);
dialogOkno.add(buttonAno);
dialogOkno.add(buttonNe);
// nastaveni dialogoveho okna na viditelne
dialogOkno.setVisible(true);
buttonAno.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
buttonAnoActionPerformed(e);
}
private void buttonAnoActionPerformed(ActionEvent e) {
dialogOkno.setVisible(false);
}
});
buttonNe.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
buttonNeActionPerformed(e);
}
private void buttonNeActionPerformed(ActionEvent e) {
dialogOkno.setVisible(false);
}
});
}
A pak uvidíš, co se bude dít. Pokud to bude něco dělat (vypisovat), pak je správně přidaný listener, ale chyba je v metodách (těch do kterých nevidim).
Nahlásit jako SPAM
IP: 77.48.30.–
Dejte mi flétnu a já budu hrát, dejte mi Javu a já budu psát.
Je to pouze nastavení toho dialogového okna tak, aby bylo neviditelné. "Souty" jsem samozřejmě zkoušel. Nevypisují bohužel nic. To jsem zapomněl napsat. Dál už ale nevím, kde mám právě hledat. Tam snad není co zkazit...
Omlouvám se, fakt tam jsou. Přesně to si taky myslím, že tam není co zkazit a zdá se mi to dobře.
Teď mě napadlo, že by to mohlo být připojením listeneru až po přidání do kontejneru, ale tím to očividně není, protože sem si to zkusil.
Napadá mě zkusit přidat listener jako instanci třídy která je odděděná od AbstractAction. Pokud by byl kód akce nějaký složitější, je to standardní řešení. Tobě to vytvoří spoustu problémů, uvidíš jak najednou bude problém získat tu komponentu která má zmizet a tím možná najdeš tu chybu.
Teď jak nad tím přemýšlím, tu komponentu bych předal jako parametr konstruktoru a zas tak hrozný by to bejt nemuselo. Otázkou je, bude to fungovat? :D
Zkus něco jako todle:
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
public class Akce extends AbstractAction{
JDialog jd;
public Akce(JDialog jd){
this.jd = jd;
}
@Override
public void actionPerformed(ActionEvent e) {
jd.setVisible(false);
}
}
#4Antilles
Tak jsem zkusil i tvůj další nápad s AbstractAction a bohužel se i tak nic neděje... Já to prostě nechápu. Asi bude problém někde uvnitř, protože si to okno vytvářím sám... Kdo ví, co ještě nastavuje sama Java, když si dělám návrh v GUI...
Díky moc za rady, zatím to bohužel nevede k řešení...
Já jdu hledat, co všechno se děje, když si nakliknu button například do JPanelu a uvidím, jestli to k nečemu bude.
Kdybych na něco přišel, tak se určitě podělím...
EDIT: Když se dívám, co se děje při vytvoření tlačítka přes návrhář Javy, tak je to totožný s tím, co se dělám já... Opravdu netuším, kde je chyba.
#5avalagne
Jo, tohle je o zkoušení. Třeba vypneš a zapneš IDE a půjde to, jeden nikdy neví . Nebo se třeba ráno probudíš a tu chybku uvidíš na první pohled.
Každopádně třeba aspoň dostaneš důvod naučit se to GUI psát ručně (pokud to už neumíš a nepoužíváš designer z nějakého spešl důvodu). Plánuju o GUI psát výhledově seriál tady na programujte. Jen na to teď nemám moc času.
Nahlásit jako SPAM
IP: 77.48.30.–
Dejte mi flétnu a já budu hrát, dejte mi Javu a já budu psát.
#6Antilles
Tak restart IDE nepomohl... Ale dobrej nápad, jednou mi to pomohlo
Máš bohužel pravdu s tím zkoušením. Na tohle jsem bohužel asi krátkej... Tady fakt není co vymýšlet
Já GUI dělám co jde přes návrhář. Je to jednodušší, rychlejší... Pak ale přijde moment, kdy potřebuju udělat něco svého a problém je na světě. Co provádí návrhář snad vím docela dobře, samozřejmě ne vše... Ještě mě napadlo, jestli není nějak ten JDialog špatně propojený s JButtonama... Ale tam metoda add() snad musí stačit.
Můžeš zkusit místo JDialogu použít JFrame ale nemyslím si, že to dopadne jinak. Pokud však má JDialog nějakou speciální skrývací vlastnost, zjistíš to. Tady je něco divně špatně ;)
Co se týče spojování s rodičovskou komponentou, ani nevim, že by to šlo jinak než metodou add(), protože jsem to nikdy nepotřeboval :-D. Vždycky jen nějakou z přetížení týhle metody.
Nahlásit jako SPAM
IP: 77.48.30.–
Dejte mi flétnu a já budu hrát, dejte mi Javu a já budu psát.
Což je divný! Já sem si to tu zkoušel, jiný příklad ale stejný princip, taky jsem měl ty listenery tam jako ty (po zviditelnění okna) a šlo to! Nechápu. Ale to není důležité jako to, že to funguje
EDIT: Protože mě přesně to napadlo. Ale když jsem viděl, že mi to tu běží tak jsem si řikal že je to v pohodě. No, očividně není. Ještě jednou gratuluji k nalezení :-)
Nahlásit jako SPAM
IP: 77.48.30.–
Dejte mi flétnu a já budu hrát, dejte mi Javu a já budu psát.
#11Antilles
No abych řekl pravdu, ani nad tím teď nebudu přemýšlet... Jsem rád, že můžu jít spát s čistou hlavou
Ještě mi tam poradili odkaz oficiálních stránek na dokumentaci (cože samozřejmě znám), kde je návod, jak si lehce udělat vlastní popis tlačítek přes jednoduchý JOptionPane.showOptionDialog()... To jsem myslel, že sebou seknu
Je to zhruba v půlce stránky. Stačí si vytvořit objekty, které se pak jednoduše přidají... Takže jdu celou tu práci smazat a napsat to 3 řádky
Hmm a co takto implementovat ActionListener na cely Frame a potom overridnut jedinu metodu ActionPerformed(ActionEvent e) asi takto:
public class Xyz extends JFrame implements ActionListener {
...
JButton anoButton;
JButton nieButton;
...
...
@Override
public void ActionPerformed(ActionEvent e) {
if (e.getSource().equals(anoButton)) {
//co sa ma urobit
...
}
if (e.getSource().equals(nieButton)) {
//co sa ma v tomto pripade vykonat
...
}
}
}