NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: JLabel setText(String problem)

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

Aktivity
Avatar
Filip Gajdos
Člen
Avatar
Filip Gajdos:30.12.2017 21:47

Zdravím,
učím sa programovať v jave a pracujem na malom programe v ktorom sa majú dať zostavovať pokrové ranges.
Ešte nie je hotový ale niečo je už funkčné. Snažím sa naprogramovať jlabel v ktorom budem zobrazovať priemer.
Vytvoril som si triedu Priemer.
Tu je zdrojový kód:

package pokerranger;

import javax.swing.JLabel;
import static pokerranger.PokerRangerJFrame.IOStat;

/**
 *
 * @author filip212
 */
public class Priemer extends PokerRangerJFrame{

    private static int summary = 0;
    private static final int VELKOST = 169;

    public Priemer()
    {
        update(getLabel());
    }

    public static int vypocet(int sumary)
    {
        int vyp = 0;
        if (sumary > 0)
        {
            vyp = (VELKOST / sumary);
        }
        else
        {
            System.err.println("Priemer.java/vypocet(int sumary) chyba");
        }
        return vyp;

    }

    /**
     *
     * @param jLabel
     */
    public static void update(JLabel jLabel)
    {
        int x,vyp;
        for (x = 0; x != 171; x++)
        {
            if(IOStat[x] == true)
            {
                summary += 1;
            }
        }
        vyp = vypocet(summary);
        System.out.println("true " + vyp);
        jLabel.setText("asd" + String.valueOf(vyp));
    }
}

Tu volam v halvnej triede metodu update a vytvaram instanciu triedy Coloringg pri kliknuti na tlacitko:

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
    int uid = 0;
    Priemer.update(getLabel());

    Coloringg coloringg0 = new pokerranger.Coloringg(jButton1, IOStat, uid);

}

Trieda Coloringg:

package pokerranger;

import java.awt.Color;
import javax.swing.JButton;

/**
 *
 * @author filip212
 */
@SuppressWarnings("serial")
public class Coloringg extends PokerRangerJFrame
{
    public Coloringg(JButton jButton, boolean[] Stat, int uid)
    {
        if (Stat[uid] == false)
        {
            jButton.setBackground(Color.yellow);
            IOStat[uid] = true;
            System.out.println(" true" + IOStat[uid] + uid + " " + IOStatTemp[uid] + " " + IOStat[uid]);
        }
        else
        {
            jButton.setBackground(Color.white);
            IOStat[uid] = false;
            System.out.println(" false" + IOStat[uid] + uid + " " + IOStatTemp[uid] + " " + IOStat[uid]);
        }
    }
}

Moj problem je ze sa mi zmeni text jLabelu iba raz. Pri opakovanych kliknutiach uz text ostava rovnaky.
Vypis konzoly:

true 0
Priemer.java/vypocet(int sumary) chyba
 truetrue0 false true
true 169
 falsefalse0 false false
true 169
 truetrue0 false true
 
Odpovědět
30.12.2017 21:47
Avatar
Filip Gajdos
Člen
Avatar
Filip Gajdos:30.12.2017 21:57

Pradon mal som tam zly vzorec na vypocet oprava:
vyp = (VELKOST / sumary ) * 100;

Vypis z konzoly:

run:
true 0
Priemer.java/vypocet(int sumary) chyba
 truetrue0 false true
true 16900
 falsefalse0 false false
true 16900
 truetrue0 false true
true 8400
 falsefalse0 false false
true 8400
 truetrue0 false true
true 5600
 falsefalse0 false false
true 5600
 truetrue0 false true
BUILD SUCCESSFUL (total time: 11 seconds)

text sa zmeni na asd0

 
Nahoru Odpovědět
30.12.2017 21:57
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:2.1.2018 0:32

Ahoj.

Trošku se v tom těžko orientuje, když postuješ jen části kódu a člověk si musí hodně věcí domýšlet. Hlavně ten výpis je vcelku nesmyslný - co má to true signalizovat? co je ta hodnota? Výpis je hlavně na to, abys měl nějakou informaci, jak program daný kód zpracovává (pokud teda nedebugguješ vypisovací metodou, ale na to by ses asi neptal).

  • Postni trošku smysluplnější kód, nebo aspoň řekni, čeho chceš tím dosáhnout. Nechápu, v čem ta chyba je, zatím vidím nesmyslný výpis seskládaný z booleanovských hodnot a nějakých čísel.

PS: ve třídě Priemer:

  • místo metody vypocet(int) muzes pouzit try catch a zachytavat v metodě update(JLabel) ArithmeticExcep­tion, protože stejně tu metodu vypocet máš defakto jen proto, abys zjistil, jestli nedělíš nulou
  • V kódu
jLabel.setText("asd" + String.valueOf(vyp));

Nemusíš používat přetypování. Pokud v textovém řetězci použiješ nejdřív text v uvozovkách, tak se pak už sloučené proměnné automaticky převádí na String. Takže klidně můžeš napsat

jLabel.setText("asd" + vyp);

A hlavně bych se asi zamyslel nad strukturou programu. Už samotné předávání komponent jako parametr, není zrovna čisté programování. Komponenta by měla být vlastností nějakého panelu či framu a tudíž by měla být zapouzdřená. Jako parametr bys měl předávat hlavně hodnoty. Sice to jde, ale není to moc čisté. Pak ti může docházet k takovýmto zbytečným chybám. Mám trošku obavu, že špatně chápeš OOP. Jestli chceš, určitě nejen já, ale spousta dalších ti tu velmi rádi poradíme, ale měl by sis projít základy OOP, než se pustíš do takovéhoto projektu. Je hezké, že si chceš napsat vlastní aplikaci, ale měl bys mít osvojené nějaké základy (myslím tím praktiky OOP. Od základních pojmů třída, instance, až po polymorfismus. Už třeba z tohoto kódu mám pocit, že dědíš nejdřív v nějaké třídě ze třídy JFrame, a pak tu samou třídu dědíš někde jinde. Není to zrovna čisté)

Editováno 2.1.2018 0:34
Nahoru Odpovědět
2.1.2018 0:32
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
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 3 zpráv z 3.