Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: miksi repaint() turmelee JPanelini?

Freeze [23.10.2013 17:40:04]

#

Paneelien rakenne:

GUI
 |
GUI.contentPane(backGround)
| ' ' ' ' ' ' ' ' ' ' ' ' ' | ' ' ' ' '
panel1' ' ' ' ' ' panel2
| ' ' ' ' ' ' ' ' ' ' ' ' ' | ' ' ' ' '
* ' ' ' ' ' ' ' grafiikka
' ' ' ' ' ' ' ' ' ' ' ' ' ' | ' ' ' ' '
' ' ' ' ' ' ' ' ' ' ' ' ' ' X ' ' ' ' '

'grafiikka'-paneeli on extended JPanel, jolle piirretään seuraavalla tavalla paintComponent @Override tapahtuessa:

    private void doDrawing(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;
        //tekstuurin määrittely
        texture_test = new TexturePaint(imgBuffer_test, new Rectangle(0, 0, this.width, this.height));
		//tämän halutaan näkyvän
		g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
        //apply
	    g2d.setPaint(texture_test);
		//kuvan rullaus (epäkesko että nähdään piirtyykö alle jäävä alue, koska objekti on pyöreä
        g2d.rotate(Math.toRadians(this.angle), 20 ,50);
	    //piirretään ympyrän edelläm. asetuksilla
	    g2d.fillOval(1, 1, this.width -2, this.height-2);
      	//turhat pois
		g2d.dispose();

   }

   	@Override
	public void paintComponent(Graphics g) {

		//oma instanssi
        Graphics2D g2d = (Graphics2D) g;
		//tausta veks
        g2d.setComposite ( AlphaComposite.getInstance ( AlphaComposite.SRC_OVER, 0.0f ) );
		//piirto
        super.paintComponent(g);
		//roinaa taustan päälle
        doDrawing(g);
        //turhat pois
        g2d.dispose();

	}

kun muutan kulmaa vaikka komennolla reDraw(getGraphics());

joka kutsuu,

    private void reDraw(Graphics g) {
    	//asd
    	if (g != null) {
    		//request että 'grafiikka'-luokka(?) piirretään uusiksi
	        repaint(0,0,width,height);
    	}
    }

mutta ei suinkaan tapahdu mitä pitäis... kuvassa fail

Miksi ? Miten saan ton piirtämään kunnolla sen sijaan että sä räveltää tohon jotain täysin luonnotonta!

Metabolix [23.10.2013 17:45:10]

#

En ymmärrä, mitä varten reDraw-funktiolla on tuollainen parametri ja mistä oikein revit sille arvon tai miksi ylipäänsä sinulla on tuollainen reDraw-funktio. Komponentin päivittämiseen ei tarvita mitään getGraphics-kutsua.

Freeze [23.10.2013 17:47:10]

#

Koitin tossa niin pitkään kaikenlaista että nähtävästi oon survonu sinne kourakaupalla myös epäolennaisuuksia.

Regardless, tulos on aina sama tai ei päivitystä.

Kuten näät ei kyseisessä voidissa edes käytetä tuota parametriä mihinkään :)

edit: saman tuloksen saa vaikka kutsuu suoraan

repaint();

//tai

repaint(x,y,width,height);

Flai [24.10.2013 00:26:28]

#

nämä "g2d.dispose();" rivit vaikuttavat erittäin epäilyttäviltä. Huomioi se, että rivi "Graphics2D g2d = (Graphics2D) g;" ei suinkaan luo uutta objektia, vaan ainoastaan castaa 'g'-muuttujan tyypin Graphics2D:ksi, ja asettaa sen arvon g2d:hen. Koita ottaa nuo rivit pois, ja katso vaikuttaako.

maka78 [24.10.2013 09:22:39]

#

jotennii haiskahtaa nyt siltä että nuita piirtopintoja ei hanskata oikein. Taitaa tuo nappi tulla piirretyksi sille piirtopinnalle jota viimeksi ollaan käpistelty?
Itellä on tosin vähän aikaa (pari vuotta) kun viimeksi olen javalla mitään tehnyt.
Mutta tuo koodinpätkä ei taida nyt sisältää ihan kaikkea oleellista ongelmaan liittyvää.

Freeze [24.10.2013 14:12:51]

#

Kiitos vastauksista,

Sain selvitettyä että jostain syystä kuvan kaltainen tapaturma saadaan aikaiseksi kun repaint(); ajetaan pinnalle johon pallo piirretään.

Sen sijaan panel2.repaint(); (joka on siis paneli jossa on paneli pallolle) saa aikaan oikeanlaisen tuloksen.

ymmärtääkseni tämä repaint(); on pelkkä liputus ohjelmalle, että tiedetään pinnan olevan likainen ja kaikki elementit sillä piirretään uudestaan.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta