IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: JavaGUI nespustí se

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Duch Ghast
Člen
Avatar
Duch Ghast:8.7.2017 19:37

Eclipse nehlásí nikde chybu ale program se nspustí

package test.DG.javaGUI;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class JavaGUI

{
        public static void main(String[] args)

        {
                int bonus = 0;
                JFrame frame = new JFrame("JavaGUI");
                JLabel lab = new JLabel("", JLabel.CENTER);
                JButton but0 = new JButton();
                JButton but1 = new JButton();
                CustomAct act0 = new CustomAct(lab);
                CustomBonus act1 = new CustomBonus(bonus);

                but0.setAction(act0);
                but0.setText("Klikni!");
                but1.setAction(act1);
                but1.setText("za 10$ \n+ 1 za kliknutí");

                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(640, 480);
                frame.setLayout(new BorderLayout ());
                frame.setResizable(false);
                frame.add(but0, BorderLayout.SOUTH);
                frame.add(but1, BorderLayout.EAST);
                frame.add(lab, BorderLayout.CENTER);
        }
}
package test.DG.javaGUI;

import java.awt.Color;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JLabel;

public class CustomAct extends AbstractAction

{
        private static final long serialVersionUID = 0;
        private JLabel lab;
        private int counter = 0;
        private int bonus = 0;
        private CustomBonus CB = new CustomBonus(bonus);

        public CustomAct(JLabel lab)

        {
                this.lab = lab;
        }

        public void actionPerformed(ActionEvent e)

        {
                lab.setText(counter + "$");
                lab.setForeground(Color.green);
                counter++;
                counter = counter + CB.getBonus();
        }

        public int getCounter() {
                return counter;
        }
}
package test.DG.javaGUI;

import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;

public class CustomBonus extends AbstractAction

{
        private static final long serialVersionUID = 0;
        private int bonus = 0;
        private CustomAct CA = new CustomAct(null);

        public CustomBonus(int bonus)

        {
                this.bonus = bonus;
        }

        public void actionPerformed(ActionEvent e)

        {
                if(CA.getCounter() < 20)
                {
                        bonus++;
                }
        }
        public int getBonus() {
                return bonus;
        }
}
 
Odpovědět
8.7.2017 19:37
Avatar
Odpovídá na Duch Ghast
Petr Štechmüller:8.7.2017 19:55

Ahoj,

v dnešní době by se mělo GUI v Jave dělat pomocí JavaFX.
Tvůj kód jsem u sebe přeložil a spustil a okno se mi normálně zobrazilo.

Můžeš zkusit ještě přidat tento řádek:

frame.pack();

Tady je odkaz na celý návod, jak tvořit GUI ve swingu.

Nahoru Odpovědět
8.7.2017 19:55
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Duch Ghast
Člen
Avatar
Duch Ghast:9.7.2017 12:35

Trochu jsem pozměnil kód

package test.DG.javaGUI;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JavaGUI

{
        public static void main(String[] args)

        {
                int bonus = 0;
                JFrame frame = new JFrame("JavaGUI");
                JButton but0 = new JButton();
                JButton but1 = new JButton();
                CustomAct act1 = new CustomAct();
                CustomBonus act2 = new CustomBonus(bonus);

                but0.setAction(act1);
                but0.setText("Klikni!");
                but1.setAction(act2);
                but1.setText("za 10$ \n+ 1 za kliknutí");

                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(640, 480);
                frame.setLayout(new BorderLayout ());
                frame.setResizable(false);
                frame.add(but0, BorderLayout.SOUTH);
                frame.add(but1, BorderLayout.EAST);
                frame.add(act1.getLab(), BorderLayout.CENTER);


        }
}


package test.DG.javaGUI;

import java.awt.Color;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JLabel;

public class CustomAct extends AbstractAction

{
        private static final long serialVersionUID = 0;
        JLabel lab = new JLabel("", JLabel.CENTER);
        private int counter = 0;
        private int bonus = 0;
        private CustomBonus CB = new CustomBonus(bonus);

        public CustomAct()

        {
        }

        public void actionPerformed(ActionEvent e)

        {
                lab.setText(counter + "$");
                lab.setForeground(Color.green);
                counter++;
                counter = counter + CB.getBonus();
        }

        public int getCounter()

        {
                return counter;
        }
        public JLabel getLab()

        {
                return lab;
        }
}



package test.DG.javaGUI;

import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;

public class CustomBonus extends AbstractAction

{
        private static final long serialVersionUID = 0;
        private int bonus = 0;
        private int cena = 20;
        private CustomAct CA = new CustomAct();

        public CustomBonus(int bonus)

        {
                this.bonus = bonus;
        }

        public void actionPerformed(ActionEvent e)

        {
                if(CA.getCounter() < cena)
                {
                        bonus++;
                        cena = cena + (cena / 10);
                }
        }

        public int getBonus()

        {
                return bonus;
        }
}

Ale když to zkompiluji a spustím jako jar soubor tak to hodí tuhle chybu

Exception in thread "main" java.lang.StackOverflowError
        at java.util.Hashtable.get(Hashtable.java:363)
        at javax.swing.UIDefaults.getFromHashtable(UIDefaults.java:173)
        at javax.swing.UIDefaults.get(UIDefaults.java:161)
        at javax.swing.MultiUIDefaults.get(MultiUIDefaults.java:58)
        at javax.swing.UIDefaults.getColor(UIDefaults.java:417)
        at javax.swing.UIManager.getColor(UIManager.java:701)
        at javax.swing.LookAndFeel.installColors(LookAndFeel.java:175)
        at javax.swing.LookAndFeel.installColorsAndFont(LookAndFeel.java:211)
        at javax.swing.plaf.basic.BasicLabelUI.installDefaults(BasicLabelUI.java:339)
        at javax.swing.plaf.basic.BasicLabelUI.installUI(BasicLabelUI.java:324)
        at javax.swing.JComponent.setUI(JComponent.java:666)
        at javax.swing.JLabel.setUI(JLabel.java:261)
        at javax.swing.JLabel.updateUI(JLabel.java:275)
        at javax.swing.JLabel.<init>(JLabel.java:164)
        at javax.swing.JLabel.<init>(JLabel.java:183)
        at test.DG.javaGUI.CustomAct.<init>(CustomAct.java:13)
        at test.DG.javaGUI.CustomBonus.<init>(CustomBonus.java:13)
        at test.DG.javaGUI.CustomAct.<init>(CustomAct.java:16)
        at test.DG.javaGUI.CustomBonus.<init>(CustomBonus.java:13)
        at test.DG.javaGUI.CustomAct.<init>(CustomAct.java:16)
        at test.DG.javaGUI.CustomBonus.<init>(CustomBonus.java:13)
        at test.DG.javaGUI.CustomAct.<init>(CustomAct.java:16)
..........
 
Nahoru Odpovědět
9.7.2017 12:35
Avatar
Odpovídá na Duch Ghast
Petr Štechmüller:9.7.2017 13:05

Vždyť tam máš rekurzivní vytváření instancí tříd CustomBonus a CustomAct, tak se nemůžeš divit, že to spadlo na StackOverflowE­rror.

Nahoru Odpovědět
9.7.2017 13:05
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Duch Ghast
Člen
Avatar
Duch Ghast:9.7.2017 21:20

Já jsem asi slepej ale tu rekurzy tam nevidím.

 
Nahoru Odpovědět
9.7.2017 21:20
Avatar
Odpovídá na Duch Ghast
Marian Benčat:9.7.2017 21:44

private CustomAct CA = new CustomAct();
...
private CustomBonus CB = new CustomBonus(bonus);

ano si.

Nahoru Odpovědět
9.7.2017 21:44
Totalitní admini..
Avatar
Duch Ghast
Člen
Avatar
Duch Ghast:9.7.2017 21:46

Tak se to už spustí ale nefunguje tlačítko na přidání bodu za kliknutí

package test.DG.javaGUI;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JavaGUI

{
        public static void main(String[] args)

        {
                JFrame frame = new JFrame("JavaGUI");
                JButton but0 = new JButton();
                JButton but1 = new JButton();
                CustomAct act1 = new CustomAct();
                CustomBonus act2 = new CustomBonus();

                but0.setAction(act1);
                but0.setText("Klikni!");
                but1.setAction(act2);
                but1.setText("za " + act2.getCena() + "$ \n+ 1 za kliknutí");

                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(640, 480);
                frame.setLayout(new BorderLayout ());
                frame.setResizable(false);
                frame.add(but0, BorderLayout.SOUTH);
                frame.add(but1, BorderLayout.EAST);
                frame.add(act1.getLab(), BorderLayout.CENTER);


        }
}

package test.DG.javaGUI;

import java.awt.Color;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JLabel;

public class CustomAct extends AbstractAction

{
        private static final long serialVersionUID = 0;
        JLabel lab = new JLabel("", JLabel.CENTER);
        private int counter = 0;

        public CustomAct()

        {

        }

        public void actionPerformed(ActionEvent e)

        {
                CustomBonus CB = new CustomBonus();

                lab.setText(counter + "$");
                lab.setForeground(Color.green);
                counter++;
                counter = counter + CB.getBonus();
        }

        public int getCounter()

        {
                return counter;
        }

        public JLabel getLab()

        {
                return lab;
        }
}


package test.DG.javaGUI;

import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;

public class CustomBonus extends AbstractAction

{
        private static final long serialVersionUID = 0;
        private int bonus = 0;
        private int cena = 10;

        public CustomBonus()

        {

        }

        public void actionPerformed(ActionEvent e)

        {
                CustomAct CA = new CustomAct();

                if(CA.getCounter() < cena)
                {
                        bonus++;
                        cena = cena + (cena / 10);
                }
        }

        public int getBonus()

        {
                return bonus;
        }

        public int getCena()

        {
                return cena;

        }
}
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
9.7.2017 21:46
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.