Jak je to s tím kreslením vlastně (?) – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak je to s tím kreslením vlastně (?) – Java – Fórum – Programujte.comJak je to s tím kreslením vlastně (?) – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
pidgin0
Návštěvník
23. 2. 2012   #1
-
0
-

Ahoj, potřeboval bych trochu poradit. Jedná se spíš o takový pokus než o nějakou konkrétní aplikaci. Ale zkrátka: zkouším si vytvořit třídu Platno která bude mít metodu s parametrem  void kresli(Shape tvar) a dále chci mít třídu Ctverec, která bude mít metodu vykresli, kde zavolám metodu Platno.vykresli(ctverec) a na platno se vykreslí čtverec. Problém bude že mi trochu uniká, jak to s tím kreslicím nástrojem ( pojmenoval jsem si ho g2d ) vlastně je. Protože metoda kresli ve třídě Platno nekreslí. (?) Jsem co se týče grafiky v Javě naprostý začátečník a na webu jsem hledal a našel jsem pouze příklady, kde se vše zadá do void paint() ale já bych chtěl předávat této metod tvary, které by se následně kreslily. Budu vděčen za radu. Přikládám pro jistotu všechny třídy.

package obrazce;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import javax.swing.JPanel;

public class Platno extends JPanel {

    public static Platno platno = null;
    Color backGround = Color.orange;
    private Graphics2D g2d;


    private Platno() {
        this.setBackground(backGround);
    }

    public static Platno getPlatno() {
        if(platno == null) {
            platno = new Platno();
            return platno;
        }
        else
            return platno;
    }
    
    @Override
    public void paintComponent(Graphics g) {
        System.out.println("paint comp");
        super.paintComponent(g);
        g2d = (Graphics2D) g;
    }
    

    public void kresli(Shape tvar) {
        while(g2d == null) this.repaint(); // toto musím volat
// jinak se stane že tuto metodu zavolám ještě před tím než
// je inicializována proměnná g2d
// JE MI JASNÉ ŽE JE TO NAPROSTÁ PITOMOST, ALE NEVÍM JAK Z TOHO VEN
// TAK ABY TO FUNGOVALO
                                 
        g2d.setColor(Color.black);
        g2d.draw(tvar);
        this.repaint();
    }

}

package obrazce;

import java.awt.Rectangle;

public class Ctverec {

    Platno platno;
    int N;

    public Ctverec(int N) {
        this.N = N;
        platno = Platno.getPlatno();
    }

    public void vykresli() {
        Rectangle rg = new Rectangle(10, 10, 100, 100);
        platno.kresli(rg);
    }

}

Zbylé třídy:

package obrazce;


public class Main {


    public static void main(String[] args) {
        Okno okno = Okno.getOkno();
        Ctverec ctv = new Ctverec(50);
        ctv.vykresli();
    }

}


package obrazce;

import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;

public class Okno extends JFrame {

    static public Okno okno = null;
    int width = 400;
    int height = 400;

    private Okno() {
        super("titulek");
        this.setVisible(true);
        setSize(width, height);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // Vytvoreni platna
        Platno pl = Platno.getPlatno();
        pl.setPreferredSize(new Dimension(width, height));
        
        this.add(pl);
        this.pack();
    }

    public static Okno getOkno() {
        if(okno == null) {
            okno = new Okno();
            return okno;
        }
        else
            return okno;
    }


}
Nahlásit jako SPAM
IP: 94.113.121.–
zlz
~ Anonymní uživatel
634 příspěvků
23. 2. 2012   #2
-
+1
-
Zajímavé

Ten Graphics, který dostaneš v paintComponent, bys neměl používat nikde jinde. Toho, o co se snažíš, můžeš dosáhnout třeba nějak takhle:

public class Platno extends JPanel {
    private BufferedImage img;
    ...
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, null);
    }
	
    public void kresli(Shape tvar) {
        if (img == null) {
            img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
        }
		
        Graphics2D g = (Graphics2D) img.getGraphics();
        g.draw(tvar);
    }
}
Nahlásit jako SPAM
IP: 213.211.51.–
pidgin0
Návštěvník
23. 2. 2012   #3
-
0
-

#2 zlz

Děkuji velmi za kód, funguje to. Musím si tedy projít co a jak se tam provádí. Jediné čemu se u toho velmi divím je, že mi to v konstruktoru zrušilo nastavení this.setBackground(background). Teď je pozadí JPanelu nevím proč černé (?)  a já řeším jak to udělat aby mělo barvu tokovou jakou chci.

Ale jestli máš pocit, že si na to musím odpovědět sám, tak ok, Já na to nějak přijdu. Ale kdyby se ti chtělo mi odpovědět ještě na tuto otázku, tak by mi to nevadilo. Samozřejmě bych se takhle mohl ptát do nekonečna :-) To nebudu.

Nahlásit jako SPAM
IP: 94.113.121.–
pidgin0
Návštěvník
23. 2. 2012   #4
-
0
-

#3 pidgin
Jen co jsem napsal příspěvek, tak jsem na to přišel. Musím vykreslit, ještě před tvarem Rectangle, jiný Rectangle, který bude mít velikost celého okna nazvat jej pozadím a pak dát g.setColor(barvaPozadi) a pak g.fill(pozadi). A teď teprve na to pozadí vykreslovat tvar/tvary.

Takže děkuji za moc za pomoc a teď už se budu snažit sám.

Pro jistotu přikládám kód kdyby někoho zajímal:

public void kresli(Shape tvar) {
        if (img == null) {
            img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
        }
        System.out.println(getWidth() + " " + getHeight());

        Graphics2D g = (Graphics2D) img.getGraphics();

        // Vykreslení pozadí
        Rectangle pozadi = new Rectangle(0,0,getWidth(), getHeight());
        g.setColor(barvaPozadi);
        g.fill(pozadi);

        // vykreslení parametru metody
        g.setColor(Color.red);
        g.draw(tvar);
    }
Nahlásit jako SPAM
IP: 94.113.121.–
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ů

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ý