JPanel, JFrame, paint() und wo ist mein Viereck ?

Status
Nicht offen für weitere Antworten.
K

kasimier

Gast
hi,

ich versuche grad mit java warm zu werden und etwas zu zeichnen und muss feststellen, das ist es ganz schön kompliziert ist, da auch nur mal eine popeliges Quadrat hinzubekommen.

Habe mir ein JFrame angelegt, das auch angezeigt wird und so wie ich das verstanden hatte, wird die paint methode automatisch aufgerufen, so das ich sie nicht selber händisch aufrufen musst(zumindest bei erstmaligen zeichnen).

generell haben sich mir da 2 fragen ergeben

1) Wozu das JPanel, in vielen Beispielen hab ich gesehen, das dort mit einem panel gearbeitet wird. ich versteh den unterschied nicht so ganz. habe gesehen das ich einem panel das jframe zuweisen kann mit panel.setContentPane(Componente) andererseits kann ich einen frame aber auch die contentpane geben mit frame.getcontentpane().
Wozu braucht man das panel oder warum ist es ratsam es zu benutzen

2) wieso klappt mein paint() nicht, ich werde aus dem beispielen die ich finde nicht schlau. was muss ich machen damit mein paint funktioniert.



Code:
import java.awt.Color;
import java.awt.Graphics;

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


public class SchachBrett 
{
	public static JFrame mainFrame;
	public static JPanel panel;
	public int [][] schachBrett;


	public SchachBrett() 
	{
		mainFrame = new JFrame("Schachbrett");
		mainFrame.setDefaultCloseOperation(mainFrame.EXIT_ON_CLOSE);
		mainFrame.setSize(800, 600);
		schachBrett = new int[8][8];
		
	}
	

	public void paint(Graphics g)
	{
		System.out.println("bin in paint");
		g.drawRect(30, 40, 200, 300);
	}

	public static void main(String[] args)
	{
		SchachBrett brett = new SchachBrett();
	}

}
 

Wildcard

Top Contributor
Deine Klasse ist kein JFrame (extends), sondern benutzt einen JFrame. Ergo kannst du auch keine paint Methode überschreiben, du erstellst einfach eine Methode die paint heißt, aber niemals aufgerufen wird.
 

Janus

Bekanntes Mitglied
Panel gehört zu AWT, JPanel zu Swing. die meisten verwenden das swing framework, weil es einfacher zu handhaben ist.

warum dein code nicht funktioniert ist sehr einfach zu erklären: deine paint methode ist eine freie methode an einer selbst definierten klasse und wird nie aufgerufen. du musst die paint methode des panels überschreiben. für swing besser die paintComponent methode.
 

Janus

Bekanntes Mitglied
Code:
import java.awt.Color; 
import java.awt.Graphics; 

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


public class SchachBrett extends JFrame
{ 
//   public static JFrame mainFrame; 
   public static JPanel panel; 
   public int [][] schachBrett; 


   public SchachBrett() 
   { 
//      mainFrame = new JFrame("Schachbrett"); 
        super("Schachbrett");
      setDefaultCloseOperation(mainFrame.EXIT_ON_CLOSE); 
      setSize(800, 600); 
      schachBrett = new int[8][8]; 
       
   } 
    

   public void paintComponent(Graphics g) 
   { 
      System.out.println("bin in paint"); 
      g.drawRect(30, 40, 200, 300); 
   } 

   public static void main(String[] args) 
   { 
      SchachBrett brett = new SchachBrett(); 
   } 

}
 
K

kasimier

Gast
danke, probier ich mal aus.

um was dabei zu lernen, hab noch was rumgebastelt.

dieser code malt mir kurz das rect auf den bildschirm aber wirft dabei tausende exceptions und zeichnet sich nicht richtig. ist dieser ansatz von mir jetzt auch wieder komplett falsch oder fehlt nur etwas um mit "extends JPanel" zum ziel zu kommen

Code:
public class SchachBrett extends JPanel
{
	public static JFrame mainFrame;
	//public static JPanel panel;
	public int [][] schachBrett;


	public SchachBrett() 
	{

		
	}
	
	public void paintComponent(Graphics g)
	{
	//	g.drawRect(30, 30, 100, 100);
		super.paint(g);
	}


	public static void main(String[] args)
	{
		SchachBrett brett = new SchachBrett();
		mainFrame = new JFrame("Schachbrett");
		
		mainFrame.setDefaultCloseOperation(mainFrame.EXIT_ON_CLOSE);
		mainFrame.setSize(800, 600);
		mainFrame.getContentPane().add(brett);
		mainFrame.setVisible(true);
		
		
	}

}
 

Janus

Bekanntes Mitglied
Wildcard hat gesagt.:
@Janus
JFrame hat keine paintComponent, nur eine paint
hat er nicht? naja, dann halt paint. hab die swing api nicht im kopf.

deshalb ists eigentlich immer nen guter stil, annotations zu verwenden. ein @Override davor und schon gibs nen compiler fehler, wenns die falsche methode war.
 
K

kasimier

Gast
@janus

wenn ich die paint methode in deinem beispiel benutze, hab ich den effekt das der hintergrund nicht funktioniert und den inhalt dessen annimmt, was grade auf dem desktop zu sehen ist.
 
K

kasimier

Gast
ok, so funktioniert es scheinbar, 2 klassen, eine zum zeichnen, eine für eigentliche doing

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;

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


public class ZeichneSchachBrett extends JPanel
{
 
	protected void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.drawLine(10, 10, 100, 50);
	}
}

und

Code:
import javax.swing.JFrame;


public class Schachbrett 
{
	public static JFrame mainFrame;
	
	public Schachbrett()
	{
		mainFrame = new JFrame();
		mainFrame.setDefaultCloseOperation(mainFrame.EXIT_ON_CLOSE);
		mainFrame.setSize(800,600);
		mainFrame.add(new ZeichneSchachBrett());
		mainFrame.setVisible(true);
		
	}
	
	public static void main(String []args)
	{
		new Schachbrett();
	}

}

ist das den jetzt noch objektorientiert? da ich ja eigentlich für eine tätigkeit, was normal eine methode ist, eine eigenen klasse habe. ist die lösung so sauber oder ok?
 

Tobias

Top Contributor
Naja, wenn du die Bezeichnungen etwas anders wählst, wird die Objektorientierung auch wieder sichtbar - dein Schachbrett ist ja eigentlich kein Schachbrett, sondern nur eine Klasse, die ein Fenster zusammenbaut, das ein Schachbrett (hier ZeichneSchachbrett) enthält.

mpG
Tobias
 
K

kasimier

Gast
das heist ich muss zeichen operationen in der klasse "zeichneSchachbrett" machen, und den logischen Teil dann in "Schachbrett", vermutlich wäre es sinnvoller zeichneschachbrett in panel umzubenennen ?
 

Tobias

Top Contributor
Ne, die logischen Teile kannst du auch in "ZeichneSchachbrett" machen. Was deiner Klasse "Schachbrett" fehlt ist die Ableitung von einer JComponent (in deinem Fall JPanel). Ohne das ist paintComponent() einfach irgendeine Methode, die niemals aufgerufen wird. Erst dadurch, das dein Schachbrett (wie aktuell bei deiner Klasse ZeichneSchachbrett geschehen) ein Untertyp von JComponent wird (genau das passiert nämlich wenn du "extends JPanel" in den Klassenkopf schreibst) wird paintComponent() vom Swing-Zeichenmechanismus auch aufgerufen.

mpG
Tobias
 
K

kasimier

Gast
ok, danke. denke damit komme ich erstmal weiter

mal noch ne verständnisfrage zum jframe und den panels.

ein jframe ist das was ich als "fenster" wahr nehme. ein panel stellt eine oberfläche da, die ich einem fenster hinzufügen kann. mit dem sinn und zweck, das ich innerhalb der panel's andere layouts verwenden kann und innerhalb des panels die objekte anders anordnen kann. ?

versteh ich das so richtig?
 
K

kasimier

