tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
1663
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Ryu20 Ryu20 ist offline Mitglied Silber
    Registriert seit
    Oct 2004
    Beiträge
    64
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    
     
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    
    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
     

  2. #2
    TheJadix TheJadix ist offline Mitglied Gold
    Registriert seit
    Sep 2005
    Ort
    Bremerhaven
    Beiträge
    220
    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
     
    Signatur ? ? ? So ein Humbug ! ! !

  3. #3
    Ryu20 Ryu20 ist offline Mitglied Silber
    Registriert seit
    Oct 2004
    Beiträge
    64
    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?
     

  4. #4
    TheJadix TheJadix ist offline Mitglied Gold
    Registriert seit
    Sep 2005
    Ort
    Bremerhaven
    Beiträge
    220
    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
     
    Signatur ? ? ? So ein Humbug ! ! !

  5. #5
    Ryu20 Ryu20 ist offline Mitglied Silber
    Registriert seit
    Oct 2004
    Beiträge
    64
    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?
     

  6. #6
    TheJadix TheJadix ist offline Mitglied Gold
    Registriert seit
    Sep 2005
    Ort
    Bremerhaven
    Beiträge
    220
    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
     
    Signatur ? ? ? So ein Humbug ! ! !

Ähnliche Themen

  1. In JPanel zeichnen
    Von Thug-Angel im Forum Java
    Antworten: 8
    Letzter Beitrag: 15.08.11, 17:01
  2. Rechteck Zeichnen
    Von patrick1982l im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 08.03.10, 15:44
  3. Qt QPainter schrift in Rechteck zeichnen
    Von Orbit im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 12.10.09, 09:10
  4. [VBA] Wert aus Excel > Rechteck in PPT zeichnen
    Von cocoon im Forum Visual Basic 6.0
    Antworten: 0
    Letzter Beitrag: 06.07.07, 16:59
  5. auf JPanel zeichnen
    Von Apon im Forum Java
    Antworten: 1
    Letzter Beitrag: 07.03.05, 12:37