ActionListener na JButton nefunguje – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

ActionListener na JButton nefunguje – Java – Fórum – Programujte.comActionListener na JButton nefunguje – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
avalagne0
Newbie
5. 4. 2012   #1
-
0
-

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);
            }
        });
    }

Děkuji za jakékoliv rady...  

Nahlásit jako SPAM
IP: 85.13.126.–
Antilles0
Stálý člen
5. 4. 2012   #2
-
0
-

Ahoj, mně se to zdá správně, ale nevidím do metody (a nevidím metody) buttonAnoActionPerformed() a buttonNeActionPerformed().

A tak doporučuji jak já říkám "zero level debug" a to zjistit jestli je přidaný listener a to třeba takhle:

buttonAno.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Stisknuto ano");
            }

            private void buttonAnoActionPerformed(ActionEvent e) {
                dialogOkno.setVisible(false);
            }
});

buttonNe.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Stisknuto ne");
            }
            
            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.
avalagne0
Newbie
5. 4. 2012   #3
-
0
-

#2 Antilles
Určitě do nich vidíš, jsou tam   Jen si je nejspíš přehlédnul... Tady jsou:

private void buttonAnoActionPerformed(ActionEvent e) {
                dialogOkno.setVisible(false);
            }

private void buttonNeActionPerformed(ActionEvent e) {
                dialogOkno.setVisible(false);
            

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...

Nahlásit jako SPAM
IP: 85.13.126.–
Antilles0
Stálý člen
5. 4. 2012   #4
-
0
-

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);
	}
    
}

A potom bude

buttonAno.addActionListener(new Akce(dialogOkno));

Ale je to divný, že to nejde. To, co tu předvádíš, bejvá jedoduchej funkční a bezproblémovej způsob.  

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.
avalagne0
Newbie
5. 4. 2012   #5
-
0
-

#4 Antilles
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.

Nahlásit jako SPAM
IP: 85.13.126.–
Antilles0
Stálý člen
5. 4. 2012   #6
-
0
-

#5 avalagne
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.
avalagne0
Newbie
5. 4. 2012   #7
-
0
-

#6 Antilles
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.

Nahlásit jako SPAM
IP: 85.13.126.–
Antilles0
Stálý člen
5. 4. 2012   #8
-
0
-

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.
avalagne0
Newbie
5. 4. 2012   #9
-
0
-

#8 Antilles
To mi kámoš taky říkal... Ať zkusím JFrame. Ale nevidím důvod, proč by to tady nemělo jít.

Každopádně díky za rady...   Napsal jsem na stackoverflow, tak uvidíme, jestli se toho tam někdo ujme   
Když se něco dozvím, podělím se...

Nahlásit jako SPAM
IP: 85.13.126.–
avalagne0
Newbie
5. 4. 2012   #10
-
0
-

   

Chce se mi brečet   Celý problém byl v tom, že jsem vytvářel actionListenery po nastavení dialogového okna na true. Já hledal úplně jiný chyby  

Takže celý kód je správně, stačí ty actionListenery vložit nad:

dialogOkno.setVisible(true);
Nahlásit jako SPAM
IP: 85.13.126.–
Antilles0
Stálý člen
6. 4. 2012   #11
-
0
-

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.
avalagne0
Newbie
6. 4. 2012   #12
-
0
-

#11 Antilles
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  

Je to pro mě ponaučení, že stačilo číst.

Snad to někomu pomůže, dávám vyřešeno.

EDIT: zapomněl jsem ten odkaz: http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

Nahlásit jako SPAM
IP: 85.13.126.–
Antilles0
Stálý člen
6. 4. 2012   #13
-
0
-

Sakra JOptionPane.showOptionDialog() taky znám. Nenapadlo mě, že tu tvoříš to samé :-D .. to je ta práce v půlnoci :))

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.
avalagne0
Newbie
6. 4. 2012   #14
-
0
-

#13 Antilles
Horší je, že to dělám od odpoledne (s přestávkama)... A teď mi tam ukážou, že to jde udělat tak jednoduše  

EDIT: Zde přikládám pro ukázku kód... Jak je to jednoduché oproti tomu, co jsem psal výše...

// vytvoreni moznosti pro tlacitka
        Object[] moznostiTlacitek = {"Ano", "Ne"};

        int n = JOptionPane.showOptionDialog(this, "Opravdu chcete ukončit"
                + " program?",
                "Ukončit program",
                JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
                null, moznostiTlacitek, moznostiTlacitek[0]);
        
        if (n == 0) {
            // kdyz vybereme "Ano" (moznostiTlacitek[0]), ukoncime program
            System.exit(0);
        }

Výsledek:

Nahlásit jako SPAM
IP: 85.13.126.–
sleepy0
Stálý člen
7. 4. 2012   #15
-
+1
-
Zajímavé

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
			...
		}
	}
}
Nahlásit jako SPAM
IP: 213.215.67.–
avalagne0
Newbie
8. 4. 2012   #16
-
0
-

#15 sleepy
Jasně, to je taky možnost. Nakonec jsem to vyřešil jinak... Tak jak jsem uvedl.

Nahlásit jako SPAM
IP: 83.208.55.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 27 hostů

Podobná vlákna

ActionListener+MouseListener — založil unik421

ActionListener problém — založil Karel58

Jbutton a povolování — založil lubanek

JButton volá metodu — založil Marek Kadlčík

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý