Graphics2D - vzdy spadne pri zavolani metody tridy – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Graphics2D - vzdy spadne pri zavolani metody tridy – Java – Fórum – Programujte.comGraphics2D - vzdy spadne pri zavolani metody tridy – Java – Fórum – Programujte.com

 

martin
~ Anonymní uživatel
1602 příspěvků
21. 9. 2012   #1
-
0
-

Ahoj, mam nasledujici kod:

// ####### Okno.java
package gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class Okno extends JFrame {
	private JPanel contentPane;
	private JPanel platno;
	private DrawImage di;	
	private int x, y;
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Okno frame = new Okno();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public Okno() {
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);

	    platno = new JPanel();		    
	    platno.setLayout(new BorderLayout()); 
	    this.getContentPane().add(platno, BorderLayout.CENTER);    
	    di = new DrawImage();

	    di.setBackground(Color.BLACK);
    //Ta barva se nikdy nenastavi :-(

	    platno.add(di, BorderLayout.CENTER);
	    
	    //di.kresliCaru(0, 0, 20, 20, Color.RED);
	    /*
    * Na tom to vzdycky spadne :-(
	     */
	}
}

// ####### DrawImage.java

package gui;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

public class DrawImage extends JPanel {	
	private Graphics2D g;

	@Override
	public void paintComponent(Graphics g1D) {
		g = (Graphics2D) g1D;
	    g.setColor(Color.RED);
	    g.drawOval(0, 0, 50, 100);
	    g.drawLine(10, 20, 50, 100);
	 }
	
	public void kresliCaru(int x1, int y1, int x2, int y2, Color barva) {
		g.setColor(barva);
		g.drawLine(x1, y1, x2, y2);		
		g.drawLine(10, 20, 50, 100);
	}
}

Nikdy se mi nedari zmenit barvu pozadi. A kdyz zavolam metodu pro kresleni usecky, tak program vzdy pri kompilaci spadne ("di.kresliCaru(0, 0, 20, 20, Color.RED);").

Jinak program normalne funguje: http://www.imagehosting.cz/?…

Muzete mi prosim poradit, kde delam chybu?

Nahlásit jako SPAM
IP: 93.89.146.–
Dano
~ Anonymní uživatel
101 příspěvků
21. 9. 2012   #2
-
0
-

Mozes prilozit stackTrace?

Nahlásit jako SPAM
IP: 195.28.127.–
martin
~ Anonymní uživatel
1602 příspěvků
21. 9. 2012   #3
-
0
-

#2 Dano
Kdyz odkomentuju ten radek di.kresliCaru(0, 0, 20, 20, Color.RED); tak to hodi:

java.lang.NullPointerException
	at gui.DrawImage.kresliCaru(DrawImage.java:19)
	at gui.Okno.<init>(Okno.java:47)
	at gui.Okno$1.run(Okno.java:19)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Nahlásit jako SPAM
IP: 93.89.146.–
KIIV
~ Moderátor
+43
God of flame
21. 9. 2012   #4
-
0
-

Neceka DrawImage ze mu hodis taky nejaky Image?

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
martin
~ Anonymní uživatel
1602 příspěvků
21. 9. 2012   #5
-
0
-

#4 KIIV
Tak Graphics vytvarim ve tride Okno a predavam ji do tridy DrawImage:

package gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

@SuppressWarnings("serial")
public class Okno extends JFrame {
	private JPanel contentPane;
	private JPanel platno;
	private DrawImage di;	
	private Graphics2D g;
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Okno frame = new Okno();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public Okno() {
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);

	    platno = new JPanel();		    
	    platno.setLayout(new BorderLayout()); 
	    this.getContentPane().add(platno, BorderLayout.CENTER);    
	    di = new DrawImage(g);
	    di.setBackground(Color.BLACK);
	    platno.add(di, BorderLayout.CENTER);
	    
	    di.kresliCaru(0, 0, 20, 20, Color.RED);

	}
}
package gui;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class DrawImage extends JPanel {	
	private Graphics2D gr;	
	public DrawImage(Graphics2D g) {
		this.gr = g;
	}
	@Override
	public void paintComponent(Graphics g1D) {
		gr = (Graphics2D) g1D;
	    gr.setColor(Color.RED);
	    gr.drawOval(0, 0, 50, 100);
	    gr.drawLine(10, 20, 50, 100);
	 }	
	public void kresliCaru(int x1, int y1, int x2, int y2, Color barva) {
		gr.setColor(barva);
		gr.drawLine(x1, y1, x2, y2);		
		gr.drawLine(10, 20, 50, 100);
	}
}

ale porad to nejde:

java.lang.NullPointerException
	at gui.DrawImage.kresliCaru(DrawImage.java:23)
	at gui.Okno.<init>(Okno.java:47)
	at gui.Okno$1.run(Okno.java:22)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

:-(

Nahlásit jako SPAM
IP: 93.89.146.–
zlz
~ Anonymní uživatel
634 příspěvků
21. 9. 2012   #6
-
0
-

Tak Graphics vytvarim ve tride Okno a predavam ji do tridy DrawImage

Nevidím, že bys ho vytvářel. Patrně tam předáváš null. Platnou hodnotu do gr přiřazuješ asi až v paintComponent, což je jednak pozdě a druhak není zaručena platnost toho Graphics mimo paintComponent.

Nejjednodušší bude, když si vytvoříš Image a budeš kreslit do něj. A v paintComponent pak budeš vykreslovat obsah toho Image. Zhruba takhle:

public class DrawImage extends JPanel {
    private BufferedImage img;

    private BufferedImage GetImage() {
        if (img == null) {
            img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
        }
        return img;
    }

    public void kresli(..neco..) {
        Graphics2D g = (Graphics2D) GetImage().getGraphics();
        g.drawNeco(..neco..);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, null);
    }
}
Nahlásit jako SPAM
IP: 78.156.159.–
zlz
~ Anonymní uživatel
634 příspěvků
21. 9. 2012   #7
-
0
-

Ups :)

g.drawImage(GetImage(), 0, 0, null);

Nebo ho třeba vytvoř v konstruktoru a používej přímo img.

Nahlásit jako SPAM
IP: 78.156.159.–
martin
~ Anonymní uživatel
1602 příspěvků
22. 9. 2012   #8
-
0
-

#6 zlz
Diky moc, uz to funguje! :-)

Prikladam kompletni funkcni kod, kdyby ho v budoucnu nekdo potreboval: 

package gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

@SuppressWarnings("serial")
public class Okno extends JFrame {

	private JPanel contentPane;
	private JPanel platno;
	private DrawImage di;
	private int oknoX = 320;
	private int oknoY = 240;	
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Okno frame = new Okno();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public Okno() {
	setResizable(false);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setBounds(100, 100, oknoX, oknoY);
	contentPane = new JPanel();
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
	contentPane.setLayout(new BorderLayout(0, 0));
	setContentPane(contentPane);

	platno = new JPanel();		    
	platno.setLayout(new BorderLayout()); 
	this.getContentPane().add(platno, BorderLayout.CENTER);    
	di = new DrawImage(oknoX, oknoY);
	di.setBackground(Color.BLACK);
	platno.add(di, BorderLayout.CENTER);
	    
	di.kresliCaru(20, 20, 50, 70, Color.RED);
	di.kresliCtverec();              
	}
}
/* ----------------------------------------------------- */
package gui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class DrawImage extends JPanel {
    private BufferedImage img;
    private int imgX = 320;
	private int imgY = 240;
	
	public DrawImage(int imgX, int imgY) {
		this.imgX = imgX;
		this.imgY = imgY;
	}

    private BufferedImage GetImage() {
        if (img == null) {
        	img = new BufferedImage(imgX, imgY, BufferedImage.TYPE_INT_RGB);
        }
        return img;
    }

    public void kresliCaru(int x1, int y1, int x2, int y2, Color barva) {
    	Graphics2D g = (Graphics2D) GetImage().createGraphics();
		g.setColor(barva);
		g.drawLine(x1, y1, x2, y2);			
	}
    
    public void kresliCtverec() {
    	Graphics2D g = (Graphics2D) GetImage().createGraphics();
    	g.drawRect(50, 60, 20, 40);		
	}

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, null);
    }
}
Nahlásit jako SPAM
IP: 93.89.146.–
Dano
~ Anonymní uživatel
101 příspěvků
22. 9. 2012   #9
-
0
-

code bude fungovat, ked samotne vykreslovanie uzavries do metodky public void paint(Graphics2D g) { ... }

public class Okno extends JFrame {

    private DrawImage di;
    ...

    public Okno() {
        ...
	// nastavenia, ako ma okno vyzerat
    }

    /**
     * Tato metodka sa vola automaticky, 
     * vzdy ked JFrame potrebude repaint ;)
     * preto ju nemusime inplicitne volat nikde v code.
     * 
     * @param g 
     */
    public void paint(Graphics2D g) {
        di.kresliCaru(0, 0, 20, 20, Color.RED);
    }
}
Nahlásit jako SPAM
IP: 91.127.65.–
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, 6 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ý