Zeichenprogramm

A

Anton2k

Gast
Hallo,
Ein Testprogramm für ein größeres was ich Plane lässt mich bereits verzweifeln. Ziel meines Programmes soll es sein das ich mich mit den Grafikfunktionen vertraut mache die ich dann wenn ich das eigentliche Programm schreibe verwenden möchte. Und einfach testen kann was am meisten sinn macht.
Aktuell soll es ein einfach Objekt basiertes Zeichenprogramm sein.
1. Ich hab mein Fenster, mit den Randelementen (NORTH,EAST,..) Im Center bereich möchte ich die Zeichenfläche haben. Diese soll 2000*2000 Pixel groß sein. Aus logischen Platzgründen sollte diese in einem JScrollPane untergebracht werden sodas man den sichtbaren ausschnitt der Zeichenfläche verschieben kann. Klappt nur leider nicht wirklich. Hatte als Zeichenfläche ein Canvas gedacht (vieleicht ist ein anderes Objekt sinnvoller?). Ordne ich dieses Canvas (hab die Farbe auf Blau gesetzt) der ScrollPanel zu sehe ich nur am Rand des Scrollpanels etwas Blau...wie ein Rahmen. Waran liegt das und wie kann man es so drehen das es im vordergrund ist?
2. Hab natürlich gesucht und Beispiel programm dazu gefunden. Welches ein Eigenes Canvas erstellt hat was von JPanel abgeleitet wurde. Dort hat es Funktioniert im Beispiel programm. Hab ich diese neue Canvas Componente meinem Center bereich zugeordnet wollte es wieder nicht. Was mich zu dem Schluss bring das es an irgend etwas anderem liegt was ich gerade noch nicht kapiere.
3. Das Programm wird erst einmal Simple Grafikobjekte Platzieren. Kreise, Vierecke, Striche. Für jedes gibt es je ein Eigenes Objekt in welchen es diese Methode gibt:

public void draw(Graphics g) {
g.setColor(GetFarbe());
g.drawLine(GetX1(),GetY1(),GetX2(),GetY2());

}

rufe ich sie Entsprechend auf wird es auch gezeichnet. Dann wurde aber irgendwo erwähnt man sollte lieber PaintComponent überschreiben anstelle von draw. Was ist sinnvoller?
4. Das ganze soll möglichst schnell neu gezeichnet werden können (wird erst im finalen Programm wichtig). Ist das vorgehen denn generell richtig diese Objekte in einem Array anzuordnen dieses dann zu durchlaufen und jeweils draw() für jedes Objekt aufzurufen? Oder gibt es eine sinnvollere möglichkeit?

Viele fragen aber ich hoffe man kann mir ein paar Tipps geben die mir weiter helfen.
 

The_S

Top Contributor
1. Ich hab mein Fenster, mit den Randelementen (NORTH,EAST,..) Im Center bereich möchte ich die Zeichenfläche haben. Diese soll 2000*2000 Pixel groß sein. Aus logischen Platzgründen sollte diese in einem JScrollPane untergebracht werden sodas man den sichtbaren ausschnitt der Zeichenfläche verschieben kann. Klappt nur leider nicht wirklich. Hatte als Zeichenfläche ein Canvas gedacht (vieleicht ist ein anderes Objekt sinnvoller?). Ordne ich dieses Canvas (hab die Farbe auf Blau gesetzt) der ScrollPanel zu sehe ich nur am Rand des Scrollpanels etwas Blau...wie ein Rahmen. Waran liegt das und wie kann man es so drehen das es im vordergrund ist?

Dein Canvas bzw. dein JPanel wird keine Größe gesetzt haben. Woher soll das ScrollPane denn wissen, wie weit es scrollen muss?

2. Hab natürlich gesucht und Beispiel programm dazu gefunden. Welches ein Eigenes Canvas erstellt hat was von JPanel abgeleitet wurde. Dort hat es Funktioniert im Beispiel programm. Hab ich diese neue Canvas Componente meinem Center bereich zugeordnet wollte es wieder nicht. Was mich zu dem Schluss bring das es an irgend etwas anderem liegt was ich gerade noch nicht kapiere.

Wenn du Swing verwendest, nimmst du ein JPanel, wenn du AWT verwendest, nimmst du ein Canvas.

3. Das Programm wird erst einmal Simple Grafikobjekte Platzieren. Kreise, Vierecke, Striche. Für jedes gibt es je ein Eigenes Objekt in welchen es diese Methode gibt:

public void draw(Graphics g) {
g.setColor(GetFarbe());
g.drawLine(GetX1(),GetY1(),GetX2(),GetY2());

}

rufe ich sie Entsprechend auf wird es auch gezeichnet. Dann wurde aber irgendwo erwähnt man sollte lieber PaintComponent überschreiben anstelle von draw. Was ist sinnvoller?

Methoden sind schon sinnvoller. Diese müssen aber aus der paintComponent-Methode aufgerufen werden.

4. Das ganze soll möglichst schnell neu gezeichnet werden können (wird erst im finalen Programm wichtig). Ist das vorgehen denn generell richtig diese Objekte in einem Array anzuordnen dieses dann zu durchlaufen und jeweils draw() für jedes Objekt aufzurufen? Oder gibt es eine sinnvollere möglichkeit?

Wenn wirklich sehr viele Objekte gezeichnet werden sollen, und die Performance kritisch wird, könntest du alles bisher gezeichnete in einem Bild puffern und dieses Bild mit jeder neu gezeichneten Komponente ergänzen. Aber mach dir darüber mal noch keine Gedanken ;) .
 
A

Anton2k

Gast
Danke für die Schnell Antwort.
Bei meinem Canvas hab ich die größte gesetzt man sieht es auch am Rand der sichtbar ist. Setze ich die größe auf 100x100 und das Scrollpane ist größer. Sehe ich den Farbigen rand des drunter liegenden Canvas nur bis 100px breite. Soweit funktioniert es anscheinend.
Gut da ich auf Swing aufgesetzt hab werde ich das ganze noch einmal mit einem JPanel versuchen ob es dann besser klappt.
 
A

Anton2k

Gast
Das hier ist der Code den ich für meinen Zeichenbereich der Scrollbar sein soll angelegt habe:

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


public class myScrollpane extends JScrollPane {

JPanel Zeichen = new JPanel();

public myScrollpane(){
horizontalScrollBar.setVisible(true);
verticalScrollBar.setVisible(true);
Zeichen.setSize(500, 500);
Zeichen.setBackground(new Color(255,0,255));
add(Zeichen);

}
}

Und hier wie es aussieht wenn ich das ganze dann dem Center Bereich zuordne und laufen lasse.
Bild ansehen » problem.jpg » 250kb.de
Man sieht in diesem falle das der Center bereich größer als 500 ist und den Rosa Rahmen der entsprechende den 500*500 Pixeln meines JPanels ist.
 

Quaxli

Top Contributor
Probier mal:

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


public class myScrollpane extends JScrollPane {


  public myScrollpane(){

    JPanel zeichen = new JPanel();  //namen sollte man klein schreiben
    zeichen.setPreferredSize(2000,2000);
    zeichen.setBackground(new Color(255,0,255));

    horizontalScrollBar.setVisible(true);
    verticalScrollBar.setVisible(true);
    add(zeichen);

  }
}
 

Anton2k

Aktives Mitglied
Hab es wie vorgeschlagen angepasst.
Code:
import javax.swing.*;
import java.awt.*;


public class myScrollpane extends JScrollPane {

	public myScrollpane(){
		JPanel zeichen = new JPanel();
		zeichen.setPreferredSize(new Dimension(500,500));
		zeichen.setBackground(new Color(255,0,255));
		
		horizontalScrollBar.setVisible(true);
		verticalScrollBar.setVisible(true);
		add(zeichen);
		
	}
}

Meine Startklasse, hab testweise mal alles rausgenommen und nur noch meine Zeichenklasse drin gelassen

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

public class start {

	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setBounds(0,0,300,300);
		//Menu m = new Menu();
		//Knoepfe k = new Knoepfe();
		myScrollpane z = new myScrollpane();
		//z.setAutoscrolls(true);
		
		f.add(z,BorderLayout.CENTER);
		//f.add(m,BorderLayout.WEST);
		//f.add(k,BorderLayout.EAST);

		f.setVisible(true);

	}

}

Das ganze hatte nur den effekt das auch der entsprächend gefärbte Rand nicht mehr sichtbar war, unabhängig ob ich meine EAST und WEST bereiche drin lasse oder nicht.Schliesse draus das es an sich nur am Aufbau meiner Testklasse myScrollPanel liegt.
 

The_S

Top Contributor
Wer erbt denn von einem JScrollPane? Ist ja ganz schrecklich ...

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

public class start {

	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setBounds(0,0,300,300);
		JPanel zeichen = new JPanel();
		zeichen.setPreferredSize(new Dimension(500,500));
		zeichen.setBackground(new Color(255,0,255));
		
		f.add(new JScrollPane(zeichnen),BorderLayout.CENTER);

		f.setVisible(true);

	}
}

Klassen schreibt man btw groß.
 

Anton2k

Aktives Mitglied
Danke da sind gerade wieder ein paar Lampen mehr bei mir angegangen wie es zu funktionieren hat. Auf jeden fall klappt es so. Arbeite auch noch hart dran nen sauberen Programmierstiel einzuhalten.
 

Ähnliche Java Themen

Neue Themen


Oben