Diskuze: Vykreslovanie

Java Java Vykreslovanie

Avatar
sphex
Člen
Avatar
sphex:

Vedeli by ste mi povedať prečo mi to nechce vykresliť obrázok?

package semestralka;

import GUI.Frame;
import GUI.Pozadie;

import java.awt.*;
import javax.swing.*;



/**
 *
 * @author Rado
 */
public class Semestralka {



    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Frame frame = new Frame();
        Hra hra = new Hra(frame);


    }

}
package GUI;

import java.awt.*;
import javax.swing.*;

/**
 *
 * @author RSabo
 */
public class ObrazkyKariet extends JPanel {

private final ImageIcon ikona;
private final Image obrazok;
private int x;
private int y;

    public ObrazkyKariet(String menoKarty,int x,int y) {
        this.ikona = new ImageIcon(getClass().getResource("/obrazky/"+menoKarty+".png"));
        this.obrazok = ikona.getImage();
        this.setPreferredSize(new Dimension(400, 300));
        this.setBackground(Color.RED);
        this.x = x;
        this.y = y;
        this.setVisible(true);

    }

     public Image getImage(){
         return this.obrazok;
     }

@Override
    public void paintComponent(Graphics g){
        g.drawImage(obrazok, this.x, this.y, 200, 270, null);
        super.paintComponent(g);
    }


}
package Hrac;

import GUI.ObrazkyKariet;
import GUI.Obrazok;
import java.awt.Graphics;
import javax.swing.*;

/**
 *
 * @author RSabo
 */
public class Hra {
    private Postava hrac1;
    private Postava hrac2;
    private Stol stol1;
    private Stol stol2;
    private JFrame frame;
    private ObrazkyKariet jl1;


    public Hra(JFrame frame) {
        this.frame = frame;
        this.hrac1 = new Postava();
        this.hrac2 = new Postava();
        this.stol1 = new Stol(hrac1);
        this.stol2 = new Stol(hrac2);
        this.hrac2.setFalseJeNaTahu();
        this.paintComponent();
    }

    public void hrac1VyhodKartu(int i){
        if(this.hrac1.getJeNaTahu()==true){
            this.stol1.vyhodKartu(i, hrac1);
        }
    }

    public void hrac2VyhodKartu(int i){
        if(this.hrac2.getJeNaTahu()==true){
            this.stol2.vyhodKartu(i, hrac2);
        }
    }

    public void hrac1KoniecKola(){
        if(this.hrac1.getJeNaTahu()==true){
            this.hrac1.koniecKola(hrac2);
            this.stol1.dajKartu();
            for(int i = 0;i<this.stol1.getSize();i++){
                this.stol1.dajKartuCislo(i).nepouzita();
            }
        }
    }

    public void hrac2KoniecKola(){
        if(this.hrac2.getJeNaTahu()==true){
            this.hrac2.koniecKola(hrac1);
            this.stol2.dajKartu();
            for(int i = 0;i<this.stol2.getSize();i++){
                this.stol2.dajKartuCislo(i).nepouzita();
            }
        }
    }

    public void hrac1ZautocNaKatu(int i,int j){
        if(this.hrac1.getJeNaTahu()==true){
            if(this.stol1.dajKartuCislo(i).jePouzita() == false){
                this.stol1.dajKartuCislo(i).zautocNaKartu(this.stol2.dajKartuCislo(j));
                this.stol1.dajKartuCislo(i).pouzita();
            }
        }
        this.stol1.vymazZnicenuKartu();
        this.stol2.vymazZnicenuKartu();
    }

    public void hrac2ZautocNaKatu(int i,int j){
        if(this.hrac2.getJeNaTahu()==true){
            if(this.stol2.dajKartuCislo(i).jePouzita() == false){
                this.stol2.dajKartuCislo(i).zautocNaKartu(this.stol1.dajKartuCislo(j));
                this.stol2.dajKartuCislo(i).pouzita();
            }
        }
        this.stol1.vymazZnicenuKartu();
        this.stol2.vymazZnicenuKartu();
    }

    public void hrac1ZautocNaPostavu(int i){
        if(this.hrac1.getJeNaTahu()==true){
            if(this.stol1.dajKartuCislo(i).jePouzita() == false){
                this.stol1.dajKartuCislo(i).zautocNaPostavu(hrac2);
                this.stol1.dajKartuCislo(i).pouzita();
            }
        }
    }

    public void hrac2ZautocNaPostavu(int i){
        if(this.hrac2.getJeNaTahu()==true){
            if(this.stol2.dajKartuCislo(i).jePouzita() == false){
                this.stol2.dajKartuCislo(i).zautocNaPostavu(hrac1);
                this.stol2.dajKartuCislo(i).pouzita();
            }
        }
    }
    public void paintComponent(){

        String meno = this.stol1.dajKartuZRukyCislo(0).getMeno();
        jl1 = new ObrazkyKariet(meno,20,500);

        //frame.add(jl1);
        //g.drawImage(jl1.getImage(), 0, 0, null);

    }
}
 
Odpovědět 16. května 13:52
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:

Zajímavé...takže zkusím za tebe popsat funčknost programu, protože jsi nepopsal, co vlastně děláš a navíc když pošleš ústřižky některých tříd, které používají jiné třídy, ke kterým nemáme přístup, tak ani nemůžu ve vlastním IDEčku zkusit, co ti to (ne)dělá atd.

  1. Takže předpokládám že třída Semestralka je hlavní třída programu, která vytvoří nějaký JFrame a který předá hře (což je vcelku dost divné, proč už sama třída neobsahuje nějaký frame?)
  2. Třída ObrazkyKariet napovídá, že pracuješ s kartama. Tam ti trošku upřesním smysl volání atributů instance slovíčkem this. Příkaz "this" používáš hlavně ve dvou případech.
    1. pokud má instance stejný název atributu jako název parametru v metodě/konstruk­toru. Např.:
public class Ukazka{
        private int cislo;
        public Ukazka(int cislo){
                this.cislo = cislo;
        }
}

V tomto případě je this povinné, neboť vynecháš-li jej, tak se v konstruktoru jeho číselný parametr
naplní tím samým parametrem (což i chytřejší IDEčka hlásí jako nesmysl).
b) pokud chceš použít v nějaké části kódu tuto samou instanci, jako parametr

public class Ukazka implements Runnable{
        private Thread vlakno;
        public void run(){
                //vlákno
        }
        public void start(){
                if(vlakno == null || !vlakno.isAlive()){
                        vlakno = new Thread(this);
                        vlakno.start();
                }
        }
}

Ve tvém případě nemusíš (kromě atributů x a y) this používat, vypadá to blbě, zavádí to a je to
zbytečné. Jinak (to si osobně myslím) máš pěkně ošetřený případ, pokud nebudeš mít k dispozici
obrázky karet ve stejném adresáři tím, že nastavuješ pozadí na červeno. Aspoň se něco zobrazí. Dobrá
práce;).

  1. Trošku nechápu, že nastavuješ rozměry karty na (400, 300) a rozměry obrázku na (200, 270). Má to nějaký význam?
  2. Ve třídě Hra nastavuješ dva hráče (dvě třídy Postava) a pak vytváříš dva stoly a ke každému stolu přidáváš jednoho hráče.... Není to trošku proti logice? proč neposadíš oba hráče k jednomu stolu?:D
  3. CO TAM DĚLAJÍ TY METODY!!!!!!!!!!!!! proč třeba metodu hrac1VyhodKartu(int i) umí třída Hra???? neměl by to umět Hráč? nic jiného říct nemůžu, ale fuj fuj fuj

Takže nejdřív vyhoď všechna this, kde nejsou potřeba, toto ukázat zkušenému prokramátorovi, tak ti liští. Za další komentáře - máš tam 4 dokumentační komentáře, ale ty ti vygenerovalo IDEčko a pak na konci zakomentované dva řádky při testování. To je chyba. Za další trošku aspoň popiš, co děláš za projekt nebo aspoň jakou funkci teď ladíš. Z tvého kódu fakt nejde moc dedukovat, co vlastně chceš. Pak je těžké i hledat exceptiony.

Osobně si myslím, jestli je to o tom, že máš třeba poker a teď děláš tu část, že se hráčům rozdají karty a oni je ukazují na konci hry, tak bys to mohl udělat spíš tak, že každý hráč by měl metody, které umí teď třída Hra a sám by si je volal. Samotná třída hra by už jen rozdala karty, vytvořila nějaký frame, počítala skóre případně vyhodnocovala vítěze a ovládala hráče.

Rada na závěr: Vždycky, když vytvoříš nějakou třídu, zkus ji přesunout do jiného balíku či projektu (například vytvoříš-li třídu hráče, tak ho zkus použít v jiném framu) a otestuj ho, jestli funguje jak má. Jestli ano, tak máš jistotu že programuješ objektově a že objekt dělá co má. Z tvého kódu jde jasně vidět, že třída Hrac je nezbytně závislá na třídě Hra. Což je hnus.

PS: je vcelku šikovné, když používáš obrázky ve více třídách, tak si udělat singletona, který karty vykreslí případně mění. Je to efektivní, neopakuješ furt samý kód dokola, neděláš zbytečně x stejných instancí a hlavně singleton je příjemný pomocník;)

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 16. května 17:04
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 2 zpráv z 2.