paintComponent malt bei repaint() Rahmen um Panel

Rakasch

Mitglied
Auf einem JPanel hab ich die paintComponent-Methode überschrieben.
MouseListener+MouseMotionListener rufen repaint() auf.
Nun bekomme ich jedoch immer bei den MouseEvents so einen "zusätzlichen" Rahmen um das JPanels und die JLabels.

Hier erstmal zwei Bilder von meinem Problem.
Die Hintergrundbilder hab ich rausgenommen, damit man es besser sieht.
(anklicken zum vergrößern, sonst sieht mans nicht^^)

normal:


mit repaint():


(der grüne strich soll da sein, da ich mit der paintComponent drauf male)

Das große JPanel ist jenes mit der paintComponent() Methode, das kleine was man da noch drauf sieht ist ein JLabel, auf welchem der MouseListener liegt.

paintComponent-Methode des JPanels
[Java] @Override
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
// draw background
// g2d.drawImage(backgroundImg, 0, 0, null);
// draw Solution
for(int i=0;i<9;i++){
g2d.drawImage(currentSolution,i%3*kartenSize+kartenSize, i/3*kartenSize+kartenSize,null);
}
// draw line
if(dragSource!=null && dragTarget!=null) {
g2d.setStroke(new BasicStroke(4.0f));
g2d.setColor(actualColor);
g2d.drawLine(dragSource.x, dragSource.y, dragTarget.x, dragTarget.y);
}
}[/Java]

Und der MouseListener ruft dann halt auf dem JPanel repaint() auf, wenn ich mit der Mouse zB über das kleine JLabel komme, und dann taucht dieser "Zusatz-Rahmen" auf. Sowohl am Rand des JPanels, als auch auf den JLabels.

Es muß was mit dem Zeichnen der Linie zu tun haben, wenn ich das auskommentiere, ist der Fehler weg.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
aus deinem vorherigen Thema weiter zusammenkopiert bereinigt um das unbekannte Image ist der Code nicht schuld,
warum sollte das Zeichnen einer Linie auch was zum Rahmen veranlassen,

oder ist bei dir das untenstehende Programm auch ok, deins aber weiter mit Rahmen?
teste auch weitere beliebige Programme aus dem Internet, etwa von
2D Graphics GUIJava

-----

ich vermute eher irgendwas mit deiner Umgebung, die Screenshots sind bisschen knapp,
der bunte Balken oben auffällig, ist das nur allgemeines Desktop-Design?

bzw. dass überhaupt so ein kleines Fenster mit Rahmen zu sehen ist, also dein 1. Bild, ist ja bereits nicht normal,
woher kommt das? welchen Code verwendest du komplett, welche IDE?


Java:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        new MainWindow().setVisible(true);
    }
}


class MainWindow
    extends JFrame
{
    DrawImgPanel myPanel;

    public MainWindow()
    {
        setSize(400, 300);
        myPanel = new DrawImgPanel();
        JPanel left = new JPanel();
        left.setPreferredSize(new Dimension(100, 100));
        this.add(left, BorderLayout.WEST);
        this.add(myPanel, BorderLayout.CENTER); // panel mit der verschobenen grafik
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args)
    {
        new MainWindow().setVisible(true);
    }
}


class DrawImgPanel
    extends JPanel
    implements MouseMotionListener
{

    public DrawImgPanel()
    {
        this.addMouseMotionListener(this);
    }

    public void paintComponent(final Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        // draw line

        g2d.setStroke(new BasicStroke(4.0f));
        g2d.drawLine(20, 20, 120, 120);
    }

    public void mouseDragged(MouseEvent arg0)
    {
        this.repaint();
    }

    public void mouseMoved(MouseEvent arg0)
    {
    }
}
 

xehpuk

Top Contributor
Du änderst den Zustand der Graphics und setzt ihn nicht mehr zurück. :eek:
Der Rahmen wurde schon vorher gezeichnet, nur durch deinen
Code:
setStroke()
-Aufruf wird dieser nun dicker.

Probier es mal so:
Java:
    @Override 
    public void paintComponent(Graphics g){ 
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create(); // neue Graphics
        // draw background
//      g2d.drawImage(backgroundImg, 0, 0, null);
        // draw Solution
        for(int i=0;i<9;i++){
            g2d.drawImage(currentSolution[i],i%3*kartenSize+kartenSize, i/3*kartenSize+kartenSize,null);
        }
        // draw line        
        if(dragSource!=null && dragTarget!=null) {
            g2d.setStroke(new BasicStroke(4.0f));
            g2d.setColor(actualColor);
            g2d.drawLine(dragSource.x, dragSource.y, dragTarget.x, dragTarget.y);
        }
        g2d.dispose(); // Speicher freigeben
    }
 

Rakasch

Mitglied
Bei dem Beispiel funktioniert es normal, da hab ich den Fehler nicht.

Die bunte Leiste oben ist normal, Windows Vista-Design...
Als IDE verwende ich Eclipse.

Was die Rahmen betrifft. Das ist schon richtig, dass da welche sind. Auf dem JPanel liegen mehrere JLabels, die sind im Grunde leer und haben nur eine Größe, eine BevelBorder und einen Listener. Damit hab ich mir so ne Art Roll-Over Effekt gebaut. Das funktioniert wie gesagt auch.
Nur sobald ich den Teil mit dem Linien zeichnen in den Code einfüge, malt er immer beim mouseDragged, also beim repaint() diese komischen dicken Rahmen...

Auf deinen Wunsch hin nochmal ganze Bilder:

normal:


nicht normal:
 
Zuletzt bearbeitet:
S

SlaterB

Gast
Du änderst den Zustand der Graphics und setzt ihn nicht mehr zurück. :eek:
Der Rahmen wurde schon vorher gezeichnet, nur durch deinen
Code:
setStroke()
-Aufruf wird dieser nun dicker.
pff, also das glaube ich weniger,
mag sein dass das setStroke() für SPÄTERES Zeichnen eine Auswirkung hat, das wäre dann gut gefunden (ob dann aber [c]g2d.dispose();[/c] günstig ist?)
aber doch nicht auf VORHERIGES Zeichnen, wozu würde man sonst ständig setColor() & Co. aufrufen
 

Rakasch

Mitglied
Du änderst den Zustand der Graphics und setzt ihn nicht mehr zurück. :eek:
Der Rahmen wurde schon vorher gezeichnet, nur durch deinen
Code:
setStroke()
-Aufruf wird dieser nun dicker.
Java:
        g2d.dispose(); // Speicher freigeben
Das mit dem setStroke war der richtige Gedanke!
Wenn ich dispose verwende, ist der Fehler zwar weg, aber er zeichnet mir die Labels nicht mehr.
Wenn ich den stroke wieder auf 1 zurücksetzte, funktioniert´s.
Java:
g2d.setStroke(new BasicStroke(1.0f));

Speicher freigeben klingt aber nach etwas, das man besser tun sollte, oder? ^^
Ich muß nochmal nachlesen, was dispose eigentlich macht...
 
Zuletzt bearbeitet:

xehpuk

Top Contributor
mag sein dass das setStroke() für SPÄTERES Zeichnen eine Auswirkung hat
Der Rahmen wird ja auch erst danach gezeichnet. :)

Code:
paint()
wird ja so gegliedert:
  1. Code:
    paintComponent()
  2. Code:
    paintBorder()
  3. Code:
    paintChildren()

Das "vorher" in meinem Satz hinterließ wohl eine Zweideutigkeit. Damit war gemeint, dass der Rahmen allgemein schon vorhanden war, also noch vor der Existenz der grünen Linie (aber falls existent: danach) gezeichnet wurde. Nur war er einfach nicht so dick.

@Rakasch:
Du hast bei meinem Code die Veränderung in Zeile 4 übersehen. Dort wird eine Kopie der aus dem Parameter stammenden Graphics über
Code:
Graphics.create()
erstellt. Änderungen an dieser neuen Graphics haben keinen Einfluss auf die ursprüngliche.
Da hier also manuell eine neue Graphics erstellt wurde, muss diese auch wieder von Hand "zerstört" werden. Siehe dazu dann auch die Doku zu
Code:
Graphics.dispose()
.

Es gibt beim Zeichnen grundsätzlich zwei Strategien:
  • Neue Graphics erstellen. Änderungen daran wirken sich nicht auf spätere Zeichenvorgänge aus. Vorteil ist die leichte Handhabung. Nachteil ist ein höherer Ressourcenverbrauch.
  • Alten Zustand der Graphics vor jeder Änderung merken und am Ende der Zeichenroutine wieder zurücksetzen. Vorteil ist der geringere Ressourcenverbrauch. Nachteil ist, dass es umständlicher ist.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
H new Operator in paintComponent - Speicherprobleme vorprogrammiert? AWT, Swing, JavaFX & SWT 2
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
G update, paintComponent AWT, Swing, JavaFX & SWT 1
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
C Objekt an paintComponent weitergeben AWT, Swing, JavaFX & SWT 1
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
D PaintComponent wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I (JPanel) paintComponent mit Zeitverschiebung (Sleep/Wait) AWT, Swing, JavaFX & SWT 1
K Swing paintComponent, JPanel auslagern, ChangeEvents AWT, Swing, JavaFX & SWT 7
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
B AWT paintComponent wird nur 2 mal ausgeführt?! AWT, Swing, JavaFX & SWT 5
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
D paintComponent() mit transparentem Hintergrund. AWT, Swing, JavaFX & SWT 0
G Swing Flackern nach Override von paintComponent() AWT, Swing, JavaFX & SWT 3
M Swing paintComponent in rekusivem JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 2
M DefaultTableModel ruft paintComponent auf ! AWT, Swing, JavaFX & SWT 4
T Swing paintComponent(); AWT, Swing, JavaFX & SWT 24
K Swing JButton paintComponent überschreiben AWT, Swing, JavaFX & SWT 5
Kenan89 2D-Grafik paintComponent quetsch alles in Panel AWT, Swing, JavaFX & SWT 26
B 2D-Grafik paintComponent für rechteckigen Bereich? AWT, Swing, JavaFX & SWT 6
P Swing problem mit paintComponent AWT, Swing, JavaFX & SWT 2
K paintComponent nicht aufgerufen AWT, Swing, JavaFX & SWT 2
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
S auf paintComponent() warten AWT, Swing, JavaFX & SWT 34
W JPanel Überschreiben // paintComponent? AWT, Swing, JavaFX & SWT 4
propra Wieso wird paintComponent() beim Start 2 malausgeführt? AWT, Swing, JavaFX & SWT 4
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
P JLabel paintComponent AWT, Swing, JavaFX & SWT 3
Z Swing paintcomponent und menbar Problem AWT, Swing, JavaFX & SWT 3
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
R 2D-Grafik auf JPanel zeichen - ohne @Override paintComponent AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent & BorderFactory AWT, Swing, JavaFX & SWT 2
A paintComponent AWT, Swing, JavaFX & SWT 4
T Rechtecke zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 3
R paintComponent direkt bei actionPerformed aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
K JPanel und paintComponent AWT, Swing, JavaFX & SWT 8
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
C Checkbox in Liste deaktivieren und paintComponent explizit aufrufen AWT, Swing, JavaFX & SWT 12
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Game of Life - PaintComponent-Problem / Timer? AWT, Swing, JavaFX & SWT 8
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
J paintComponent() übergeben AWT, Swing, JavaFX & SWT 4
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
kodela Swing paintComponent() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 19
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
E WARUM wird paintComponent nicht aufgerufen? AWT, Swing, JavaFX & SWT 12
C paintComponent mit Maus verschieben - wie? AWT, Swing, JavaFX & SWT 2
G Swing paintComponent Effizienz? AWT, Swing, JavaFX & SWT 4
R paintComponent Kollision AWT, Swing, JavaFX & SWT 2
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent() AWT, Swing, JavaFX & SWT 2
T Swing paintComponent problem AWT, Swing, JavaFX & SWT 3
MrGe getWidth(); getHeight(); außerhalb von paintComponent AWT, Swing, JavaFX & SWT 4
A paintComponent überdeckt ... AWT, Swing, JavaFX & SWT 13
JFeel-x repaint für Aufruf von paintComponent-Klasse ungeeignet? AWT, Swing, JavaFX & SWT 11
F Wer ruft paintComponent() Methode auf? AWT, Swing, JavaFX & SWT 9
@ JPanel: kein paintComponent() trotz repaint() AWT, Swing, JavaFX & SWT 4
G paintComponent Problem AWT, Swing, JavaFX & SWT 6
T paintComponent() überschreiben: Platz für Border freihalten? AWT, Swing, JavaFX & SWT 6
G paintComponent JPanel im JApplet AWT, Swing, JavaFX & SWT 2
X Speichern in der paintComponent() Methode AWT, Swing, JavaFX & SWT 15
W JLabel + paintComponent AWT, Swing, JavaFX & SWT 2
V Wieviel Logik in paintComponent? AWT, Swing, JavaFX & SWT 7
hdi super.paintComponent(g); soll nicht alles löschen AWT, Swing, JavaFX & SWT 2
G paintComponent() Methode für JPanel in NetBeans überschreibe AWT, Swing, JavaFX & SWT 2
L Problem mit paintComponent() under java < 1.6 under Windo AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
N Probleme mit paintComponent und GradientPaint AWT, Swing, JavaFX & SWT 5
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
D performance problem: paintcomponent, alphacomp, bufferedImag AWT, Swing, JavaFX & SWT 10
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
C Bei Skalierung wird paintComponent() nicht aufgerufen,warum? AWT, Swing, JavaFX & SWT 4
K Problem repaint()->paintComponent AWT, Swing, JavaFX & SWT 9
G paintComponent wird nicht dargestellt AWT, Swing, JavaFX & SWT 5
T Kuchendiagramm - mit paintComponent nach JButton druck zeich AWT, Swing, JavaFX & SWT 4
R paintComponent wird anscheinend nicht aufgerufen AWT, Swing, JavaFX & SWT 2
T JPanel mit paintComponent methode im JInternalFrame AWT, Swing, JavaFX & SWT 3
M super.paintComponent(g); aufrufen oder nicht? AWT, Swing, JavaFX & SWT 8
M Unterschied zwischen paintComponent() und paint()? AWT, Swing, JavaFX & SWT 4
D JTextArea in der paintComponent () hinzufügen? AWT, Swing, JavaFX & SWT 9
raptorrs J2D paintComponent: Nur ganzzahlige (-int) Werte möglich? AWT, Swing, JavaFX & SWT 3
B Schon wieder ein Problem mit paintComponent(). AWT, Swing, JavaFX & SWT 2
G Keine Anzeige von Grafik bei externem paintComponent-Aufruf AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben