Archief - [PROG][Java] JFrame & Canvas

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Jellepunk

Legacy Member
Hoi,

Ik ben beizg met een eigen versie van Tetris in elkaar te botsen. Ik ken al aardig wat Java maar met GUI's kan ik nog niet werken. Ik heb een klasse canvas gevonden die een canvas aanmaakt in een nieuwe JFrame.
Deze klasse heb ik zelf niet ontworpen maar ik snap wel wat ze doet.
Als ik mijn blokken laat vallen, moet ik telkens mijn canvas opnieuw tekenen. Dit gaat traag en is volgens mij inefficient. Is er een manier om meerdere canvassen in 1 JFrame te steken zodat ik die ene canvas kan refreshen en de rest blijft zoals ze is? of heb ik het verkeerd op en kan je iets tekenen en verwijderen op een canvas zonder die te moeten refreshen?

Of heb ik het volledig verkeerd op?

MacK

Legacy Member
Maak anders een klasse TetriPanel aan die overerft van JPanel en waarin je de paint methode overschrijft? Dat gaat vrij vlot. En dan elke keer als je iets doet (een blokje zakt,..) roep je repaint() aan.

en dan (veronderstellend dat JFrame frame geldig is ) natuurlijk ook
frame.add(myTetriPanel);

eventueel kan je meerdere panels toevoegen aan je JFrame (een scoreveld of zo)..

Anyway, geen idee of dit alles gaat. Ik programmeer zelf in C# en m'n java ervaring met swing is minimaal.

Jellepunk

Legacy Member
MacK zei:
Maak anders een klasse TetriPanel aan die overerft van JPanel en waarin je de paint methode overschrijft? Dat gaat vrij vlot. En dan elke keer als je iets doet (een blokje zakt,..) roep je repaint() aan.

en dan (veronderstellend dat JFrame frame geldig is ) natuurlijk ook
frame.add(myTetriPanel);

eventueel kan je meerdere panels toevoegen aan je JFrame (een scoreveld of zo)..

Anyway, geen idee of dit alles gaat. Ik programmeer zelf in C# en m'n java ervaring met swing is minimaal.

Bedankt, ik ken overerving maar heb het nog nooit moeten toepassen, maar ik zal het zeker eens proberen, spijtig genoeg heb ik nu weinig tijd, maar toch bedankt voor de reply!

MilM

Legacy Member
Via die standaard swing kun je trouwens ook een deel slechts repainten via een opgegeven rechthoek.
Dan kun je zorgen dat hij niet alles repaint, maar enkel het gedeelte dat veranderd werd.

jodeman

Legacy Member
Ik zou gewoon niet werken met Canvas, gewoon JPanel's in uw game steken en die kunt ge allemaal apart laten tekenen.

Jellepunk

Legacy Member
jodeman zei:
Ik zou gewoon niet werken met Canvas, gewoon JPanel's in uw game steken en die kunt ge allemaal apart laten tekenen.

is een JPanel niet het venster? sorry ik ben echt totaal nieuw met de swing/awt klasses.

Ik zal het een bezien

jodeman

Legacy Member
nee, JPanel is ook gewoon een JComponent die je kan toevoegen aan je JFrame. Ja kan in een JPanel nog andere JPanels insteken. Het goed positioneren is soms wel een klucht.

edit : vbtje
Code:
package core;

import java.awt.Color;
import java.awt.Dimension;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {
	public static void main(String[]args) {
		JFrame fr = new JFrame();
		JPanel j1 = new JPanel();
		JPanel j2 = new JPanel();
		
		j1.setLocation(0, 0);
		j1.setSize(50, 100);
		
		j2.setLocation(51, 100);
		j2.setSize(50, 100);
		
		j1.setBackground(Color.BLACK);
		j2.setBackground(Color.BLUE);
		
		fr.add(j1);
		fr.add(j2);
		
		fr.setVisible(true);
		fr.setSize(new Dimension(100,100));
		fr.validate();
		
		ArrayList<JPanel> JPanels = new ArrayList<JPanel>();
                JPanels.add(j1);
		JPanels.add(j2);
		
		/* Zo kun je alle panels bv laten refreshen */
		for(JPanel p : JPanels) {
			p.repaint();
		}
	}
}

MilM

Legacy Member
Je gebruikt waarschijnlijk maar één "panel"
Indien je verschillende panels wilt in uw venster, dan kun je beter een layoutmanager gebruiken ipv uw panels zelf te positioneren. (bekijk het venster als de omkadering en het panel als de binnenkant)

Voorbeelden zijn:
borderlayout
boxlayout
flowlayout (standaard dacht ik ?)
....

en een vrij krachtige is Gridbaglayout.

Maar dat is allemaal voor het positioneren van verschillende componenten.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan