tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
375
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Nov 2002
    Beiträge
    383
    Hey,
    ist etwas schwierig mein Problem in der Betreffzeile zu schildern

    Ich habe eine Klasse View(erbt von JPanel) von der ich die Klassen A, B und C ableite. Ich habe mir in der Klasse A eine BufferdeImage-Objekt erzeugt und male in diesem herum.

    Jetzt zu meinem Problem. Wenn ich in dem BufferedImage Objekt zeichne, wird das Bild auch auf die Klassen B und C übertragen, obwohl sie in keiner direkten Assoziation mit dem BufferedImage Objekt von A stehen. Ich zeichne zwar auch in B und C, dies geschieht indirekt über A (BufferedImage wird in einem Array abgelegt und anschließend in B und C dargestellt).

    Das Problem tritt nur direkt beim Mahlen auf. Wenn ich beispielsweise Eclipse in den Vordergrund hole, so dass mein Fenster nicht mehr zu sehen ist, und anschließend den JFrame wieder in den sichtbaren Bereich ziehe, wird alles richtig dargestellt. Anscheinend ruft das Betriebssystem separat jede einzelne paint-Methode der JPanels auf und alles wird richtig angezeigt.

    Code :
    1
    
    private static final long serialVersionUID = 1027176525973253122L;

    Ich habe auch die serialVersionsUID in der View sowie A,B und C Klasse implementiert, doch leider wird beim Zeichnen weiterhin in jedem der drei Panels das gleich Bild dargestellt während des Zeichnens angezeigt.

    Danke für eure Hilfe

    Greetz Kon
    Angehängte Grafiken Angehängte Grafiken  
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Also aus deiner Erklärung könnte man mal vermuten, dass du den beiden View Sub-Klassen B und C die gleiche Referenz auf das BufferedImage von A unterschiebst. Zeichnest du dann in B und C auch dieses BufferedImage, dann siehst du natürlich das was du in A gezeichnet hast, da ja B und C auch auf dieses BufferedImage verweisen.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    Registriert seit
    Nov 2002
    Beiträge
    383
    Hey,
    das habe ich schon probiert definitiv auszuschließen. Aber naja ... Von dem Aufbau ist es so, dass A in das BufferedImage schreibt und anschließend die Daten in einem zweidimensionalen boolean Array speichert.

    Die Klassen B und C greifen dann mit ihren paint-Methoden auf diesen Array zu und zeichnen die neuen Koordinaten in ihr jeweiliges Graphics-Objekt - in den Klassen B und C überschreibe ich die Methode Paint.

    Bei jeder Bewegung der Maus rufe ich die repaint() - Methode aller Panels (A,B,C) auf und dabei tritt dann der Fehler auf. Wenn ich die repaint vom Betriebssystem aufrufen lasse, das Fenster durch ein anderes Programm überlappen und anschließend wieder in den Vordergrund ziehen, funktioniert die Geschichte wunderbar. Das Problem tritt nur auf, wenn ich die repaint selber aufrufe ...

    Ich bin zur Zeit nicht zu Hause, aber ich werde heute Abend mal den Code reinstellen. Mit diesem blöden Problem schlage ich mich schon seit zwei Tagen rum Danke für die Hilfe

    Greetz Kon
     

  4. #4
    Registriert seit
    Nov 2002
    Beiträge
    383
    Hey,
    hier mein Code. Ich starte mit einer Klasse, die sich sich eine Instanz von A, B und C erzeugt und anschließend an Control übergibt.

    Code :
    1
    2
    3
    
    class View extends JPanel {
        private static final long serialVersionUID = 8774341878975246575L;
    }

    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
    
    class A extends View {
        private static final long serialVersionUID = 1027176525973253122L;
        private int _xPosNew;
        private int _yPosNew;
        private int _xPosOld;
        private int _yPosOld;
        private BufferedImage _bufferedImage;
     
        public A(){
            _bufferedImage = new BufferedImage( 300, 300, BufferedImage.TYPE_INT_ARGB);
        }
     
        public void setPosNew(int posxNew, int posyNew) {
            _xPosNew = posxNew;
            _yPosNew = posyNew;
     
            Graphics g = _bufferedImage.getGraphics();
            g.setColor(new Color(255,0,0));
            g.drawLine(_xPosOld,_yPosOld,_xPosNew,_yPosNew);
            _xPosOld = _xPosNew;
            _yPosOld = _yPosNew;
            g.dispose();
            this.repaint();
        }
     
        public void setPosOld(int posxOld, int posyOld) {
            _xPosOld = posxOld;
            _yPosOld = posyOld;
        }
     
        public void paint(Graphics g) {
            g.drawImage(_bufferedImage, 0, 0, this);
        }
     
        public BufferedImage getBufferedImage() {
            return _bufferedImage;
        }
    }

    Code :
    1
    2
    3
    4
    5
    6
    7
    
    class B extends View {
        private static final long serialVersionUID = -7810510332169203043L;
     
        public void paint(Graphics g) {
            //zeichne mit den neuen Daten aus dem Array
        }
    }

    Die Klasse C hat den gleichen Inhalt wie B, liest nur andere Daten aus.

    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
    
    class Control extends MouseAdapter implements MouseMotionListener {
        private static Control _control;
        private A _a;
        private B _b;
        private C _c;
        //Zaehler für die Aufrufe der MouseDragged
        private int _counter;
     
        private Control() {
            _counter = 0;
        }
     
        public static synchronized Control getInstance() {
            if (_control == null) {
                _control = new Control();
            }
            return _control;
        }
     
        public void setABC(A a, C c, B b){
            _a = a;
            _c = c;
            _b = b;
            _a.addMouseMotionListener(this);
            _a.addMouseListener(this);
        }
     
        public void updateData() {
            //array für b und c wird geupdated ...
        }
     
        public void mouseDragged(MouseEvent e) {
            _a.setPosNew(e.getX(),e.getY());
            if (_counter == 9) {
                updateData();
                _counter = 0;
            }
     
            _counter++;
            //aktualisiere die Darstellung bei a und b
            _c.repaint();
            _b.repaint();
        }
     
        public void mouseReleased(MouseEvent e) {
            updateData();
            //aktualisiere die Darstellung bei Bob und Eves
            _c.repaint();
            _b.repaint();
        }
     
        public void mousePressed(MouseEvent e) {
            _a.setPosOld(e.getX(), e.getY());
        }
     
        public void mouseMoved(MouseEvent e) {
        }
    }

    Ich habe die Klasse A beim Listener angemeldet und den Inhalt der Paint-Methoden der beiden Klassen B und C auskommentiert. Trotzdem wird immer das gleiche Bild angezeigt, wie in A. Danke für die Hilfe

    Greetz Kon
    Geändert von bspainkf36 (21.05.06 um 22:04 Uhr)
     

  5. #5
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo Kon,

    füge in die leeren paintMethoden von B und C noch folgende Zeile hinzu:

    super.paint(g);

    Dann wird der Zauber verschwinden!


    Vg Erdal
     

  6. #6
    Registriert seit
    Nov 2002
    Beiträge
    383
    Hallo,
    danke für die Antworten. Es funktioniert jetzt, ich frage mich nur warum Beim Minimieren habe ich wohl versehentlich den Konstruktor in den Klassen Eve und Bob nicht mit kopiert. Jedoch enthalten die Konstruktoren den super() Aufruf. Jetzt frage ich mich, warum ich den Aufruf explizit angeben muss. Danke

    Greetz Kon
     

Ähnliche Themen

  1. Dynamisch JPanels mit Inhalt erstellen
    Von mckruep im Forum Java
    Antworten: 13
    Letzter Beitrag: 07.12.07, 10:50
  2. jTable - Alle Zellen gleicher Inhalt
    Von TimmaY im Forum Java
    Antworten: 0
    Letzter Beitrag: 04.06.07, 13:33
  3. Unterschiedlichen Inhalt in JFrame laden
    Von cubeless im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 5
    Letzter Beitrag: 08.11.06, 11:43
  4. Neues Fenster - gleicher Inhalt
    Von sirina im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 31.10.05, 10:02
  5. Mehrere Drop Down-Menüs - gleicher Inhalt
    Von Schind im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 24.09.03, 03:25