JPanel und paintComponent

Kanitrino

Bekanntes Mitglied
Hallo Experten,

Ich schreibe meine Gui normalerweise separat als JPanel. Diese besteht dann wieder aus mehreren Unter-JPanels mit verschiedenen Layouts.

Nun möchte ich einige Kreise in die Gui eibringen. Das geht ganz einfach mit einer paintComponent-Methode und fillOval(x, y, d, d).

Aber ist das nicht zu einfach ? Ich male die Kreise in das Gesamt-JPanel dahin, wo's auf meinem Bildschirm gerade passt, ungeachtet der Teil-JPanels, in die sie ja eigentlich , zusammen mit einigen JRadioButtons und JLabels jeweils hineingehören.

Kann man die PaintComponent-Methode an ein (Unter-)JPanel anbinden, so dass die Kreise zu diesem "gehören" ?

Eine Idee wäre es, die Unter-JPanels als jeweils eigene Klasse mit eigener paintComponent-Methode und eigenen JRadioButtons zu entwerfen und sie dann in das Gesamtkunstwerk einzufügen. Das kommt mir aber recht aufwändig vor - geht es denn nicht einfacher ?
 
Ich hab nicht ganz verstanden was du meinst... Aber ich nehme immer, wenn ich etwas zeichne, eine eingene Klasse, die von JComponent abgeleitet ist und die paintComponent Methode überschreibt.
 
Hallo Runtime,

Ich vermute, dass Du das Richtige verstanden hast.
Hier nochmal anders dargestellt : Wenn ich einen Kreis (O) in die Gui zeichnen will, sollte ich mich besser auf den Nullpunkt x0 des Teil-Panels beziehen, als auf den Nullpunkt xGes des Gesamt-Panels, oder ? Aber wie ?

______________
|xGes................|
|______________|
|......................|
|______________|
|x0...................|
|.........O...........|
|......................|
|______________|
 
Dazu musst du die paintComponent-Methode der entsprechenden Komponente überschreiben.
Wenn du paintComponent aus dem obersten/äußersten/umfassenden JPanel überschreibst, dann sind die Koordinaten (0, 0) in der oberen linken Ecke des Fensters. Wenn du aber die paintComponent-Methode einer im äußeren JPanel enthaltenen Komponente überschreibst, bezieht sich (0, 0) relativ zu der Komponente, d.h. es entspricht der oberen linken Ecke dieser Komponente.

In deinem Fall also die paintComponent-Methode der entsprechenden "Teil-Panels" überschreiben, nicht die des "Gesamt-Panels" 🙂
 
Hi, anstelle von
JPanel
nimmst du
DrawPanel jp = new DrawPanel();
und die Klasse sieht so aus:
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tictactoegui;

/**
 *
 * @author c.weitemeyer
 */
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

class DrawPanel extends JPanel
{


    public DrawPanel()
    {
        addMouseListener(new MouseAdapter() {
          @Override
          public void mouseClicked(MouseEvent me) {
              MouseClicked(me);
           
          }
        });
        addMouseMotionListener(new MouseAdapter() {
          @Override
          public void mouseMoved(MouseEvent me) {
              MouseMoved(me);

          }
        });

    }   



   }

   private void MouseMoved(MouseEvent evt)
   {
        //Code
        repaint();
   }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);

       //Code, z.B:
        for (int i = 1; i <= 4; i++) {
            g.drawLine(i * 50, 50, i * 50, 200);
            g.drawLine(50, i * 50, 200, 50 * i);

        }
      
    }  
}

Dann sind die Angaben in paintComponent() relativ zur Position von DrawPanel.


Edit: Mouselistener brauchst du nicht zwingend, ich hab sie nur drinnen zum demonstrieren das du die jedem DrawPanel eigene geben kannst wenn du das für Sinnvoll hältst.
 
Zuletzt bearbeitet:

Zurück
Oben