Wie kann meine Klasse in ein JPanel zeichnen?

droink

Mitglied
Hallo,

ich möchte in meine Klasse eine Methode schreiben die es mir erlaubt bestimmte kreise und rechtecke in ein panel zu zeichnen. Hierbei soll allerdings das panel in einer anderen klasse erstellt werden und lediglich an die methode übergeben werden. Das ganze soll in etwa so aussehen:

public class Slot extends ISlot {

public Slot(){}

public void draw(Jpanel panel){
...
...
...
}
}

Bisher hab ich es nur hingekriegt direkt eine JPanel Klasse zu erstellen und dann über das überschreiben der paint(graphics g) methode in das panel zu zeichnen. Weiss aber nicht wie das gehen soll wenn ich lediglich ein JPanel übergeben bekomme. Hoffe jemand kann mir helfen.

Danke im voraus!
 

droink

Mitglied
Naja bisher hab ich das Zeichnen in einem JPanel so realisiert, dass ich eine eigene Klasse erstellt habe welche von JPanel geerbt hat. In dieser Klasse habe ich dann die Methode paintComponent überschrieben. Das ganze sah in etwa so aus:

Java:
class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillOval(10, 10, 10, 10);
// usw....
}

Jetzt habe ich allerdings eine eigene Klasse die lediglich ein bereits vorhandenes JPanel übergeben bekommt. Ich weiss nicht wie ich dann in dieses Panel eine Rechteck oder so zeichnen soll. Sozusagen ich weiss nicht wie ich auf die paintComponent Methode meines Panels zugreife um ihr zusagen sie soll ein weiteres Rechteck hinzufügen. Das ganze sieht so aus:

Java:
 class MyClass {

public void drawMyClass(JPanel jpanel){
// Hier will ich jetzt sagen, dass in jpanel z.b. noch ein Rechteck eingezeichnet werden soll
}
}
Hoffe es ist jetzt ein bisschen verständlicher, kann auch sein, dass ich total auf dem Schlauch stehe und die Lösung ist total simpel...
 

droink

Mitglied
Habe mir ein Panel gebaut und jetzt mal folgendes ausprobiert:

Java:
public void drawtest(JPanel panel){
		Graphics g = panel.getGraphics();
		Graphics2D g2 = (Graphics2D)g;
		g2.draw(new Line2D.Double(30,30,80,80)); //hier kommt eine nullpointer exception
		panel.paint(g2);
		
	}

Jetzt kommt allerdings in der Zeile g2.draw... eine nullpointer exception. Weiss jemand was ich falsch mache?
 

JanHH

Top Contributor
Na Du rufst einfach innerhalb der Paint-Funktion der Klasse, die das Panel erstellt/beinhaltet, die besagte Funktion der anderen Klasse, mit "Graphics g" als Parameter, auf.
 

Illuvatar

Top Contributor
Hmm... das JPanel muss sich schon selber zeichnen, anders geht das nicht.
Der Standardweg wäre, ein Interface von der Art zu schreiben
[Java]public interface Drawable {
public void draw (Graphics g);
}[/Java]
In deinem JPanel hast du dann eine [c]List<Drawable> drawables[/c] und machst
[Java]public void paintComponent(Graphics g) {
super.paintComponent(g);
for (Drawable object : drawables) {
object.draw(g);
}
}[/Java]

Edit: Und wenn dann halt ne andere Klasse sich auf den Panel zeichnen will, muss die andere Klasse eben [c]panel.addDrawable(this)[/c] oder so machen
 

droink

Mitglied
Heisst das, ich kann nur in ein JPanel zeichnen wenn ich dessen paintComponent Methode modifiziere? Was ist wenn ich sie nicht modifizieren kann? Kann man nicht ein graphics objekt erzeugen, in diesem graphics objekt irgendwie alle Zeichenoperationen speichern und dann einfach nur das Graphics Objekt dem Panel zu übergeben?

Mein Ziel ist es dass ein Anwender sein eigenes JPanel erzeugt. Dieses bekommt mein Programm übermittelt und zeichnet darin ein paar rechtecke oder sowas.
 

slawaweis