Gast
so richtig wollen die panels bei mir nicht, hab jetzt mal versuch ein JLabel hinzuzufügen, der text des labels kommt zwar an, aber das eigentliche label nicht. hab versucht den hintergrund des labels auf blau zu setzten. was mach ich falsch? verstehe mein problem nicht, zudem der text des labels ja ankommt.

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

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

public class Schachbrett extends JPanel
{
	public static JFrame frame;
	public static JLabel label;
	
	private final int sizeX=800;
	private final int sizeY=800;
	private int [][] schachBrett; 
	
	public Schachbrett()
	{
		schachBrett = new int[8][8];
	}
	
	public void initFrame()
	{
		frame = new JFrame("Schachbrett");
		label = new JLabel("Hi");
		
		frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
		frame.setSize(sizeX, sizeY);
		frame.setLocationRelativeTo(null);
			
		this.setLayout(new BorderLayout());
		this.setBackground(Color.white);
		this.add(label, BorderLayout.CENTER);
		label.setVisible(true);
		label.setSize(50,50);
		label.setBackground(Color.blue);

		/* Dem Fenster die Arbeitsfläche hinzufügen */
		frame.getContentPane().add(this);
		frame.setVisible(true);	
	}
 
	protected void paintComponent(Graphics g)
	{
		super.paintComponent(g);
	}
	
	public static void main(String []args)
	{
		Schachbrett brett = new Schachbrett();
		brett.initFrame();
		
	}
}
 

Tobias

Top Contributor
Das Problem ist das Label nicht das Panel. JLabels sind grundsätzlich durchsichtig (was normalerweise ja auch Sinn macht). Wenn du einem JLabel eine Hintergrundfarbe gibst, mußt du es undurchsichtig machen - mit setOpaque(true).

mpG
Tobias
 

Quaxli

Top Contributor
So, damit noch einer mehr dran rumfrickelt, habe ich mal ein bißchen ausgedünnt. Jetzt schmerzen diese statischen Instanzvariablen nicht mehr so in den Augen. ;)

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

public class Schachbrett extends JPanel {
   
   JLabel label; //nur als Instanzvariable wenn später noch darauf zugegriffen werden soll
   int sizeX = 800; //wenn static, dann Variablennnamen in Großbuchstaben.
   int sizeY =800;
   //private int [][] schachBrett;  wird zumindest im Moment nicht benötigt
   
   public Schachbrett(){
      //schachBrett = new int[8][8];
      initFrame(); //Aufruf im Konstruktor, da immer notwendig
   }
   
   public void initFrame(){
      //JFrame initialisieren
  	  JFrame frame = new JFrame("Schachbrett");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //EXIT_ON_CLOSE ist static
      frame.setSize(sizeX, sizeY);
      frame.setLocationRelativeTo(null);
       
      //Einstellungen für JPanel
      setLayout(new BorderLayout());
      setBackground(Color.white);
      
      //mit dem Label rumfrickeln
      label = new JLabel("Hi");
      label.setHorizontalAlignment(JLabel.CENTER);
      label.setOpaque(true);
      label.setBackground(Color.blue);
      label.setForeground(Color.yellow);
      add(label, BorderLayout.CENTER); //Label ins Panel

      frame.add(this); //Panel ins Fenster
      frame.setVisible(true);//alles anzeigen
   }

   protected void paintComponent(Graphics g){
      super.paintComponent(g);
   }
   
   public static void main(String []args){
  	 new Schachbrett(); //Schachbrett benötigt keine Variable - Zugriff über this bzw. Methodenaufrufe
   }
   
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
W 2 JPanel in einem JFrame Java Basics - Anfänger-Themen 4
Dechasa Interface JFrame mit mehreren Übereinander liegenden JPanel Java Basics - Anfänger-Themen 5
F JFrame resize verschiebt JPanel Java Basics - Anfänger-Themen 3
S JPanel wird versetzt auf JFrame gelegt Java Basics - Anfänger-Themen 2
B JPanel/JFrame in ein Applet umwandeln (Webfähig) Java Basics - Anfänger-Themen 7
K Erste Schritte Jframe Im Jpanel Java Basics - Anfänger-Themen 4
R JFrame über einen JPanel Java Basics - Anfänger-Themen 5
J Auf einem JPanel ein JFrame platzieren Java Basics - Anfänger-Themen 10
F Unterschied JPanel und JFrame Java Basics - Anfänger-Themen 5
Developer_X Ein JFrame in einem JPanel ?! Java Basics - Anfänger-Themen 4
C jframe bzw. jpanel aktualisieren Java Basics - Anfänger-Themen 13
G Oberflächen: lieber von JFrame oder JPanel erben? Java Basics - Anfänger-Themen 3
G JPanel zu JFrame hinzufügen Java Basics - Anfänger-Themen 10
B setBackground bei JFrame und JPanel Java Basics - Anfänger-Themen 15
M JFrame und JPanel Java Basics - Anfänger-Themen 6
E von JFrame zu JPanel und wieder zurück . Java Basics - Anfänger-Themen 9
B JFrame JPanel größe ändern Java Basics - Anfänger-Themen 3
richis-fragen Optisch JPanel BorderLayout vertikaler Rand dicker als horizontaler Rand Java Basics - Anfänger-Themen 4
N Klassen Hintergrundfarbe in JPanel ändert sich nicht Java Basics - Anfänger-Themen 3
J JSON mit einem JPanel Java Basics - Anfänger-Themen 3
J Ein mit UI-Designer erstelltes JPanel einblenden Java Basics - Anfänger-Themen 0
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
M HILFE JPanel - Graphics Java Basics - Anfänger-Themen 1
B Scrollbares Fenster (JScrollPane) mit JPanel scrollt nicht Java Basics - Anfänger-Themen 3
Zeppi JPanel responsive Grid Java Basics - Anfänger-Themen 0
J JPanel in JScrollPanel Java Basics - Anfänger-Themen 4
Elyt JPanel als HintergrundBild Java Basics - Anfänger-Themen 7
B Wie kann man an ein JPanel eine Scrollbar anheften? Java Basics - Anfänger-Themen 8
O Swing JPanel Java Basics - Anfänger-Themen 4
CptK Klassen JPanel nach Ablauf der Spielzeit neuladen Java Basics - Anfänger-Themen 2
S JPanel wird nicht angezeigt Java Basics - Anfänger-Themen 1
D Animation JPanel Java Basics - Anfänger-Themen 1
M JLabels "verrutschen" beim übergeben von JPanel Java Basics - Anfänger-Themen 2
D Auf angeklicktes JPanel zugreifen Java Basics - Anfänger-Themen 5
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
D JPanel passt die Größe nicht an Java Basics - Anfänger-Themen 22
Y Webinhalt JPanel Java Basics - Anfänger-Themen 6
D Erste Schritte JPanel verschiebt Fenster via setVisible Java Basics - Anfänger-Themen 5
S JPanel variablenabhängig erstellen Java Basics - Anfänger-Themen 13
J Methoden Dinge auf einem JPanel paltzieren Java Basics - Anfänger-Themen 1
Z JPanel wird zweimal hinterinander gezeichnet.. Wieso? Java Basics - Anfänger-Themen 4
A altes JPanel entfernen und neues öffnen Java Basics - Anfänger-Themen 5
I A0-Format in jpanel anzeigen Java Basics - Anfänger-Themen 1
R NullPointerException wegen JPanel oder doch nicht ? Java Basics - Anfänger-Themen 7
J Probleme mit eigenem JPanel (IDE Eclipse) Java Basics - Anfänger-Themen 4
V jab ich eclipse verrückt gemacht :D ? array Jpanel, Jlabel Grafik Fehler / Frage Java Basics - Anfänger-Themen 5
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
I Problem mit JPanel Java Basics - Anfänger-Themen 0
B JPanel ändert die Hintergrundfarbe nicht Java Basics - Anfänger-Themen 2
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
C JPanel in MessageDialog Java Basics - Anfänger-Themen 1
S Inhalt von JPanel erst nach Resize sichtbar Java Basics - Anfänger-Themen 2
M Listener einerm JPanel hinzufuegen Java Basics - Anfänger-Themen 3
gamebreiti Methoden JPanel nach clearAll() und add neu zeichnen Java Basics - Anfänger-Themen 1
S vom JPanel aus durch Mouselistener Internet aufrufen Java Basics - Anfänger-Themen 6
Z JPanel bleibt leer Java Basics - Anfänger-Themen 2
E Bild per Verzeichnis/JFileChooser auf JPanel laden Java Basics - Anfänger-Themen 13
Q JPanel Java Basics - Anfänger-Themen 2
K Erste Schritte jpanel in einer klasse auslagern Java Basics - Anfänger-Themen 3
I Anfängerfrage JPanel repaint() Java Basics - Anfänger-Themen 6
N String auf JPanel bewegen Java Basics - Anfänger-Themen 6
S Layout mit JPanel in JScrollPanel funktioniert nicht Java Basics - Anfänger-Themen 3
S JPanel drucken -> PrinterException Java Basics - Anfänger-Themen 2
B JPanel -JTable Java Basics - Anfänger-Themen 2
H JPanel Hintergrund transparent setzen? Java Basics - Anfänger-Themen 10
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
L zoomen aus jpanel Java Basics - Anfänger-Themen 7
P Bekomme in meinen JPanel nur eine JComponente angezeigt Java Basics - Anfänger-Themen 7
A Methoden repaint() zeichnet JPanel falsch Java Basics - Anfänger-Themen 3
I Veränderungen am JPanel vom JDialog aus Java Basics - Anfänger-Themen 6
F JPanel zu klein Java Basics - Anfänger-Themen 5
D GUI - Objekte in JPanel nach oben schieben Java Basics - Anfänger-Themen 2
S JPanel wird nicht eingefügt Java Basics - Anfänger-Themen 3
P Netbeans Platform - JLabel und JPanel setLocation Problem Java Basics - Anfänger-Themen 2
Kenan89 JPanel mit JTable Java Basics - Anfänger-Themen 9
I JPanel in JPanel Java Basics - Anfänger-Themen 2
A Zugriff auf Komponente innerhalb einer JPanel Java Basics - Anfänger-Themen 8
S JPanel anzeige Java Basics - Anfänger-Themen 2
propra Wie mache ich einem JPanel mein bereits instanziertes Model bekannt Java Basics - Anfänger-Themen 9
T Zugreifen auf JPanel Java Basics - Anfänger-Themen 4
K JPanel auslagern Java Basics - Anfänger-Themen 9
J Paint Methode von JPanel aufrufen Java Basics - Anfänger-Themen 15
T Tastendruck simulieren in JPanel Java Basics - Anfänger-Themen 3
P JPanel in JTable einfügen Java Basics - Anfänger-Themen 23
E Erste Schritte Objekte werden in JPanel angedockt und maximiert Java Basics - Anfänger-Themen 7
M Componenten auf JPanel anzeigen Java Basics - Anfänger-Themen 2
F JPanel als JPG - weisse Fläche Java Basics - Anfänger-Themen 9
L Image laden und auf jPanel ausgeben Java Basics - Anfänger-Themen 7
M JLabel auf JPanel positionieren Java Basics - Anfänger-Themen 8
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
M MouseListener funkioniert auf JPanel nicht Java Basics - Anfänger-Themen 8
D JPanel + ein JLabel Java Basics - Anfänger-Themen 8
B JPanel-Oberfläche speichern Java Basics - Anfänger-Themen 9
X JTable in JPanel in JTabbedPane mouseevent von jtable kommt nicht durch Java Basics - Anfänger-Themen 3
P GUI, JPanel Java Basics - Anfänger-Themen 7
H JPanel in andere Klasse übergeben Java Basics - Anfänger-Themen 7
D Grösse eines JPanel hinsichtlich LayoutManager festlegen Java Basics - Anfänger-Themen 4
B JPanel über anderem JPanel Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben