[Java] Jednoduchá hra a problém...

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod dankrul.krul 28. 4. 2012 20:19

Zdravím,

Dělám jednoduchou hru v Javě. Funguje na jednoduchém principu. Uživatel myslí na číslo od jedné do deseti a poté ho zadá do TexFieldu. Program má po stisknutí buttonu pomocí podmínky zjistit, zda se uživatelovo číslo shoduje s tím náhodně vygenerovaným, který vytvořil program. Debugger nehlásí žádnou chybu, ale přece se nic nevypíše...
Kód: Vybrat vše
package krulik.tode.cz;

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


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

public class ChytniCislo {

   /**
    * Author | Daniel Krůl
    */
   public static void main(String[] args) {
      JFrame okno = new JFrame("Chytni číslo");
      final JButton Tlacitko = new JButton("Hotovo");
      final JTextField vysledek = new JTextField("");
      JLabel text = new JLabel("<html><font color='#00CC66' align='center' size='+1'>Vítejte v této minihře Chytni Číslo!</font>  <font>Myslete na číslo od 1 do 10 a napište ho...</font></html>", JLabel.CENTER);
      final JLabel dohromady = new JLabel("Výsledek...");
      // NÁHODNÉ ČÍSLO = VYGENEROVÁNÍ PROMENNÉ nahCisla[i]
      final Random nahodne_cislo = new Random();
      final int [] nahCisla = new int[10];
      final int i = 0;
      nahCisla[i] = nahodne_cislo.nextInt(10);
      //nahCisla[i] konec
      
      okno.setVisible(true);
      okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      okno.setSize(330, 320);
      okno.setLayout(null);
      okno.setResizable(false);
      okno.setLocationRelativeTo(null);

      Tlacitko.setBounds(110, 100, 100, 50);
      vysledek.setBounds(110, 60, 100, 25);
      text.setBounds(0, 0, 330, 50);
      dohromady.setBounds(106, 160, 100, 50);
      dohromady.setBackground(Color.white);
      

      Tlacitko.addActionListener(new java.awt.event.ActionListener(){public void actionPerformed(ActionEvent e){
         int cele = Integer.parseInt(vysledek.toString());
         if(cele == nahCisla[i]){
            dohromady.setText("Vedle :( Číslo bylo:" + vypis(nahCisla[i]));
         }else {
            dohromady.setText("Vedle :( Číslo bylo:" + vypis(nahCisla[i]));
         }
   
         }
      });   
      
      okno.add(vysledek);
      okno.add(text);
      okno.add(Tlacitko);
      okno.add(dohromady);
      

   }
   public static int vypis(int arg) {
      int temp = arg;
      return temp;
   }

}

Díky za odpovědi...
dankrul.krul
Kolemjdoucí

Odeslat příspěvekod Wikan 28. 4. 2012 20:27

Proč máš (nejen) JLabel dohromady označený jako final?
Wikan
Pokročilý
Uživatelský avatar

Odeslat příspěvekod dankrul.krul 28. 4. 2012 20:31

Bez něj mi to hází chybu...
dankrul.krul
Kolemjdoucí

Odeslat příspěvekod Wikan 28. 4. 2012 20:36

No on ten celý kód je dost nesmyslný.
Wikan
Pokročilý
Uživatelský avatar

Odeslat příspěvekod xmarek 29. 4. 2012 12:25

První věc. Pokud se dohrabu k výsledku.
- Necpi ty věci do main. Tam to nemá co dělat. Takovou prasárnu by nenapsal ani Céčkař. :-[
Takže to minimálně hoď celé do konstruktoru a to pak celé zavoléj jako instanci.
- Další prasárna: Nepiš název instancí s počátečním velkým písmenem, pak to evokuje volání statické metody!
- Nepoužívéj pro vkládání věcí (komponent) přímo JFrame. Od toho je JPanel a jeho potomci.
- Nepoužívéj vkládání komponent na absolutní pozici. To se v Javě nedělá. Od toho jsou Layout Managery (http://docs.oracle.com/javase/tutorial/ ... using.html)
- To co jsi udělal v JLabel je sice pěkné, ale vzhledem, že Java podporuje různé Look&Feel Managery, tak se to nedělá.
- Nějak nerozumím tomu poli "nahCisla". K čemu to je dobré, když tam vygeneruji jednu hodnotu a tu pak předpokládám zjišťuji?
- Ten "Generátor" jsem přesunul do části co zachytává vyjímku. Přece jen se mi zdá, že hádat jedno vygenerované číslo asi není tak těžké. LOL
- Ten layout jsem neupravoval a pod Linuxem to vypadá šíleně. :-D
- Určitě by se asi našel prostor pro vylepšování, Ten kód by se dal více rosekat, vyřešit lépe ten JFormattedTextField atd., ale venku je hezky a tak jsem to moc neřešil.
- Jo a ještě jedna taková věc hodná pozornosti: Někde si zjisti jaký rozdíl je mezi referenční proměnnou a primitivním datovým typem (int, long..) ve vztahu k metodám. Je to celkem záludná věc a velmi často se lidi diví co jim z té metody pak leze.

Doufám, že jsem aspoň trochu pomohl. ;-] A nevím jak vy, ale já se jdu opalovat. :D

Kód: Vybrat vše
package krulik.tode.cz;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
*
* @author Daniel Krůl  
*/
public class ChytniCislo extends JPanel implements ActionListener {

   private JFormattedTextField vysledek = null;
   private JLabel dohromady = null;
   private int[] nahCisla;

   /**
    * Constructor
    */
   public ChytniCislo() {
      
      JButton tlacitko = new JButton("Hotovo");
      vysledek = new JFormattedTextField(NumberFormat.getInstance());
      JLabel text = new JLabel(
            "<html><font color='#00CC66' align='center' size='+1'>Vítejte v této minihře Chytni Číslo!</font><br> <font>Myslete na číslo od 1 do 10 a napište ho...</font></html>",
            JLabel.CENTER);
      dohromady = new JLabel("Výsledek...");
      // NÁHODNÉ ČÍSLO = VYGENEROVÁNÍ PROMENNÉ nahCisla[i]
      nahCisla = new int[10];

      tlacitko.setBounds(110, 100, 100, 50);
      vysledek.setBounds(110, 60, 100, 25);
      text.setBounds(0, 0, 330, 50);
      dohromady.setBounds(106, 160, 100, 50);
      dohromady.setBackground(Color.WHITE);

      tlacitko.addActionListener(this);
      setLayout(null);
      add(vysledek);
      add(text);
      add(tlacitko);
      add(dohromady);
   }

   private int vypis(int arg) {
      int temp = arg;
      return temp;
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      Random nahodne_cislo = new Random();
      nahCisla[0] = nahodne_cislo.nextInt(10);
      if ((vysledek.getValue() != null) && !"".equals(vysledek.getValue())) {
         int cele = ((Number) vysledek.getValue()).intValue();
         if (cele == nahCisla[0]) {
            dohromady.setText("Trefa :( Číslo bylo:" + vypis(nahCisla[0]) + " )");
//            System.out.println("Trefa :( Číslo bylo:" + vypis(nahCisla[0]) + " )");
         } else {
            dohromady.setText("Vedle :( Číslo bylo:" + vypis(nahCisla[0]) + " )");
//            System.out.println("Vedle :( Číslo bylo:" + vypis(nahCisla[0]) + " )");
         }
      } else {
          JOptionPane.showMessageDialog(this,"Žádná hodnota nebyla zadána.");
      }
      
   }

   private static void createAndShowGUI() {
      // Create and set up the window.
      JFrame frame = new JFrame("Chytni číslo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      // Add content to the window.
      frame.setContentPane(new ChytniCislo());

      // Display the window.
      frame.pack();
      frame.setVisible(true);
      frame.setSize(330, 320);
      frame.setLayout(null);
      frame.setResizable(false);
      frame.setLocationRelativeTo(null);
   }

   public static void main(String[] args) {
      // Schedule a job for the event dispatching thread:
      // creating and showing this application's GUI.
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            // Turn off metal's use of bold fonts
            createAndShowGUI();
         }
      });
   }
}
Celý život bojuji s průměrností :(
xmarek
Junior
Uživatelský avatar

Odeslat příspěvekod dankrul.krul 1. 5. 2012 10:16

Díky moc ;-) V Javě jsem začátečník, tak díky za rady
dankrul.krul
Kolemjdoucí

Odeslat příspěvekod satai 1. 5. 2012 10:28

Dovolim si doporucit dve knihy vhodne po zvladnuti zakladu Javy: Effective Java (u prvniho vydani byl i cesky preklad, u druheho nevim) a po case Clean Code.
Pokud to myslis vazne a nepotrebujes jen zapocet, tak je to skvela kombinace, jak se dostat dal. Clovek nekdy nepochopi napoprve, proc ta rada je dobra, casem prijde na to, ze neco jde i zlepsit, ale na prechod od "znam jazyk" k "resim v jazyku skutecne problemy" neznam nic lepsiho.
Understanding is a three edged sword. Your side, their side, and the truth.
satai
Junior
Uživatelský avatar

Odeslat příspěvekod Javaso 6. 5. 2012 20:53

Javaso
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 3 návštevníků