Rechteck über JPanel zeichnen flackert

Ryu20

Mitglied
Hi,

ich habe ein kleines Problem und hoffe jemand hier hat eine Lösung für mich.

Ich will ein Rechteck Zeichnen wenn mit gedrückter Maustaste über ein Panel zieht.
(drag)

Dies funktioniert auch wenn ich die Paint Methode überschreibe

Beispiel:

Code:
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

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

public class JPanSelectionTest extends JPanel implements MouseListener, MouseMotionListener{

    JButton bt = new JButton();
    int x = 0;
    int y = 0;
    boolean moving = false;
    
    public JPanSelectionTest(){
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
    }

    @Override
    public void paint(Graphics g) {
        // TODO Auto-generated method stub
        super.paint(g);
        if(moving){
            Graphics2D g2D = (Graphics2D)g;
            g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f));

            g2D.setColor(Color.RED);
            g2D.fillRect(20, 20, x-20, y-20);
            System.out.println("kk");
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        this.moving = false;
        this.repaint();
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        // TODO Auto-generated method stub
        this.moving = true;
        this.x = e.getX();
        this.y = e.getY();
        this.repaint();
     }

    @Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public static void main(String[] args) {
        JFrame fr = new JFrame();
        fr.setSize(800,600);
        fr.add(new JPanSelectionTest());
        fr.setVisible(true);
    }
}
Ich will genau dieses Verhalten haben aber ohne das ich die "Paint Methode" überschreiben muss.

Beispiel das flackert:

Code:
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

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

public class JPanSelectionLagTest extends JPanel implements MouseListener, MouseMotionListener{

    public JPanSelectionLagTest(){

        this.addMouseListener(this);
        this.addMouseMotionListener(this);

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        this.repaint();
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        this.repaint();
        Graphics2D g2D = (Graphics2D)this.getGraphics();
        g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f));
        g2D.setColor(Color.RED);
        g2D.fillRect(20, 20, e.getX()-20, e.getY()-20);
        
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public static void main(String[] args) {
        JFrame fr = new JFrame();
        fr.setSize(800,600);
        fr.add(new JPanSelectionLagTest());
        fr.setVisible(true);
    }

}
weiß jemand woran das liegt und wie ich das verhindern kann?

Danke schonmal
 
Hallo,

ich würde das mit dem painten ausserhalb der dazu vorgesehenen Methoden lieber lassen.

Flackern tut es weil dein repaint den Zeichenbereich löscht und du dann wieder neu
drüberzeichnest, so ein Geflacker lässt sich nur mit doubleBuffering unterbinden.

Gruß JAdix
 
Mein Problem ist, ich will ein Jpanel z.B an eine Klasse weitergeben und auf dem JPanel soll das gezeichnet werden.

Somit habe ich ja keine Moeglichkeit die Paint Methode darin zu berschreiben oder?
 
Hallo,

warum glaubst du das es nicht geht ?

Wenn du keine eigene JPanel-Klasse ableiten könntest, dann hättest du ein Problem !

Aber warum sollte das nicht gehen ?

Beschreib mal näher was du vor hast und warum die "Klasse" dein JPanel mit
überschriebener paint-Methode nicht annehmen sollte ?

Gruß JAdix
 
ich will an eine Klasse ein JPanel von mir weitergeben (schon welche die ich mal vor langem gemacht habe) jetzt möchte ich auf diesen jpanels so ein rechteck zeichnen ohne das ich mein altes JPanel ändern muss.

Ist sowas überhaupt möglich?
 
Hallo,

wie schon gesagt, ich würde nicht ausserhalb der entsprechenden Methoden painten.

Ohne überschreiben von Methoden wirst du das Flackern keinesfalls in den Griff bekommen !

Wenn es für dich Sinn macht deine alten Komponenten zu recyclen musst du diese eben
nochmal erweitern !

Gruß JAdix
 
Zurück