Bekanntes Mitglied
Heisst das, ich kann nur in ein JPanel zeichnen wenn ich dessen paintComponent Methode modifiziere? Was ist wenn ich sie nicht modifizieren kann? Kann man nicht ein graphics objekt erzeugen, in diesem graphics objekt irgendwie alle Zeichenoperationen speichern und dann einfach nur das Graphics Objekt dem Panel zu übergeben?
das Design von Java erfordert die Vorgehensweise, dass man paint bzw. paintComponent überschreibt, um darin zeichnen zu können.

Mein Ziel ist es dass ein Anwender sein eigenes JPanel erzeugt. Dieses bekommt mein Programm übermittelt und zeichnet darin ein paar rechtecke oder sowas.
wieso überhaupt? Die normale Vorgehensweise in so einen Fall wäre, dass der Anwender nicht von JPanel ableitet, sondern von der eigenen Klasse MyPanel, wo die benötigten Operationen bereits drin sind.

Es gibt da noch ein paar Möglichkeiten. 1) über das Icon Interface. D.h. der Anwender erstellt kein eigens JPanel, sondern ein JLabel, welches nur ein Icon anzeigt. Über das zugewiesene Icon wird dann in das JLabel gemalt. 2) über ein BufferedImage. D.h. der Anwender bekommt eine Grafik und muss selber zusehen, wie diese in seinem Programm angezeigt wird. 3) über SwingX. SwingX ist die offizielle Erweiterung von Swing, welche noch nicht mit Java ausgeliefert wird. Kann man aber problemlos bekommen und in den Classpath einfügen:

https://swingx.dev.java.net/

SwingX enthält die Komponente JXPanel, welche wiederum das Interface Painter aufnehmen kann, was eigentlich das ist, was Du mit deinem Interface "ISlot" haben willst. An dieser Stelle wollte ich auf das JavaDoc von JXPanel und Painter verweisen, aber ich finde keine aktuelle Version online.

EDIT: noch ein Vorgehen. 4) Wenn man das JPanel bekommt, darauf GridLayout(1, 1) setzen und seine eigene Komponente einfügen. Das wäre doppelt gemoppelt und das Anwender JPanel darf keine anderen Sachen enthalten. Weiterhin muss man dafür Sorgen, dass die eigene Komponente aus dem Anwender JPanel entfernt wird, wenn die Zeichenoperationen nicht mehr benötigt werden.

Slawa
 
Zuletzt bearbeitet:

Cola_Colin

Top Contributor
das Design von Java erfordert die Vorgehensweise, dass man paint bzw. paintComponent überschreibt, um darin zeichnen zu können.

Das verwirrt mich jetzt gerade ziemlich.

Ich dem Projekt, an dem ich seit Monaten arbeite funktioniert das so Problemlos:
Java:
    public static void main(String[] args) {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        board = new JPanel();
        RootClass.game = new Engine(board, "game.ini", "game.log");
        frame.add(board);
[...]
     }

Java:
    public Engine(JPanel b, String iniFileName, String logFileName) {
[...]
        board = b;
[...]
    }

Java:
// Teil der Hauptschleife:
                    Graphics g = board.getGraphics();
                    if (g != null) {
                        renderFrame(g);
                        g.dispose();
                  }

Java:
    public void renderFrame(Graphics g) {
[...]
// backbuffer ist ein VolatileImage, auf dem Vorher die Spielszene gezeichnet wurde.
            g.drawImage(backBuffer, 0, 0, board.getWidth(), board.getHeight(), 0,
                    0, round(cordWidth * cordFactor), round(cordHeight * cordFactor),
                    null);
    }

Solange die Grafikkarte mit dem Volatileimage mitspielt hab ich so auch ein paar hundert Fps.
Keine Spur von Problemen damit ???:L
 

Cola_Colin

Top Contributor

Je nach Spielszene teils sogar 1000+, hätte ich es nicht auf ~60 limitiert, ich weiß nicht was daran so lustig sein soll :p

Naja, wenn das so nicht vorgesehen ist (Schande über die Websiten auf denen es so oder ähnlich vorgeschlagen wurde), dann schau ich mal das ich das ändere.

EDIT:
Java API zu getGraphics hat gesagt.:
Returns this component's graphics context, which lets you draw on a component. Use this method to get a Graphics object and then invoke operations on that object to draw on the component.

Keine Warnung nichts
Was den nun, sagt die API da falsches von sich ????
 
Zuletzt bearbeitet:

slawaweis

Bekanntes Mitglied
Das verwirrt mich jetzt gerade ziemlich.

Ich dem Projekt, an dem ich seit Monaten arbeite funktioniert das so Problemlos:
dieses Vorgehen ist aber für einen speziellen Zweck. Dabei wird ein eigener Thread verwendet, welcher das Neuzeichnen anstößt. In diesem Fall sollte man aber mindestens update() auf dem Panel abschalten, damit das Betriebssystem einem nicht in die Quere kommt.

Java:
// Teil der Hauptschleife:
                    Graphics g = board.getGraphics();
                    if (g != null) {
                        renderFrame(g);
                        g.dispose();
                  }
bei jedem Neuzeichnen ein neues Graphics-Objekt?

Java:
    public void renderFrame(Graphics g) {
[...]
// backbuffer ist ein VolatileImage, auf dem Vorher die Spielszene gezeichnet wurde.
            g.drawImage(backBuffer, 0, 0, board.getWidth(), board.getHeight(), 0,
                    0, round(cordWidth * cordFactor), round(cordHeight * cordFactor),
                    null);
    }
meiner Erfahrung nach ist die Skalierfunktion von Java nicht besonders performant. Deshalb sollte man besser den Backbuffer schon in der richtigen Größe haben und in renderFrame() nur 1:1 zeichnen.

Solange die Grafikkarte mit dem Volatileimage mitspielt hab ich so auch ein paar hundert Fps.
Keine Spur von Problemen damit ???:L
ich würde in so einem Fall eine bessere FPS-Messfunktion schreiben oder suchen.

Slawa
 

Cola_Colin

Top Contributor
dieses Vorgehen ist aber für einen speziellen Zweck. Dabei wird ein eigener Thread verwendet, welcher das Neuzeichnen anstößt. In diesem Fall sollte man aber mindestens update() auf dem Panel abschalten, damit das Betriebssystem einem nicht in die Quere kommt.
Na also, das Neuzeichnen ist natürlich in einem eigenem Thread ;)
Da bin ich ja beruhigt. Was kann ich das update abschalten ?

bei jedem Neuzeichnen ein neues Graphics-Objekt?
hrhr, ja ich weiß, ist noch nicht final bzw. macht anders irgendwo Probleme.

meiner Erfahrung nach ist die Skalierfunktion von Java nicht besonders performant. Deshalb sollte man besser den Backbuffer schon in der richtigen Größe haben und in renderFrame() nur 1:1 zeichnen.
Die Fenstergröße läßt sich so während das Programm läuft jederzeit vergrößern oder verkleinern.
Sehr praktisch, imho.

Auch verwende ich die um die Qualität zu verbessern. backBuffer + Inhalt ist je nach Einstellung verschieden groß.

ich würde in so einem Fall eine bessere FPS-Messfunktion schreiben oder suchen.

Wieso sollte ein paar Hundert FPS mit dem VolatileImage und ein paar Bitmapgrafiken nicht realistisch sein ;)

Wenn ich das FPS limit auf 20 einstelle, stellt sich ein merkbares leichtes ruckeln ein, von daher wird das Meßverfahren + Limitierungsverfahren durchaus nicht total falsch liegen.
Ingametimer, die auf Basis des gleichen Zeitgebers laufen, laufen auch korrekt.
Habs mit einer Stoppuhr abgeglichen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
N Klassen Warum kann meine Klasse nicht auf Methoden der anderen Klasse zugreifen? Java Basics - Anfänger-Themen 6
B Ist meine Klasse richtig kommentiert? Java Basics - Anfänger-Themen 2
K Klassen Meine Klasse wird nicht anerkannt Java Basics - Anfänger-Themen 7
S OOP Wie muss meine Klasse zu dieser main aussehen? Java Basics - Anfänger-Themen 5
R Meine erste Klasse: Punkt Java Basics - Anfänger-Themen 3
S daten per url in meine Klasse? Java Basics - Anfänger-Themen 12
A meine eigene IO Klasse Java Basics - Anfänger-Themen 3
G Public class??? Findet meine Klasse nicht. Java Basics - Anfänger-Themen 5
C Rechnen mit Brüchen, ist meine Lösung soweit richtig? Java Basics - Anfänger-Themen 4
A Methoden Guten Tag , ich wollte so machen dass wenn meine frog an eine fly/bee geht dann an meine Tafel geht der zahl +1 hoch. Java Basics - Anfänger-Themen 2
J Meine Mails gehen nicht raus Java Basics - Anfänger-Themen 8
W Streams in Java und was bedeutet meine Konsolen-Ausgabe? Java Basics - Anfänger-Themen 4
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
C60 Methoden Main-Methode erkennt meine Arrays nicht. Java Basics - Anfänger-Themen 7
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
O Warum ist meine Antwort falsch? Java Basics - Anfänger-Themen 3
E Meine JCombobox werte an ohne selectiert zu haben Java Basics - Anfänger-Themen 6
Zrebna Umgebungsvariable Wieso wird meine verwendete JDK-Version in der Prompt nicht erkannt? Java Basics - Anfänger-Themen 6
B Sind meine If-Statements richtig angesetzt ? Java Basics - Anfänger-Themen 27
N Wie kann ich eine meine Variable Final machen? Java Basics - Anfänger-Themen 1
L Worauf muss ich achten, wenn ich externe Bibliotheken für meine Anwendungen verwende? Java Basics - Anfänger-Themen 6
B Warum werden meine System.out.println's übersprungen? Java Basics - Anfänger-Themen 9
W Wie kann ich meine Methode aufrufen? Java Basics - Anfänger-Themen 29
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
H Meine Tabelle befüllen in .fxml Java Basics - Anfänger-Themen 16
E Warum kann ich meine jar-Datei nicht öffnen Java Basics - Anfänger-Themen 20
WPS1000 Input/Output Wie aktiviere ich den Daten Transfer von der RS232 in meine Java Applikation Java Basics - Anfänger-Themen 2
T Rekursion Warum bricht meine Funktion nicht ab Java Basics - Anfänger-Themen 4
S Meine Java "Wahrsagerin" Java Basics - Anfänger-Themen 9
C Ich brauche hilfe für meine Klausur Java Basics - Anfänger-Themen 13
W Wie lasse ich meine Ausgabe nach dem Lesen verschwinden ? Java Basics - Anfänger-Themen 1
W Warum funktioniert meine if Anweisung nicht? Java Basics - Anfänger-Themen 8
R Meine Ratemaschine Java Basics - Anfänger-Themen 3
V Warum speichert meine String-Variable nummerische Werte? Java Basics - Anfänger-Themen 3
V Erste Schritte Warum geht meine continue Anweisung nicht? Java Basics - Anfänger-Themen 8
GreenTeaYT HashMap dupliziert meine Elemente? Java Basics - Anfänger-Themen 2
J Erste Schritte Vorsicht Spaghetti-Code! Wie verschachtel ich meine If-Anweisung??? Java Basics - Anfänger-Themen 4
snipesss Eclipse Neon findet meine Projekte nicht? Java Basics - Anfänger-Themen 1
snipesss IDE findet meine .txt Datei nicht! Java Basics - Anfänger-Themen 12
J Verstehe meine HashSet Ausgabe nicht Java Basics - Anfänger-Themen 5
E Erste Schritte [Noob] Warum geht meine For-Schleife nicht? Java Basics - Anfänger-Themen 2
E Erste Schritte [Noob-Frage] Meine If-Abfrage macht nicht, was sie soll... Java Basics - Anfänger-Themen 2
J Erste Schritte .class datei in meine form inkludieren Java Basics - Anfänger-Themen 3
D Wie bekomme ich meine Ausgabe in Form von "2^x" hin? Java Basics - Anfänger-Themen 1
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
C Meine erste Funktion Java Basics - Anfänger-Themen 12
A Meine erste Bibliothek erstellen Java Basics - Anfänger-Themen 24
Z Meine ersten Gehversuche Java Basics - Anfänger-Themen 11
Dit_ Ich kenne meine Koordinaten. Wo bin ich? Java Basics - Anfänger-Themen 2
M Suche Korrektor für meine Lösung (FH: Java1 - Übungsklausur) Java Basics - Anfänger-Themen 4
J Datentypen Meine Hashliste ist nicht unique Java Basics - Anfänger-Themen 5
M Meine erste Java Programmierung funzt nicht :-( Java Basics - Anfänger-Themen 34
C Denkanstoss für meine Auswertung Java Basics - Anfänger-Themen 5
L Warum erkennt java meine methode nicht? Java Basics - Anfänger-Themen 17
S Irgendwie kann ich meine Eclipse Projekte nicht mehr veraendern..? Java Basics - Anfänger-Themen 5
M Wo sind meine double-Zahlen? Java Basics - Anfänger-Themen 2
A Hilfe meine Titel werden alle abgelehnt Java Basics - Anfänger-Themen 4
K Wieso schaltet meine CheckBox von selbst um ? Java Basics - Anfänger-Themen 31
K Warum adiert meine Methode nicht die eins ? Java Basics - Anfänger-Themen 19
K Warum wird meine Graphik zwei Mal gezeichnet ? Java Basics - Anfänger-Themen 12
Kr0e Eclips + JOGL -> Wo ist meine MAIN-Funktion hin ? Java Basics - Anfänger-Themen 9
U Habe meine .class files gelöscht. Java Basics - Anfänger-Themen 3
gummibaerchen Methode überschreibt meine Variable Java Basics - Anfänger-Themen 5
N Programm das mir anzeigt wo meine Freundin ist. Java Basics - Anfänger-Themen 10
Schandro Meine Fragensammlung Java Basics - Anfänger-Themen 9
D Meine SetMethode geht nicht || Fenster schließen Java Basics - Anfänger-Themen 3
T Java Programm ordnet meine Objecte immer falsch an Java Basics - Anfänger-Themen 4
M wie kann ich meine Projekte auf einen stick speichern? Java Basics - Anfänger-Themen 6
S Wie ist meine Strucktur Java Basics - Anfänger-Themen 11
F Eingabe darf nur 1 oder 0 sein. Meine Lösung macht Probleme. Java Basics - Anfänger-Themen 8
A Möchte Java - Chat in meine Homepage einbinden. Java Basics - Anfänger-Themen 4
M meine ersten versuche Java Basics - Anfänger-Themen 8
M wie pack ich das swt in meine *.jar Java Basics - Anfänger-Themen 8
S ich stör schon widr wegen meine gui Java Basics - Anfänger-Themen 2
R Welches inferface und somit welche IP benutzt meine JVM? Java Basics - Anfänger-Themen 2
M Meine Java Programm hägt durch waitFor() ! HILFE! Java Basics - Anfänger-Themen 10
G Meine erste IF Abfrage Java Basics - Anfänger-Themen 11
G wie meine java applikation installierbar machen? Java Basics - Anfänger-Themen 11
R BorderLayout macht meine Zeichnung kaputt Java Basics - Anfänger-Themen 14
A Parsen einer XML-Datei: Wo sind meine Start-Tags??? Java Basics - Anfänger-Themen 22
A Buttons für meine Homepage Java Basics - Anfänger-Themen 2
P meine java applets laufen nicht bei meinen freunden Java Basics - Anfänger-Themen 5
G Klassen: Wann initialisiere ich wo meine Variabeln Java Basics - Anfänger-Themen 6
K Mein Pc will meine Programme nicht kompilieren Java Basics - Anfänger-Themen 2
J Warum funktioniert meine Umwandlung nicht? Java Basics - Anfänger-Themen 3
I @Inject in normaler Klasse? Java Basics - Anfänger-Themen 4
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Klasse in Runden Klammern bei Objektimplementierung Java Basics - Anfänger-Themen 4
J Klassen Klasse als Komponententyp bei Feldern Java Basics - Anfänger-Themen 2
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
Detlef Bosau nichtstatische Innere Klasse, this Pointer. Java Basics - Anfänger-Themen 47

Ähnliche Java Themen

Neue Themen


Oben