Mouse Event in anderemm Event auslösen

  • Themenstarter Gelöschtes Mitglied 71006
  • Beginndatum
G

Gelöschtes Mitglied 71006

Gast
Hallo,
habe ein Problem beim zeichnen: Ich zeichne mit MausMotionListener, bzw. MouseClickLisener. Das Bildchen soll aber nicht statisch sein. Leider ruft die Methode, die zum Beispiel vergrößert dieses Event nicht mehr auf, also läuft dort nicht hinein. Wie löst man das? Habe versucht zu verstehen was ein dispatcher macht - aber nachdem ich 10 Seiten angelesen habe, aufgegeben. Kennt jemand eine Lösung? Danke schonmal und einen sicheren Ort.
 

KonradN

Super-Moderator
Mitarbeiter
Also ohne Details zu kennen, ist es schwer, hier etwas zu raten.

Vom Design her klingt es aber erst einmal unsauber. In der Regel hat man eine Trennung von der Oberfläche z udem, was gemacht wird. Du hast also etwas wie eine View die dann ein Ereignis auslöst und daraufhin macht dann eine andere Komponente - nennen wir sie mal Controller - etwas. Daraus entstehen dann Änderungen, die sich auf etwas, das ich mal Model nennen möchte - auswirkt, was dann die View dazu bringt, sich zu aktualisieren.

Ob man nun so ein MVC (Model View Controller) oder MVVM (Model View ViewModel oder sonst ein Pattern verwendet, ist erst einmal nebensächlich. Wichtig ist: Es wird ein Event vom Nutzer ausgelöst und daraufhin passiert etwas. Daraus resultieren dann aber keine neuen Events in der View (was ja auch nur Aktionen im Controller auslösen würde) sondern es wird alles, was passieren muss, im Controller direkt gemacht.

Solch eine Trennung - egal wie genau diese aussieht - ist wichtig, damit ein Code wartbar bleibt.
 
G

Gelöschtes Mitglied 71006

Gast
Ja, im Prinzip sind es zwei Events. Wenn zur Laufzeit gezeichnet wird, weiß das andere Event, das vergrößern kann nichts vom zur Laufzeit gezeichneten Objekt. Es soll dann das in paint zur Laufzeit gezeichnete Objekt vergrößern. Das Event des JScrollers kann nicht das Objekt des MouseEvents ändern. Ich kann nicht die Mouse Methode aufrufen.
 
G

Gelöschtes Mitglied 71006

Gast
Ich poste den Code - diesen hatte ich auch hier aus dem Forum, vor längerer Zeit und komme erst heute dazu weiterzumachen. Ich dachte es gäbe da eine elegante Lösung. Kann etwas dauern.
 
G

Gelöschtes Mitglied 71006

Gast
Hi, mein Problem ist nun, daß sich das händisch gezeichnete nicht vergrößern läßt. Es soll in beiden Panels gezeichnet und vergrößert werden.
Dieser Code ist ursprünglich von Top-Contibuter mit der Barista-Panda-Tasse. Ich versuche nur das Vergrößern irgendwie einzubauen. Und ich komme schon seit langer Zeit damit nicht weiter. Entweder geht es nur auf einem Panel mit dem Vergrößern oder ohne Vergrößen auf beiden Panels. Danke für jede Anregung, Tipp, Code, etc..

Java:
package testtest;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import java.util.*;
import java.util.List;

public class Test {
    
    public static interface DrawingListener {
        void modified();
    }

    public static class Drawing {
        private List<Shape> shapes = new ArrayList<>();
        private List<DrawingListener> listeners = new ArrayList<>();

        public List<Shape> getShapes() {
            return shapes;
        }

        public void add(Shape shape) {
            shapes.add(shape);
            modified();
        }

        public void remove(Shape shape) {
            shapes.remove(shape);
            modified();
        }

        public void addListener(DrawingListener l) {
            listeners.add(l);
        }

        public void removeListener(DrawingListener l) {
            listeners.remove(l);
        }

        public void modified() {
            for (DrawingListener l : listeners) {
                l.modified();
            }
        }
    }

    static class DrawingPanel extends JComponent {
        private static int mousX, mousY;
        private static boolean mouseclicked = false;
        
        static JSlider jslider = new JSlider();
        
        private double xmin;
        private double xmax;
        private double ymin;
        private double ymax;
        private double x0;       
        private double y0;
        private double ppcm;
        double step = 51.90288713910761; //51.90288713910761;  //Zoom-Faktor initialisieren (über Slider änderbar)
        double n = 10;
        double m = 10;
        double j1 = 0;
        double j = j1+0;
        double j2 = 0;
        int p = 0;
        double t = 0*step/n;
        int k1 = 0;
        double k = k1*step;
        int nb = 0;

        int l1 = 0;
        double l = l1*step;
        double f = n * t + k;
        double g = m * t + l;
        
        /*********************************/
        Point p0 = new Point();
        Point p1 = new Point();
        double tx0 = 0;
        double ty0 = 0;
        double tx1 = 0;
        double ty1 = 0;
        Line2D.Double zeichenLinie2 = new Line2D.Double(0,0,0,0);
        private Drawing drawing;
        private DrawingListener listener = () -> repaint();
          
        private Vector vector;
        
        /*********************************/
        public DrawingPanel(JSlider jslider) {
            jslider.addChangeListener(new ChangeListener() {
                public void stateChanged(ChangeEvent e) {
                  JSlider model =
                   (JSlider)e.getSource();
              
                      if(model.getValueIsAdjusting()) {
                            int min = model.getMinimum(),
                                  max = model.getMaximum(),
                                  span = max - min,
                                  value = model.getValue();
                            step = value;
                           if (step <= 0) {
                               // n = 1;
                              //  m=1;
                                step = 1;
                                System.out.println("STEP < 1  => STEP = 1");
                            }
                          
                         k = k1*step;
                            f = n * t + k;
                            l = l1*step;
                         g = m * t + l;
                          
                            revalidate();
                            repaint();
                      }
                }
          }); 
            
        } 
        
        public double userx (int px) {  //x,y-Wert eines Punktes ins eigene Koordinatensystem umrechnen
              return (px-(x0+k))/(step/n)+j1;
          }
          public double usery (int py) {
              return ((y0+l)-py)/(step/m)+j2;
          }
        public double paintx ( double ux) { //zeichnen der Punkte, umrechnen ins ursprüngl. Koord.
               double x1 = (ux*(step/n)+(x0+k));
               return  x1;
           }   
           public double painty (double uy) {
               double y1 = (y0+l)-(uy*(step/m));
               return y1;
           }

        
        
        public void setDrawing(Drawing newDrawing) {
            if (drawing != null) {
                drawing.removeListener(listener);
            }
            drawing = newDrawing;
            if (drawing != null) {
                drawing.addListener(listener);
            }
        }
 
        public void paintComponent(Graphics gr) {
            super.paintComponent(gr);

            if (drawing == null) {
                return;
            }

            Graphics2D g2 = (Graphics2D) gr;
            for (Shape shape : drawing.getShapes()) {
                g2.draw(shape);
            }
            String str;
            g2.setColor(Color.red);
        
            //super.paint(g2);
            
                   x0 = this.getWidth() / 2;
                   y0 = this.getHeight() / 2;

                   if(k<=0) {
                        xmin = (userx(0)+f)-j1;       
                        xmax = userx(this.getWidth())-f-j1;
                   } else {
                        xmin = userx(0)-f-j1;
                        xmax = userx(this.getWidth())+f-j1;
                   }
                  
                   if(l<=0) {
                       ymin = usery(this.getHeight())+g-j2;
                       ymax = (usery(0)-g)-j2;
                   } else {
                       ymin = usery(this.getHeight()) - g -j2;
                       ymax = usery(0)+g -j2;
                   }
                    ppcm = 226/2.54;

                        ppcm = Toolkit.getDefaultToolkit().getScreenResolution();
                        System.out.println("Toolkit DPI?: " + ppcm);
                        ppcm = 10 * 226/2.54;
                        System.out.println("Berechnet: " + ppcm);
                      
                        System.out.println("newnewnenwnenDRAWDRAWDRAWPPPPPPPPPPPPPPPPP"+step+"/"+j1);
            
                
                 drawMillipier(g2);
            // Abstand Testen (pixel nach cm)   
            Point a = new Point(1,2);
            Point b = new Point(2,1);
            Point c = new Point(3,5);
            Point aa = new Point(3,6);
            Line2D.Double zeichenLinie = new Line2D.Double(paintx(1-j1), painty(2-j2), paintx(2-j1), painty(1-j2));
               Line2D.Double zeichenLinie1 = new Line2D.Double(paintx(2-j1), painty(1-j2), paintx(3-j1), painty(5-j2));
            //Line2D.Double zeichenLinie2 = new Line2D.Double(paintx(tx0-j1), painty(ty0-j2), paintx(tx1-j1), painty(ty1-j2));
            g2.draw(zeichenLinie);
            g2.draw(zeichenLinie1);
        }

        private void drawMillipier(Graphics2D g2d) {
                
                g2d.setColor(new Color(0,0,0));
                g2d.setStroke(new BasicStroke(0.8f));
                for (j =(int) xmin; j <= xmax+k; j++) {    // Einteilung der x-Achse
                    if (j%n==0){       
                        Line2D.Double xstriche = new Line2D.Double(paintx(j),painty(-1),paintx(j),painty(1));
                        g2d.draw(xstriche);
                    }
                }
                
                for (j = (int) ymin; j <= ymax; j++) { // Einteilung der y-Achse
                    if (j%m==0){
                            Line2D.Double ystriche = new Line2D.Double(paintx(-1),painty(j),paintx(1),painty(j));
                            g2d.draw(ystriche);
                    }
                }
                
                    // Koordinatenkreuz // dicke Linien
                
                for (p = (int)xmin; p <= xmax; p++) {
                
                        if (p%n==0){
                    /////    System.out.println("xmin: "+(int)xmin+" xmax: "+(int)xmax+" Differenz: "+(int)(xmin-xmax));   
                        
                        g2d.setColor(new Color(0,0,0));
                            g2d.setStroke(new BasicStroke(1));
                            Line2D.Double xAchse = new Line2D.Double(paintx(xmin), painty(0), paintx(xmax), painty(0));
                            g2d.draw(xAchse);
                    
                            Line2D.Double yAchse = new Line2D.Double(paintx(0), painty(ymin), paintx(0), painty(ymax));
                            g2d.draw(yAchse);
                    }
                }
        }
    }

 
    

  
  /**  public static JFrame createDrawingFrame(DrawingPanel panel) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(panel);
        frame.setSize(800, 600);
        return frame;
    }

    private static DrawingPanel createDrawingPanel(Drawing drawing) {
        DrawingPanel panel = new DrawingPanel();
        panel.setDrawing(drawing);                           
        panel.addMouseListener(new MouseAdapter() {
            Point2D[] points = new Point2D[2];
            int count = 0;

            @Override
            public void mouseClicked(MouseEvent e) {        //MouseEvent setzt zwei Punkte, diese in user-Koordinaten, über paint ins orig System
                points[count] = e.getPoint();               
                count = (count + 1) % 2;
                if (count == 0) {
                    drawing.add(new Line2D.Double(points[0], points[1]));
                }
            }
        });
        return panel;
    }**/

  /**  public void run() {
        Drawing drawing = new Drawing();
        drawing.add(new Line2D.Double(100, 100, 150, 150));

        createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
        createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
    }

    public static void main(String[] args) {
       // SwingUtilities.invokeLater(() -> new Test().run());
        Drawing drawing = new Drawing();
        drawing.add(new Line2D.Double(100, 100, 150, 150));

        createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
        createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
    }**/
}


Und nun noch die Start-Klasse:
Java:
package testtest;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import testtest.Test.Drawing;
import testtest.Test.DrawingPanel;

    public class Start extends JPanel{
 
        static final int FPS_MIN = 0;
        static final int FPS_MAX = 600;
        static final int FPS_INIT = 100;    //initial
        static JSlider jslider = new JSlider(JSlider.VERTICAL,FPS_MIN, FPS_MAX, FPS_INIT);

        public Start() {
            super();
               this.setLayout(new FlowLayout());
        
             setBackground(Color.lightGray);
             setSize(300,200);
             setLocation(200,100);
             setVisible(true);

              jslider.setValue(52);
              jslider.setMajorTickSpacing(100);
              jslider.setMinorTickSpacing(10);
              jslider.setPaintTicks(true);
              jslider.setPaintLabels(true);
              jslider.setBorder(
              BorderFactory.createEmptyBorder(0,0,10,0));
              Font font = new Font("Serif", Font.ITALIC, 9);
              jslider.setFont(font);
              jslider.setPreferredSize(new Dimension(100, 300));

              JLabel readOut = new JLabel(jslider.getValue()+"");
              
              jslider.addChangeListener(new ChangeListener() {
                  public void stateChanged(ChangeEvent e) {
                        String s = Integer.toString(jslider.getValue());
                        readOut.setText(s + " ");
                        readOut.revalidate();
                  }
                });
          
            JPanel panel = new JPanel(new GridLayout(0,2));
              panel.add(jslider);
              panel.add(readOut);

              JFrame fr = new JFrame();
             Container contentPane = fr.getContentPane();
            //     contentPane.add(textControlsPane, BorderLayout.EAST);   
                 contentPane.add(panel, BorderLayout.CENTER);
            //    contentPane.add(buttonPanel, BorderLayout.SOUTH);
                fr.setBounds(1700,10,280,580);
                fr.setVisible(true);
        
    
        }
      

              
              public static void main(String[] args)
             {
                
              Drawing drawing = new Drawing();
              drawing.add(new Line2D.Double(100, 100, 150, 150));
            
              createDrawingFrame(createDrawingPanel(drawing,jslider)).setVisible(true);
              createDrawingFrame(createDrawingPanel(drawing,jslider)).setVisible(true);
            
              new Start();
              
              
             }

              public static JFrame createDrawingFrame(DrawingPanel panel) {
                  JFrame frame = new JFrame();
                  frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                  frame.add(panel);
                  frame.setSize(800, 600);
                  return frame;
              }

              private static DrawingPanel createDrawingPanel(Drawing drawing, JSlider jslider) {
                  DrawingPanel panel = new DrawingPanel(jslider);
                  panel.setDrawing(drawing);                           
                  panel.addMouseListener(new MouseAdapter() {
                      Point2D[] points = new Point2D[2];
                      int count = 0;

                      @Override
                      public void mouseClicked(MouseEvent e) {        //MouseEvent setzt zwei Punkte, diese in user-Koordinaten, über paint ins orig System
                          points[count] = e.getPoint();               
                          count = (count + 1) % 2;
                          if (count == 0) {
                              drawing.add(new Line2D.Double(points[0], points[1]));
                          }
                      }
                  });
                  return panel;
              }

    }

Nicht über die vielen Variablen wundern, habe ganz viel Quelltext vorher herausgenommen, damit es - äh - etwas übersichtlicher wird.
 

Neumi5694

Top Contributor
Ein Mousevent sollte nie durch was anderes ausgelöst werden.

In deinem Fall soll der Mouseevent soll eine Aktion auslösen, Vergrößern, so wie ich das verstanden habe.
Spätestens dann, wenn was Anderes die gleiche Aktion auslösen soll, dann hat der Code dieser Aktion nichts im Mouselistener zu suchen.

Dann gibt's eine gekapselte Funktion, die von beiden Quellen mit Parametern aufgerufen wird. Dort werden keine Begriffe wie "MousePosition" verwendet, da es ja auch ohne Maus funktionieren soll.
 
G

Gelöschtes Mitglied 71006

Gast
Ja, das erscheint mir logisch. Wie sieht denn eine gekapselte Funktion aus? Der Scroller soll vergrößern was die Maus zeichnet.

Nachgelesen: Java erreicht die Implementierung der Kapselung, indem alle Datenelemente privat gemacht werden und dann öffentliche Getter- und Setter-Methoden bereitgestellt werden, damit wir die Werte der privaten Variablen lesen und neue Werte für diese Variablen festlegen können?

Also müßte ich die Mauspunkte zuerst in User-Koordinatenn umwandeln und dann speichern, irgendwie ... vielleicht in einem Vektor?. Dann kann ich diese Punkte evtl. für den Scroller abrufen fürs Vergrößern - und über g2.draw(shape) zeichnen. Momentan fällt mir dazu nur "try and error" ein.
 
Zuletzt bearbeitet von einem Moderator:

Neumi5694

Top Contributor
Das wäre eine Möglichkeit.
Verwende aber nicht Vector, sondern eine Liste (ArrayList<Point> z.B.). Vektoren sind deprecated und nur noch aus Kompatibilitätsgründen vorhanden.
Wenn du dann die Zoomfunktion extern aufrufst (über Button z.B.), kannst du ein paar Punkte manuell eintragen oder wie auch immer es dir beliebt. Du kannst auch die Liste der Mausfunktion weiterverwenden.

Was die Getter und Setter angeht ... das hat mit diesem Beispiel nicht viel zu tun, dabei geht es um Datenkapselung. Ich meinte eher, dass die
Methode zum Zoomen auch als solche ansprechbar sein muss und der Code fürs Zoomen nicht im Listener steht. Da steht dann nur so was wie:
punkteListe = ... ;//+befüllen
zoomeMitDiesenParametern(punkteListe).
 
G

Gelöschtes Mitglied 71006

Gast
Wird wohl ein wenig Zeit in Anspruch nehmen. Wenn ich nicht damit klar komme, melde ich mich wieder.

Auch finde ich es nicht sehr praktisch, daß ein JSlider in Konstruktor steht. Möglicherweise gibt es dafür auch eine andere Lösung.
 
G

Gelöschtes Mitglied 71006

Gast
Die punkteListe ist echt super. Sie lässt sich auch bei jedem Maus-Klick füllen.
Die Umrechnung der Punkte ins eigene Koordinatensystem funktioniert dabei auch.

Bei "zoomeMitDiesenParametern(punkteListe) " erhalte ich keine Grafik mehr. Vielleicht darf kein DrawingPanel gemacht werden ...

Java:
/**TEST**/
    
        private static ArrayList<Point> punkteListe = new ArrayList<Point>();
        
        public static void punkteListeBefüllen(Point2D punkt) {
            punkteListe.add((Point) punkt);
            //erste Ausgabe
            System.out.println("PunkteListe: " + punkteListe);
            
        }
        public static ArrayList<Point> getPunkte() {
            return punkteListe;
        }
    
        public static void zoomeMitDiesenParametern(ArrayList<Point> punkteListe, JSlider jslider, Drawing drawing) {
            DrawingPanel panel = new DrawingPanel(jslider);
            Point2D[] points = new Point2D[2];
            int count = 0;
            
            for (int ix=0; ix<punkteListe.size(); ix++) {
                    
                    points[count] = punkteListe.get(ix);
                    
                  }
                  
                  count = (count + 1) % 2;
                if (count == 0) {
                    drawing.add(new Line2D.Double(panel.paintPoint(points[0]), panel.paintPoint(points[1])));
                }
        }
        /**TEST**/

Im Maus-Ereignis funktioniert das wo //ok steht schon. Wenn ich das wo //ok steht in zoomeMitDiesenParametern stecke geht es nicht mehr.
Wie könnte zoomeMitDiesenParametern(punkteListe) aussehen?

Java:
 private static DrawingPanel createDrawingPanel(Drawing drawing, JSlider jslider) {
                  DrawingPanel panel = new DrawingPanel(jslider);
                  panel.setDrawing(drawing);                           
                  panel.addMouseListener(new MouseAdapter() {
                    //  Point2D[] points = new Point2D[2];
                    //  int count = 0;

                      @Override
                      public void mouseClicked(MouseEvent e) {       
                          Point2D ePoint = panel.userPoint(e.getPoint()); //MouseEvent setzt zwei Punkte, diese in user-Koordinaten, über paint ins orig System
                          punkteListeBefüllen(ePoint);                //Für Zoomen jSlider
                          System.out.println("PunkteListe getPunkte: " + getPunkte());
                          
                         // points[count] = e.getPoint();       
                     /**     points[count] = ePoint;
                          count = (count + 1) % 2;
                          if (count == 0) {
                              drawing.add(new Line2D.Double(panel.paintPoint(points[0]), panel.paintPoint(points[1])));
                          }
                      **/
                          
                      /**ok      -- das hier funktioniert
                        for (int ix=0; ix<punkteListe.size(); ix++) {
                          
                          points[count] = punkteListe.get(ix);
                          
                        }
                        
                          count = (count + 1) % 2;
                        if (count == 0) {
                            drawing.add(new Line2D.Double(panel.paintPoint(points[0]), panel.paintPoint(points[1])));
                        }
                       **/
                          
                     // nok -- das funktioniert nicht
                        
                          zoomeMitDiesenParametern(punkteListe, jslider, drawing);
                      }
                  });
                  return panel;
              }

Danke an Neumi... - das mit der ArrayList ist ein guter Tipp, denn dann kann ich auch Linien wieder löschen.
 
G

Gelöschtes Mitglied 71006

Gast
Die punkteListe ist echt super. Sie lässt sich auch bei jedem Maus-Klick füllen.
Die Umrechnung der Punkte ins eigene Koordinatensystem funktioniert dabei auch.

Bei "zoomeMitDiesenParametern(punkteListe) " erhalte ich keine Grafik mehr. Vielleicht darf kein DrawingPanel gemacht werden ...

Java:
/**TEST**/
   
        private static ArrayList<Point> punkteListe = new ArrayList<Point>();
       
        public static void punkteListeBefüllen(Point2D punkt) {
            punkteListe.add((Point) punkt);
            //erste Ausgabe
            System.out.println("PunkteListe: " + punkteListe);
           
        }
        public static ArrayList<Point> getPunkte() {
            return punkteListe;
        }
   
        public static void zoomeMitDiesenParametern(ArrayList<Point> punkteListe, JSlider jslider, Drawing drawing) {
            DrawingPanel panel = new DrawingPanel(jslider);
            Point2D[] points = new Point2D[2];
            int count = 0;
           
            for (int ix=0; ix<punkteListe.size(); ix++) {
                   
                    points[count] = punkteListe.get(ix);
                   
                  }
                 
                  count = (count + 1) % 2;
                if (count == 0) {
                    drawing.add(new Line2D.Double(panel.paintPoint(points[0]), panel.paintPoint(points[1])));
                }
        }
        /**TEST**/

Im Maus-Ereignis funktioniert das wo //ok steht schon. Wenn ich das wo //ok steht in zoomeMitDiesenParametern stecke geht es nicht mehr.
Wie könnte zoomeMitDiesenParametern(punkteListe) aussehen?

Java:
 private static DrawingPanel createDrawingPanel(Drawing drawing, JSlider jslider) {
                  DrawingPanel panel = new DrawingPanel(jslider);
                  panel.setDrawing(drawing);                          
                  panel.addMouseListener(new MouseAdapter() {
                    //  Point2D[] points = new Point2D[2];
                    //  int count = 0;

                      @Override
                      public void mouseClicked(MouseEvent e) {      
                          Point2D ePoint = panel.userPoint(e.getPoint()); //MouseEvent setzt zwei Punkte, diese in user-Koordinaten, über paint ins orig System
                          punkteListeBefüllen(ePoint);                //Für Zoomen jSlider
                          System.out.println("PunkteListe getPunkte: " + getPunkte());
                         
                         // points[count] = e.getPoint();      
                     /**     points[count] = ePoint;
                          count = (count + 1) % 2;
                          if (count == 0) {
                              drawing.add(new Line2D.Double(panel.paintPoint(points[0]), panel.paintPoint(points[1])));
                          }
                      **/
                         
                      /**ok      -- das hier funktioniert
                        for (int ix=0; ix<punkteListe.size(); ix++) {
                         
                          points[count] = punkteListe.get(ix);
                         
                        }
                       
                          count = (count + 1) % 2;
                        if (count == 0) {
                            drawing.add(new Line2D.Double(panel.paintPoint(points[0]), panel.paintPoint(points[1])));
                        }
                       **/
                         
                     // nok -- das funktioniert nicht
                       
                          zoomeMitDiesenParametern(punkteListe, jslider, drawing);
                      }
                  });
                  return panel;
              }

Danke an Neumi... - das mit der ArrayList ist ein guter Tipp, denn dann kann ich auch Linien wieder löschen.
zoomeMitDiesenParametern funktioniert nun auch in dem Maus-Ereignis, aber nicht im Jslider.
 

Neumi5694

Top Contributor
zoomeMitDiesenParametern funktioniert nun auch in dem Maus-Ereignis, aber nicht im Jslider.
Hast du denn ein repaint für das Drawingpanel ausgelöst?
Zeig mal, was deine draw-Methode überhaupt macht.
Am Besten wären keine Code-Schnipsel, sondern gleich die ganze Klasse.

ps: Der Name war nur ein Work in Progress-Beispiel :) So was würde ich im Code nie schreiben.
 
G

Gelöschtes Mitglied 71006

Gast
Die Namen sind im Moment praktisch. Da ich gerade ausprobiere sind es zwei verschiedene Methoden "zoomeMitDiesenParametern" (in der for-Schleife nicht identisch).

[CODE lang="java" title="Start-Klasse"]package testtest;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import testtest.Test.Drawing;
import testtest.Test.DrawingPanel;


public class Start extends JPanel{

static final int FPS_MIN = 0;
static final int FPS_MAX = 600;
static final int FPS_INIT = 100; //initial
static JSlider jslider = new JSlider(JSlider.VERTICAL,FPS_MIN, FPS_MAX, FPS_INIT);

public Start() {
super();
this.setLayout(new FlowLayout());

setBackground(Color.lightGray);
setSize(300,200);
setLocation(200,100);
setVisible(true);

jslider.setValue(52);
jslider.setMajorTickSpacing(100);
jslider.setMinorTickSpacing(10);
jslider.setPaintTicks(true);
jslider.setPaintLabels(true);
jslider.setBorder(
BorderFactory.createEmptyBorder(0,0,10,0));
Font font = new Font("Serif", Font.ITALIC, 9);
jslider.setFont(font);
jslider.setPreferredSize(new Dimension(100, 300));

JLabel readOut = new JLabel(jslider.getValue()+"");

jslider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
String s = Integer.toString(jslider.getValue());
readOut.setText(s + " ");
readOut.revalidate();
}
});

JPanel panel = new JPanel(new GridLayout(0,2));
panel.add(jslider);
panel.add(readOut);

JFrame fr = new JFrame();
Container contentPane = fr.getContentPane();
// contentPane.add(textControlsPane, BorderLayout.EAST);
contentPane.add(panel, BorderLayout.CENTER);
// contentPane.add(buttonPanel, BorderLayout.SOUTH);
fr.setBounds(1700,10,280,580);
fr.setVisible(true);


}



/**TEST**/

private static ArrayList<Point> punkteListe = new ArrayList<Point>();

public static ArrayList<Point> getPunkteListe() {
return punkteListe;
}
public static void setPunkteListe(ArrayList<Point> punkteListe) {
Start.punkteListe = punkteListe;
}
public static void punkteListeBefüllen(Point2D punkt) {
punkteListe.add((Point) punkt);
setPunkteListe(punkteListe);
//erste Ausgabe
System.out.println("PunkteListe: " + punkteListe);

}
public static ArrayList<Point> getPunkte() {
return punkteListe;
}
static Point2D[] points = new Point2D[2];
static int count = 0;
public static void zoomeMitDiesenParametern(ArrayList<Point> punkteListe, Drawing drawing,DrawingPanel panel) {
// DrawingPanel panel = new DrawingPanel(jslider);


for (int ix=0; ix<punkteListe.size(); ix++) {

points[count] = punkteListe.get(ix);
System.out.println(" Punkt von PunkteLinie: "+points[count]);


}

count = (count + 1) % 2;
System.out.println("count: "+count);
if (count == 0) {
System.out.println("PunkteLinie: "+points[0]+", "+points[1]);
drawing.add(new Line2D.Double(panel.paintPoint(points[0]), panel.paintPoint(points[1])));
System.out.println("PunkteLinie: " + panel.paintPoint(points[0])+", "+ panel.paintPoint(points[1]));
}
}
/**TEST**/

public static void main(String[] args)
{

Drawing drawing = new Drawing();
drawing.add(new Line2D.Double(100, 100, 150, 150));

createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);

new Start();

/**TEST**/
Point2D d = new Point(3,5);
Point2D e = new Point(5,15);

punkteListeBefüllen(d);
punkteListeBefüllen(e);

/**TEST**/

}

public static JFrame createDrawingFrame(DrawingPanel panel) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(panel);
frame.setSize(800, 600);
return frame;
}

private static DrawingPanel createDrawingPanel(Drawing drawing) {
DrawingPanel panel = new DrawingPanel(jslider);
panel.setDrawing(drawing);
panel.addMouseListener(new MouseAdapter() {
// Point2D[] points = new Point2D[2];
// int count = 0;

@Override
public void mouseClicked(MouseEvent e) {
Point2D ePoint = panel.userPoint(e.getPoint()); //MouseEvent setzt zwei Punkte, diese in user-Koordinaten, über paint ins orig System
punkteListeBefüllen(ePoint); //Für Zoomen jSlider
System.out.println("PunkteListe getPunkte: " + getPunkte());
// nok -- das funktioniert nicht

zoomeMitDiesenParametern(punkteListe, drawing, panel);

// points[count] = e.getPoint();
/** points[count] = ePoint;
count = (count + 1) % 2;
if (count == 0) {
drawing.add(new Line2D.Double(panel.paintPoint(points[0]), panel.paintPoint(points[1])));
}
**/

/**ok -- das hier funktioniert
for (int ix=0; ix<punkteListe.size(); ix++) {

points[count] = punkteListe.get(ix);

}

count = (count + 1) % 2;
if (count == 0) {
drawing.add(new Line2D.Double(panel.paintPoint(points[0]), panel.paintPoint(points[1])));
}
/** **/

}
});
return panel;
}

}


[/CODE]
[CODE lang="java" title="Test-Klasse"]package testtest;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


import java.util.*;
import java.util.List;

public class Test {

public static interface DrawingListener {
void modified();
}

public static class Drawing {
private List<Shape> shapes = new ArrayList<>();
private List<DrawingListener> listeners = new ArrayList<>();

public List<Shape> getShapes() {
return shapes;
}

public void add(Shape shape) {
shapes.add(shape);
modified();
}

public void remove(Shape shape) {
shapes.remove(shape);
modified();
}

public void addListener(DrawingListener l) {
listeners.add(l);
}

public void removeListener(DrawingListener l) {
listeners.remove(l);
}

public void modified() {
for (DrawingListener l : listeners) {
l.modified();
}
}
}

static class DrawingPanel extends JComponent {
private static int mousX, mousY;
private static boolean mouseclicked = false;

static JSlider jslider = new JSlider();

private double xmin;
private double xmax;
private double ymin;
private double ymax;
private double x0;
private double y0;
private double ppcm;
double step = 51.90288713910761; //51.90288713910761; //Zoom-Faktor initialisieren (über Slider änderbar)
double n = 10;
double m = 10;
double j1 = 0;
double j = j1+0;
double j2 = 0;
int p = 0;
double t = 0*step/n;
int k1 = 0;
double k = k1*step;
int nb = 0;

int l1 = 0;
double l = l1*step;
double f = n * t + k;
double g = m * t + l;

/*********************************/
Point p0 = new Point();
Point p1 = new Point();
double tx0 = 0;
double ty0 = 0;
double tx1 = 0;
double ty1 = 0;
Line2D.Double zeichenLinie2 = new Line2D.Double(0,0,0,0);
private Drawing drawing;
private DrawingListener listener = () -> repaint();

private Vector vector;
// Start start = new Start();

//private static ArrayList<Point> punkteListe = new ArrayList<Point>();
/*********************************/
public DrawingPanel(JSlider jslider) {
jslider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JSlider model =
(JSlider)e.getSource();

if(model.getValueIsAdjusting()) {
int min = model.getMinimum(),
max = model.getMaximum(),
span = max - min,
value = model.getValue();
step = value;
if (step <= 0) {
// n = 1;
// m=1;
step = 1;
System.out.println("STEP < 1 => STEP = 1");
}

k = k1*step;
f = n * t + k;
l = l1*step;
g = m * t + l;

zoomeMitDiesenParametern(punkteListe, drawing);
// revalidate();
// repaint();
}
}
});

}



/**TEST**/
static Start start = new Start();
private static ArrayList<Point> punkteListe = new ArrayList<Point>();

public static void punkteListeBefüllen(Point2D punkt) {
punkteListe.add((Point) punkt);
//erste Ausgabe
System.out.println("PunkteListe: " + punkteListe);

}
public static ArrayList<Point> getPunkte() {
return punkteListe;
}
static Point2D[] points = new Point2D[2];
static int count = 0;
public void zoomeMitDiesenParametern(ArrayList<Point> punkteListe, Drawing drawing) {
// DrawingPanel panel = new DrawingPanel(jslider);
punkteListe = start.getPunkteListe();

/** for (int ix=0; ix<punkteListe.size(); ix++) {

points[count] = punkteListe.get(ix);
System.out.println("TEST Punkt von PunkteLinie: "+points[count]);

count = (count + 1) % 2;
System.out.println("count TEST: "+count);
if (count == 0) {
System.out.println("PunkteLinie TEST: "+points[0]+", "+points[1]);
drawing.add(new Line2D.Double(paintPoint(points[0]), paintPoint(points[1])));
// System.out.println("PunkteLinie: " + paintPoint(points[0])+", "+ paintPoint(points[1]));
}


}**/
/**ok -- das hier funktioniert **/
for (int ix=0; ix<punkteListe.size(); ix++) {

points[count] = punkteListe.get(ix);
count = (count + 1) % 2;
if (count == 0) {
drawing.add(new Line2D.Double(paintPoint(points[0]), paintPoint(points[1])));
}
}


/** **/

}
/**TEST**/

public double userx (int px) { //x,y-Wert eines Punktes ins eigene Koordinatensystem umrechnen
return (px-(x0+k))/(step/n)+j1;
}
public double usery (int py) {
return ((y0+l)-py)/(step/m)+j2;
}
public double paintx ( double ux) { //zeichnen der Punkte, umrechnen ins ursprüngl. Koord.
double x1 = (ux*(step/n)+(x0+k));
return x1;
}
public double painty (double uy) {
double y1 = (y0+l)-(uy*(step/m));
return y1;
}
/** TEST **/
public double userdx (double px) {
return (px-(x0+k))/(step/n)+j1;
}
public double userdy (double py) {
return ((y0+l)-py)/(step/m)+j2;
}
public Point2D userPoint(Point2D normalPoint2D) {
double px = normalPoint2D.getX();
double py = normalPoint2D.getY();

int p0x =(int)userdx(px);
int p0y =(int)userdy(py);
Point2D userPoint = new Point(p0x,p0y);
return userPoint;
}
public Point2D paintPoint(Point2D userPoint2D) {
double px = userPoint2D.getX();
double py = userPoint2D.getY();

int p1x = (int)paintx(px);
int p1y = (int)painty(py);
Point2D paintPoint = new Point(p1x,p1y);
return paintPoint;
}
/** TEST ENDE **/

public void setDrawing(Drawing newDrawing) {
if (drawing != null) {
drawing.removeListener(listener);
}
drawing = newDrawing;
if (drawing != null) {
drawing.addListener(listener);
}
}
/** public void update(Graphics graphics)
{
paintComponent(graphics); //paint(g) auskommentiert -- wenn update zuerst claer aufruft und dann paint wird der Click übermalt.
//zum Beispiel Fenster in der Größe ziehen ruft das update Systems auf. Die Methode update wird nicht überschrieben und
// ein clear wird ausgeführt.
System.out.println("update wurde aufgerufen");

} **/
public void paintComponent(Graphics gr) {
super.paintComponent(gr);

if (drawing == null) {
return;
}

Graphics2D g2 = (Graphics2D) gr;
for (Shape shape : drawing.getShapes()) {
g2.draw(shape);
}
String str;
g2.setColor(Color.red);

//super.paint(g2);

x0 = this.getWidth() / 2;
y0 = this.getHeight() / 2;

if(k<=0) {
xmin = (userx(0)+f)-j1;
xmax = userx(this.getWidth())-f-j1;
} else {
xmin = userx(0)-f-j1;
xmax = userx(this.getWidth())+f-j1;
}

if(l<=0) {
ymin = usery(this.getHeight())+g-j2;
ymax = (usery(0)-g)-j2;
} else {
ymin = usery(this.getHeight()) - g -j2;
ymax = usery(0)+g -j2;
}
ppcm = 226/2.54;

ppcm = Toolkit.getDefaultToolkit().getScreenResolution();
System.out.println("Toolkit DPI?: " + ppcm);
ppcm = 10 * 226/2.54;
System.out.println("Berechnet: " + ppcm);

System.out.println("newnewnenwnenDRAWDRAWDRAWPPPPPPPPPPPPPPPPP"+step+"/"+j1);


drawMillipier(g2);
// Abstand Testen (pixel nach cm)
Point a = new Point(1,2);
Point b = new Point(2,1);
Point c = new Point(3,5);
Point aa = new Point(3,6);
Line2D.Double zeichenLinie = new Line2D.Double(paintx(1-j1), painty(2-j2), paintx(2-j1), painty(1-j2));
Line2D.Double zeichenLinie1 = new Line2D.Double(paintx(2-j1), painty(1-j2), paintx(3-j1), painty(5-j2));
//Line2D.Double zeichenLinie2 = new Line2D.Double(paintx(tx0-j1), painty(ty0-j2), paintx(tx1-j1), painty(ty1-j2));
g2.draw(zeichenLinie);
g2.draw(zeichenLinie1);
}

/** Point2D d = new Point(3,5);
Point2D e = new Point(5,15);

private ArrayList<Point> punkteListe = new ArrayList<Point>();

public void punkteListeBefüllen(Point2D punkt) {
punkteListe.add((Point) punkt);
System.out.println("PunkteListe: " + punkteListe);
}

public ArrayList zoomeMitDiesenParametern(ArrayList punkteListe){
return punkteListe;
}**/



private void drawMillipier(Graphics2D g2d) {

g2d.setColor(new Color(0,0,0));
g2d.setStroke(new BasicStroke(0.8f));
for (j =(int) xmin; j <= xmax+k; j++) { // Einteilung der x-Achse
if (j%n==0){
Line2D.Double xstriche = new Line2D.Double(paintx(j),painty(-1),paintx(j),painty(1));
g2d.draw(xstriche);
}
}

for (j = (int) ymin; j <= ymax; j++) { // Einteilung der y-Achse
if (j%m==0){
Line2D.Double ystriche = new Line2D.Double(paintx(-1),painty(j),paintx(1),painty(j));
g2d.draw(ystriche);
}
}

// Koordinatenkreuz // dicke Linien

for (p = (int)xmin; p <= xmax; p++) {

if (p%n==0){
///// System.out.println("xmin: "+(int)xmin+" xmax: "+(int)xmax+" Differenz: "+(int)(xmin-xmax));

g2d.setColor(new Color(0,0,0));
g2d.setStroke(new BasicStroke(1));
Line2D.Double xAchse = new Line2D.Double(paintx(xmin), painty(0), paintx(xmax), painty(0));
g2d.draw(xAchse);

Line2D.Double yAchse = new Line2D.Double(paintx(0), painty(ymin), paintx(0), painty(ymax));
g2d.draw(yAchse);
}
}
}
}





/** public static JFrame createDrawingFrame(DrawingPanel panel) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(panel);
frame.setSize(800, 600);
return frame;
}

private static DrawingPanel createDrawingPanel(Drawing drawing) {
DrawingPanel panel = new DrawingPanel();
panel.setDrawing(drawing);
panel.addMouseListener(new MouseAdapter() {
Point2D[] points = new Point2D[2];
int count = 0;

@Override
public void mouseClicked(MouseEvent e) { //MouseEvent setzt zwei Punkte, diese in user-Koordinaten, über paint ins orig System
points[count] = e.getPoint();
count = (count + 1) % 2;
if (count == 0) {
drawing.add(new Line2D.Double(points[0], points[1]));
}
}
});
return panel;
}**/

/** public void run() {
Drawing drawing = new Drawing();
drawing.add(new Line2D.Double(100, 100, 150, 150));

createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
}

public static void main(String[] args) {
// SwingUtilities.invokeLater(() -> new Test().run());
Drawing drawing = new Drawing();
drawing.add(new Line2D.Double(100, 100, 150, 150));

createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
}**/
}[/CODE]
 

Neumi5694

Top Contributor
Ich hab die Klassen ausprobiert, der Slider löst das Neuzeichnen aus.
ps: Wenn du paintComponent(g) überschreibst, musst du dort als erstes super.paintComponent(g) aufrufen
 
G

Gelöschtes Mitglied 71006

Gast
Verstehe das nicht. Der Slider macht zu viele Linien in verschiedenen Größen. Er sollte einfach nur gezeichnete Linien skalieren.
super.paintComponent(gr) ist doch da.
 
Zuletzt bearbeitet von einem Moderator:

Neumi5694

Top Contributor
Anm: du hast zoomMitDiesenParametern doppelt.
Wie wär's, wenn du das zu einer Methode von drawing machst oder des Fensters, das drawing beinhaltet?

ps: Ich hab gerade in beiden zoom-Funktionen clearShapes aufgerufen. Funktioniert.
 
G

Gelöschtes Mitglied 71006

Gast
Ja, hey Klasse. Wow - es funktioniert. You made my day. Danke, danke, danke ... . Wünsche noch einen schönen Abend.
 
G

Gelöschtes Mitglied 71006

Gast
Es hat noch einen Bug. Nur eine Linie ist möglich. Bei zwei Linien geht es nicht.
 
G

Gelöschtes Mitglied 71006

Gast
So, jetzt geht es. Hatte "clear" an der falschen Stelle. Danke nochmals.
 
G

Gelöschtes Mitglied 71006

Gast
Mit diesen Dingen komme ich leider nicht mehr weiter. Habe versucht aus beiden zoom-Funktionen eine einzige zu machen, leider ohne Erfolg.
 

Neumi5694

Top Contributor
Es ist eine Frage der Herangehensweise.
Welche Klasse ist vom Zoom betroffen, bzw. soll zoomen? Drawing.
Also sollte die Zoom-Methode eine Methode dieser Klasse sein (NICHT statisch, muss eine Instanz voraussetzen) und von außen aufrufbar sein.
Fehlen dir Werte? Dann übergib sie.

Du machst - grob gesagt - gerade so was wie das hier:
Java:
class A {
    Drawing myDrawing = ...;
  
    void handleMouseEvent) {
        zoomWithFactor(someValue);
    }

    void zoomWithZoomfactor(SomeType zoomFactor) {
        SomeObject aktuelleWerte = ;
        neueWerte = ;//neue Werte werden berechnet mit einem gewissen Parameter Zoomfaktor z.B.
        myDrawing.setZoomParameters(neueWerte)
    }
}

class B {
    Drawing myDrawing = ...;
   
    void handleButtonEvent) {
        zoomWithFactor(someValue);
    }

    void zoomWithZoomfactor(SomeType zoomFactor) {
        SomeObject aktuelleWerte = ;
        neueWerte = ;//neue Werte werden berechnet mit einem gewissen Parameter Zoomfaktor z.B.
        myDrawing.setZoomParameters(neueWerte)
    }
}
class Drawing {
    void setAktuelleWerte(SomeObject neueWerte) {
       
    }
}

d.h. du hast 2 mal den selben Code für die Berechnung und das auch noch irgendwo, wo er nicht hingehört. Drawing soll sich darum kümmern, wie man aus den Rohdaten die Anzeigedaten rausbekommt. Das restliche Programm soll sich um die Darstellung nicht kümmern müssen.

Sinnvoll wäre also folgendes:

Java:
class A {
    Drawing myDrawing = ...;
  
    void handleMouseEvent) {
        myDrawing.zoomWithZoomfactor(someValue);
    }
}

class B {
    Drawing myDrawing = ...;
   
    void handleButtonEvent) {
        myDrawing.zoomWithZoomfactor(someValue);
    }
}
class Drawing {
    void zoomWithZoomfactor(SomeType zoomFactor) {
        SomeObject aktuelleWerte = ;
        neueWerte = ;//neue Werte werden berechnet mit einem gewissen Parameter Zoomfaktor z.B.
        this.setZoomParameters(neueWerte)
    }

    void setAktuelleWerte(SomeObject neueWerte) {
       
    }
}
 
G

Gelöschtes Mitglied 71006

Gast
Diese zoomWithZoomfactor(SomeType zoomFactor)
Java:
public static void zoomeDrawing(ArrayList<Point> punkteListe, Drawing drawing, DrawingPanel panel) {...
habe ich aus einer der beiden Klassen in Drawing kopiert. Das ist diese mit MouseEvent.

Beim Zoomen mit JSlider weiß ich nicht wie ich den Parameter DrawingPanel panel übergeben kann. Das Zoomen funktioniert dann nicht mehr.
Java:
jslider.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
              JSlider model =
               (JSlider)e.getSource();
         
                  if(model.getValueIsAdjusting()) {
                        int min = model.getMinimum(),
                              max = model.getMaximum(),
                              span = max - min,
                              value = model.getValue();
                        step = value;
                       if (step <= 0) {
                           // n = 1;
                          //  m=1;
                            step = 1;
                            System.out.println("STEP < 1  => STEP = 1");
                        }
                     
                     k = k1*step;
                           f = n * t + k;
                           l = l1*step;
                        g = m * t + l;
                   
                    zoomeMitDiesenParametern(drawing.punkteListe, drawing);
                        revalidate();
                        repaint();
                  }
            }

              });

Habe auch versucht den JSlider umzubauen, geht auch nicht. Diese "zoomeMitDiesenParametern(drawing.punkteListe, drawing); " hat nur zwei Parameter.
 
Zuletzt bearbeitet von einem Moderator:

Neumi5694

Top Contributor
Niemand hindert dich daran, die Methode zu erweitern. Wenn du zu wenig Parameter hast, füge hinzu, was dir fehlt. Die Methode muss von außen alles kriegen, was sie braucht, um zu funktionieren. Meines Erachtens nach wären das die Rohdaten und der Zoomfaktor, aber das weißt du wohl besser als ich.
 
G

Gelöschtes Mitglied 71006

Gast
Danke erstmal.

Die Herangehensweise wäre,
Rohdaten und Zoomfaktor an die Methode zu übergeben, also die "Arrayliste mit den Punkten" und vereinfacht "step".
Ich glaube das stellt für mich technisch ein Problem dar.
Ich übergebe den gesamten JSlider an mein DrawingPanel um das in paint() vorgezeichnete Koordinatensystem des DrawingPanel zoomen zu können.

Dann habe ich die MouseClicks um eine ArrayListe zu füllen und um zu zeichnen. Damit diese Zeichnung auch gezoomt werden kann braucht sie den "Zoomfaktor ", den der JSlider liefert. Innerhalb von stateChanged des JSlider wird der Zoomfaktor geliefert und zoomeMitDiesenParametern(drawing.punkteListe, drawing, "Zoomfaktor") aufgerufen. Eigentlich könnte das funktionieren, möglicherweise auch ohne das drawing.

Mein Problem ist aber, wenn ich innerhalb des stateChanged des JSlider das DrawingPanel selbst als Parameter übergeben möchte, geht es technisch nicht, bzw. ich weiß nicht wie. "stateChanged" steht im Konstruktor des DrawingPanel.
Ich brauche in der Methode zoomeMitDiesenParametern(drawing.punkteListe, drawing, "Zoomfaktor", DrawingPanel panel) eigentlich nicht die Rohdaten, sondern die umgewandelten "Userdaten" für mein Koordinatenssystem aus Methoden meines DrawingPanel. Deshalb versuche ich das DrawingPanel als Parameter zu übergeben. Diese werden dann zurück ins normale Koordinatensystem konvertiert beim zeichnen. Ich mache das, da meine Punkte in der Form (2,3) angegeben werden, und nicht so ähnlich wie (502,-303), wenn es um Punkt(2,3) geht.

"Und die Zoom-Methode sollte eine Methode dieser Klasse sein (NICHT statisch, muss eine Instanz voraussetzen) und von außen aufrufbar sein."
Heißt das diese Instanz brauche ich z. B. um eines der Fenster unabhängig größer zu ziehen?
 

Neumi5694

Top Contributor
Ich übergebe den gesamten JSlider an mein DrawingPanel um das in paint() vorgezeichnete Koordinatensystem des DrawingPanel zoomen zu können.
Das ist das genaue Gegenteil von dem, was du machen sollst ...
Dem Drawing soll es egal sein, woher die Einstellungen kommen. Übergib nur den einstellten Wert.

Mein Problem ist aber, wenn ich innerhalb des stateChanged des JSlider das DrawingPanel selbst als Parameter übergeben möchte, geht es technisch nicht, bzw. ich weiß nicht wie. "stateChanged" steht im Konstruktor des DrawingPanel.
Das ist schon gar keine rektanguläre Augenoperation mehr, das ist ein Knäuel. Du hast ein grundsätzliches Konzept-Problem. Du bist von Mauslistenern ausgegangen anstatt von dem, was sie bewirken sollen.

Das DrawingPanel soll sich nicht um externe Komponenten kümmern müssen, sein einziger Sinn und Zweck ist, etwas zu zeichnen (und eventuell Maus-Operationen, aber das ist eine Zusatzfunktion, nicht die Hauptaufgabe, der Listener sollte nicht im drawing verankert sein, sondern eine externe Klasse sein).
Wirf erst mal alles raus, das etwas anderes macht als zeichnen.
Dann überleg, was das Panel können muss, zoomen z.B. Also lege eine Methode zum Zoomen an. Beachte: Ich erwähne gerade gezielt keine Maus und keinen Slider, die haben mit dem Zoomen nichts zu tun.
Was soll es noch können? Das Offset der Grafik verschieben, also leg eine Methode dafür an.
...
Erst jetzt implementierst du einen Mauslistener, der diese Funktionen anspricht.


Das Drawing-Panel existiert ja als Variable im Frame oder im Programm als globale Eigenschaft. Dieses übergisbst du einmalig an das Panel, in dem sich der Slider befindet (und nicht umgekehrt)
Der Slider spricht dann diese Variable an - sofern nicht null.

Stell sicher, dass die Richtung des Informationsflusses passt.
Wenn du etwas steuern willst, dann brauchst du Steuerelemente / Eingaben. Die Servolenkung eines Autos braucht nicht wissen, wer am Steuer sitzt, der Zugriff erfolgt über die Lenkrad-Methode, dabei ist egal, ob das Lenkrad von einem Menschen oder einer Horde Hamster bewegt wird.
Du sagtst dem Benutzer oder den Hamstern, welches Auto er fahren soll (Instanzvariable drawing) und dass er es über ein Lenkrad steuert.
Du musst ihm nicht jedesmal erneut sagen, welches Auto er fahren soll, das hast du ihm einmalig beim Einsteigen (Initialisierung des Formulars mit dem Slider) gesagt, das merkt er sich. Falls diese Information zu dem Zeitpunkt nicht verfügbar ist, dann musst du noch eine Möglichkeit schaffen, sie nachträglich zu setzen (und auch nachdenken, was passiert, wenn dem Benutzer noch kein Auto zugewiesen wurde). Die Information kommt aber nicht vom Auto, sondern von dem, der das Auto an den Fahrer zuweist.
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 71006

Gast
Einfach ist es das DrawingPanel zu ändern.
Das ist noch keine große Änderung.

"Das Drawing-Panel existiert ja als Variable im Frame oder im Programm als globale Eigenschaft. Dieses übergibst du einmalig an das Panel, in dem sich der Slider befindet (und nicht umgekehrt)
Der Slider spricht dann diese Variable an - sofern nicht null."


Also ich übergebe es als Parameter?

public Start(DrawingPanel panel) {
...
}

Habe ein wenig getestet, aber das funktioniert so wie ich das mache leider nicht.

"Stell sicher, dass die Richtung des Informationsflusses passt. "
Ich sehe es mir morgen an.
 

Neumi5694

Top Contributor
MainFrame beinhaltet drawingPanel und weiß, wo die Controller sind.
Nachdem das drawingPanel erstellt wurde, wird es an den Controller übergeben, ob nun direkt im Konstruktor oder erst später per set... ist egal.
Der Event des Sliders sieht dann so aus
Java:
class SliderContainer extends JPanel {
    /**
     * Initialisierung ohne Übergabe eines ZoomListeners.
     */
    SliderContainerClass() {
        this(null);
    }
    /**
     * Initialisierung mit optionaler Übergabe eines ZoomListeners
     * @param listener das DrawingPanel oder etwas anderes, das eine setZoomfactor-Methode anbietet.
     */
    SliderContainer(ListensToZoomCommand listener) {
         //Komponenten initialisieren, Slider usw.
        setListener(listener);
        slider.addChangeListener(this::handleSliderChangeEvent);
    }

    /**
     * @param listener das DrawingPanel oder etwas anderes, das eine setZoomfactor-Methode anbietet.
     */
    void setListener(ListensToZoomCommand listener) {
        this.listener = listener;
    }

    void handleSliderChangeEvent(ChangeEvent e) {
        //gegebenenfalls Berechnungen, es sollte an dieser Stelle aber eigentlich nur der Zoomfaktor berechnet und übergeben werden.
        if (listener != null) {
            listener.setZoomfactor(...); //Berechnungen der  Screenkoordinaten finden in dieser Methode statt.
        }
    }
}

Alternativ kannst du auch keinen Listener übergeben und dir den z.B. bei Bedarf aus dem MainFrame holen, z.B. so: myMainFrame.getDisplay().
Dann natürlich muss myMainFrame mit in den Konstruktor. Hier kann man mit statischen Methoden etwas tricksen, aber davon rate ich erst mal ab, bis die Vorgehensweise an sich klar ist.

Du musst nur wirklich mal anfangen zu trennen. Der Slider ändert den Zoomfaktor - sonst nichts. Was das bewirkt, geht ihn nichts an.
Es hat Auswirkungen auf die Darstellung - also wird im Drawingpanel die Darstellung neu berechnet.
 
G

Gelöschtes Mitglied 71006

Gast
Im SliderContainer steht
Java:
SliderContainerClass() {
        this(null);
    }
Man kann sicher auch einfach "SliderContainer()" schreiben?

Soweit funktioniert es schon.
ZoomeMitDiesenParametern() funktioniert aber noch nicht. Auf jeden Fall schon mal Danke.

[CODE lang="java" title="SliderContainer"]package drawtest;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;


import drawtest.Test.Drawing;

class SliderContainer extends JPanel {
/**JSlider**/
static final int FPS_MIN = 0;
static final int FPS_MAX = 600;
static final int FPS_INIT = 100;
static JSlider jSlider = new JSlider(JSlider.VERTICAL,FPS_MIN, FPS_MAX, FPS_INIT);
static JLabel readOut = new JLabel(jSlider.getValue()+"");

Drawing drawing = new Drawing();
DrawingPanel listener = new DrawingPanel();

/**
* Initialisierung ohne Übergabe eines ZoomListeners.
*/
SliderContainer() {
this(null);
}
/**
* Initialisierung mit optionaler Übergabe eines ZoomListeners
* @param listener das DrawingPanel oder etwas anderes, das eine setZoomfactor-Methode anbietet.
*/
SliderContainer(DrawingPanel listener) {
//Komponenten initialisieren, Slider usw.
jSlider.setValue(52);
jSlider.setMajorTickSpacing(100);
jSlider.setMinorTickSpacing(10);
jSlider.setPaintTicks(true);
jSlider.setPaintLabels(true);
jSlider.setBorder(
BorderFactory.createEmptyBorder(0,0,10,0));
Font font = new Font("Serif", Font.ITALIC, 9);
jSlider.setFont(font);
jSlider.setPreferredSize(new Dimension(100, 300));

setListener(listener);

jSlider.addChangeListener(this::handleSliderChangeEvent);

JPanel panel1 = new JPanel(new GridLayout(0,2));
panel1.add(jSlider);
panel1.add(readOut);

JFrame fr = new JFrame();
Container contentPane = fr.getContentPane();
contentPane.add(panel1, BorderLayout.CENTER);
fr.setBounds(1700,10,280,580);
fr.setVisible(true);
}

/**
* @param listener das DrawingPanel oder etwas anderes, das eine setZoomfactor-Methode anbietet.
*/
void setListener(DrawingPanel listener) {
this.listener = listener;
}

void handleSliderChangeEvent(ChangeEvent e) {
//gegebenenfalls Berechnungen, es sollte an dieser Stelle aber eigentlich nur der Zoomfaktor berechnet und übergeben werden.
/** if (listener != null) {
listener.setZoomfactor(...); //Berechnungen der Screenkoordinaten finden in dieser Methode statt.
}**/

//listener.setZoomfactor(20.0);

if (listener != null) {
System.out.println("listener: " + listener);

jSlider = (JSlider)e.getSource();
if (!jSlider.getValueIsAdjusting()) {

String s = Integer.toString(jSlider.getValue());
readOut.setText(s + " ");
readOut.revalidate();

int min = jSlider.getMinimum(),
max = jSlider.getMaximum(),
span = max - min;
double zoomfaktor = jSlider.getValue();
System.out.println("zoomfaktor " + zoomfaktor);
listener.setZoomfactor(zoomfaktor);

// drawing.zoomeDrawing(drawing.punkteListe, drawing, drp);
// drawing.zoomeMitDiesenParametern(drawing.punkteListe, drawing, listener);

}

}
}

/** public static void main(String[] args) {
new SliderContainer();

}**/
}[/CODE]

mit dieser Methode in DrawingPanel.

[CODE lang="java" title="in DrawingPanel"] public DrawingPanel() {}

/** zoomfaktor**/
public void setZoomfactor(double zoomfaktor) {
this.step = zoomfaktor;
if (step <= 0) {
step=1;
System.out.println("STEP < 1 => STEP = 1");
}
k = k1*step;
f = n * t + k;
l = l1*step;
g = m * t + l;

// drawing.zoomeDrawing(drawing.punkteListe, drawing, this);
// drawing.zoomeMitDiesenParametern(drawing.punkteListe, drawing, this);

revalidate();
repaint();
System.out.println("STEP in zoomfaktor" + step + " " + zoomfaktor);
}
/** Ende zoomfaktor**/
...[/CODE]
 
G

Gelöschtes Mitglied 71006

Gast
Danke. Sehe ich mir später an.
Momentan merke ich, daß ich das Ganze noch nicht so richtig verstehe und durchdacht habe. Dieses einmal übergeben von Drawing, z. B. , oder muß ich eigentlich DrawingPanel listener = new DrawingPanel(); oder nur DrawingPanel listener; schreiben und was bewirkt es, ... die static Dinge, usw. ... .
Also mir reichte das bislang wenn es irgendwie läuft, viele Details habe ich nie beachtet.
 
G

Gelöschtes Mitglied 71006

Gast
Wenn ich nun z. B. auch einen "Button" erstelle, würde ich dann am Besten eine neue Class erstellen, so wie oben beschrieben?
Java:
class A {
    Drawing myDrawing = ...;
 
    void handleMouseEvent) {
        myDrawing.zoomWithZoomfactor(someValue);
    }
}

class B {
    Drawing myDrawing = ...;
  
    void handleSliderEvent) {
        myDrawing.zoomWithZoomfactor(someValue);
    }
    

class C {
    Drawing myDrawing = ...;
  
    void handleButtonEvent) {
        myDrawing.zoomWithZoomfactor(someValue);
    }
}

Das Resize der Fenster macht Probleme. Hat noch jemand eine Idee, wie man das machen kann?
 

Neumi5694

Top Contributor
Wenn ich nun z. B. auch einen "Button" erstelle, würde ich dann am Besten eine neue Class erstellen, so wie oben beschrieben?


Das Resize der Fenster macht Probleme. Hat noch jemand eine Idee, wie man das machen kann?

Das kommt ganz darauf an, wo dein neuer Button liegt. Liegt er im selben Panel wie der Slider, dann wäre eine neue Klasse wohl nicht sinnvoll.

"macht Probleme" ... inwiefern? Ich geh mal davon aus, dass du nach dem Resize die offsets neu berechnen musst, oder?
 
G

Gelöschtes Mitglied 71006

Gast
Das kommt ganz darauf an, wo dein neuer Button liegt. Liegt er im selben Panel wie der Slider, dann wäre eine neue Klasse wohl nicht sinnvoll.

"macht Probleme" ... inwiefern? Ich geh mal davon aus, dass du nach dem Resize die offsets neu berechnen musst, oder?
Ja klar, der Button liegt im gleichen Panel.
Insgesamt funktioniert es schon gut. Ich habe zwei Funktionen zoomeMitDiesenParametern. Beide stehen im Drawing und haben die gleichen Parameter.

Ich kann immer nur ein Fenster vergrößern. Beim Resize wird die Linie immer in beiden Panels geändert. Update() funktioniert wohl nicht fürs Ändern. Dann habe einen ComponentListener getestet mit dem Nachteil daß zwei verschiedene DrawingPanels erstellt werden müssen. Ich glaube, die zoomeMitDiesenParametern-Funktion berechnet die Offsets automatisch. Es scheint wegen des updates beider Fenster irgendwie nicht zu laufen.

Danke für jede Anregung.
 
G

Gelöschtes Mitglied 71006

Gast
Neumi5694, vielen Dank für Deine vielen Anleitungen. Damit bin ich wirklich richtig gut weiter gekommen.
Allerdings schaffe ich es nicht einen Button auf die gleiche Art einzubauen. Geht das auch bei ActionListenern?
[CODE lang="java" title="nur ein Test für Button"]JButton jbutton = new JButton("blue");

SliderContainer(DrawingPanel listener) {
setListener(listener);
// jbutton.addActionListener(this::actionPerformed);
jbutton.addActionListener(this::handleButtonAction);
//cbutton.addActionListener(this::actionPerformed);
}

public void handleButtonAction(ActionEvent event) {
if (listener != null) {
Object obj = event.getSource();
if (obj instanceof JTextField) {
System.out.println("Textfield event.getActionCommand(): "+ event.getActionCommand());
}
else if (obj instanceof JButton) {
String text = ((JButton) event.getSource()).getText();
text = event.getActionCommand();
listener.setButtonZoom(text);
}
}
}
/**public void actionPerformed(ActionEvent event) {
if (listener != null) {
Object obj = event.getSource();

if (obj instanceof JButton) {
String text = ((JButton) event.getSource()).getText();
text = event.getActionCommand();
listener.setButtonZoom(text);
}
}
}**/

//im DrawingPanel
//dann setButtonZoom(text){...}[/CODE]

Es wird leider nur ein DrawingPanel geändert beim Button-Klick. Funktioniert das beim ActionListener nicht?
Danke schon jetzt.
 
G

Gelöschtes Mitglied 71006

Gast
Neumi5694, vielen Dank für Deine vielen Anleitungen. Damit bin ich wirklich richtig gut weiter gekommen.
Allerdings schaffe ich es nicht einen Button auf die gleiche Art einzubauen. Geht das auch bei ActionListenern?
[CODE lang="java" title="nur ein Test für Button"]JButton jbutton = new JButton("blue");

SliderContainer(DrawingPanel listener) {
setListener(listener);
// jbutton.addActionListener(this::actionPerformed);
jbutton.addActionListener(this::handleButtonAction);
//cbutton.addActionListener(this::actionPerformed);
}

public void handleButtonAction(ActionEvent event) {
if (listener != null) {
Object obj = event.getSource();
if (obj instanceof JTextField) {
System.out.println("Textfield event.getActionCommand(): "+ event.getActionCommand());
}
else if (obj instanceof JButton) {
String text = ((JButton) event.getSource()).getText();
text = event.getActionCommand();
listener.setButtonZoom(text);
}
}
}
/**public void actionPerformed(ActionEvent event) {
if (listener != null) {
Object obj = event.getSource();

if (obj instanceof JButton) {
String text = ((JButton) event.getSource()).getText();
text = event.getActionCommand();
listener.setButtonZoom(text);
}
}
}**/

//im DrawingPanel
//dann setButtonZoom(text){...}[/CODE]

Es wird leider nur ein DrawingPanel geändert beim Button-Klick. Funktioniert das beim ActionListener nicht?
Danke schon jetzt.


ES GEHT NUN DOCH - habe alles Klassen nochmal neu in ein package gestellt - wieso es vorher nicht ging weiß ich aber nicht.
 
G

Gelöschtes Mitglied 71006

Gast
Ja klar, ist im selben Panel wie der Slider. Welche offsets?

Ich kann ja nur die Größe eines Fensters ändern. Meine Linie wird beim Ändern der Größe nicht verschoben, oder sie wird in beiden Panels verschoben. Die Änderung findet immer in beiden Panels statt. Ist das mit einem ComponentListener möglich? Update geht irgendwie nicht.

Insgesamt funktioniert es aber schon gut, abgesehen von resize. Ich habe zwei Funktionen zoomeMitDiesenParametern belassen. Das ist am einfachsten. Beide stehen in Drawing und haben die gleichen Parameter.

Danke für jede Anregung.
 

Neumi5694

Top Contributor
Ein Componentlistener reagiert z.B. auf Größenänderung. Was mit dem Event dann passiert, ist deine Sache.
Offsets: Ich denke, die Position der Trennlinien hängt von irgendwas ab, oder (Panelgröße z.B.)? Und die gezeichneten Linien stehen relativ dazu.
Wenn sich nun die Position der Trenninie im aktuellen Panel verschiebt, dann müssen sich auch die anderen Linien mit verschieben. Das mein ich mit Offsets. Falls das kein Thema ist, auch gut.
Vielleicht wäre ja ein AffineTransform das richtige für dich. Damit arbeitest du dann nur noch in absoluten Koordinaten, die Zeichenengine selbst rechnet deine Koordinaten dann in Bildschirmkoordinaten um.
Ich verwend so was nicht, da ich eh auch noch was brauche, das Mauskoordinaten in absolute umrechnet.
 
G

Gelöschtes Mitglied 71006

Gast
Zwei verschiedene DrawingPanels zu bauen und sie beide an den JSliderContainer zu übergeben, könnte eine Lösung sein. Dann kann ich zwischen den Panels unterscheiden. Ich werde das jetzt ausprobieren.
Wenn das funktioniert, teste ich noch andere Möglichkeiten um zwischen den Panels zu unterscheiden.
 
G

Gelöschtes Mitglied 71006

Gast
Hallo nochmals, habe gerade bemerkt, daß ich nicht nur zwei DrawingPanels, sondern auch zwei Steuer-Panels (also Slider-Container) erhalte. Nur einer davon funktioniert. Eigentlich wollte ich zwei DrawingPanels und ein Steuer-Panel. Kennt jemand dazu eine Möglichkeit?
Danke im Voraus.

Hier nochmals was beim Start gemacht wird:
Java:
public static void main(String[] args) {
              Drawing drawing = new Drawing();
              createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
              createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
      ...       
private static DrawingPanel createDrawingPanel(Drawing drawing) {
                  DrawingPanel panel = new DrawingPanel();
                  new SliderContainer(panel);       //Steuer-Panel
        ...
 

Neumi5694

Top Contributor
Im Grunde musst du nur genau das programmieren, was du gerade beschrieben hast.
Erstelle 2 DrawingPanels und 1 SteuerPanel.

Die Methode createDrawingPanel macht zu viel. Warum wird dort ein Slider erstellt?

DrawingPanel frame1 = new DrawingPanel();
DrawingPanel frame2 = new DrawingPanel();
SteuerPanel steurpanel = new SteuerPanel();

Als Liste:
steuerpanel.setZoomListeners(Array.asList(frame1,frame2));
Einzeln:
zoompanel.addZoomListener(frame1);
zoompanel.addZoomListener(frame2);
 
G

Gelöschtes Mitglied 71006

Gast
Mit diesen beiden Methoden in Steuerpanel:
Java:
 private List<DrawingPanel> zoomlisteners = new ArrayList<>();
  
   void setZoomListener(DrawingPanel zoomlistener) {
       this.listener = zoomlistener;
  }
 
   void setZoomListeners(List<DrawingPanel> zoomlisteners) {
       // this.listener = zoomlistener;
        for(DrawingPanel listener : zoomlisteners)
        {
            System.out.println("ELEMENT: "+ listener);
            this.listener = listener;
        }
   }
und in Main mit

Java:
// SwingUtilities.invokeLater(() -> new Start().run()); 
              Drawing drawing = new Drawing();
          //    drawing.add(new Line2D.Double(100, 100, 150, 150));
              //createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
              //createDrawingFrame(createDrawingPanel(drawing)).setVisible(true);
              
              DrawingPanel frame1 = createDrawingPanel(drawing);
              createDrawingFrame(frame1).setVisible(true);
              
              
              DrawingPanel frame2 = createDrawingPanel(drawing);
              createDrawingFrame(frame2).setVisible(true);
              
              SliderContainer steuerpanel = new SliderContainer();

              //JPanel a[] = new JPanel[] {frame1, frame2};
              //List<Component> list = Arrays.asList(a);
              
              //Als Liste:
              //    steuerpanel.setZoomListeners(Arrays.asList(frame1,frame2));
              
              //    Einzeln:
              
                  steuerpanel.setZoomListener(frame1);
                  steuerpanel.setZoomListener(frame2);
                  //steuerpanel2.setZoomListener(frame2);
läßt sich immer nur eines der beiden DrawingPanels steuern, während das zweite nichts tut. Das ist immer wieder so, auch vereinfacht über Panel ohne Component habe ich es getestet. Liegt wahrscheinlich am SliderContainer, nur wo?
 
G

Gelöschtes Mitglied 71006

Gast
Danke und ein DrawingPanel ist eigentlich auch genug. Ich mache einfach mit einem DrawingPanel weiter - also obige Anfrage kann ignoriert werden.
 
Zuletzt bearbeitet von einem Moderator:

Neumi5694

Top Contributor
Noch zur Frage, kannst du ja für die Zukunft mal brauchen.
Deine this.listener Variable kann ja nur einen speichern. Nur der letzte Wert in der Liste wird gespeichert.
Code:
void setZoomListeners(List<DrawingPanel> zoomlisteners) {
       // this.listener = zoomlistener;
        for(DrawingPanel listener : zoomlisteners)
        {
            System.out.println("ELEMENT: "+ listener);
            this.listener = listener;
        }
}
Ich dachte eigentlich, es wäre logisch, dass du - wenn du mehrere ansteuern willst - auch mal mehrere speichern können musst.

Formulier doch vor dem Losprogrammieren einfach mal aus, was passieren soll, der Rest ergibt sich dann im Normalfall von selbst. Ich gehe davon aus, dass dein Handler auch nur eine Variable nutzt und nicht eine Liste von Panels.


1. entfferne die Klassenvariable "listener" und ersetze sie durch diese Variable
Code:
private final ArrayList<DrawingPanel> listeners = new ArrayList<>();

2. Setzen der Liste
Code:
    void setZoomListeners(List<DrawingPanel> zoomlisteners) {
        this.listeners.clear(); //das ist jetzt eine Liste von Listenern, du willst ja mehr als einen.
        if (zoomListeners != null) {
            for(DrawingPanel aListener : zoomlisteners) {
                this.listeners.add(aListener);
            }
        }
    }
(add würde der Liste je ein Element hinzufügen, deshalb "add")

3. Nutzen der Liste
Entsprechend musst du im Handler dann auch mehrere Listener behandeln.
das erste steuern.
Java:
handleSlider () {
    for (listener : listeners) {
        listener.setZoomFactor(...);
    }
}
 
G

Gelöschtes Mitglied 71006

Gast
Ja, jetzt funktioniert es für zwei DrawingPanels. Vielen Dank.

Also, ich verstehe "diese" Drawing-Klasse nun etwas besser.
Hatte zwar versucht Drawing als Vorlage für SteuerPanel zu nutzen, bin aber nicht klargekommen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
A Mouse event und exit on close AWT, Swing, JavaFX & SWT 11
Iron Monkey JTable 2 Selektionsfarben Mouse-Event AWT, Swing, JavaFX & SWT 8
T mouse-event auf jcolorchooser AWT, Swing, JavaFX & SWT 2
S Mouse-Event in JTable AWT, Swing, JavaFX & SWT 3
G mouse events AWT, Swing, JavaFX & SWT 6
N Mouse methods AWT, Swing, JavaFX & SWT 10
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
M Java FX Mouse over AWT, Swing, JavaFX & SWT 4
U Mouse + Keylistener AWT, Swing, JavaFX & SWT 12
B GUI mit Mouse Touch AWT, Swing, JavaFX & SWT 27
S Mouse Events in einer sortierten JTable unterscheiden AWT, Swing, JavaFX & SWT 18
H Rechteck via Mouse bewegen AWT, Swing, JavaFX & SWT 2
H Java Robot mouse funktioniert nur auf Notebook nicht. AWT, Swing, JavaFX & SWT 4
E JFace ListSelectionDialog & Mouse-Events? AWT, Swing, JavaFX & SWT 2
lumo SWT Composite Mouse Track Lisetner AWT, Swing, JavaFX & SWT 2
K JButton nur dann aktivieren, wenn die Mouse 3 Sek. über dem Button bleibt AWT, Swing, JavaFX & SWT 2
M Mouse Wheel Listener reagiert mehrmals AWT, Swing, JavaFX & SWT 5
R JTable - eigener Editor - Mouse events AWT, Swing, JavaFX & SWT 2
H fwststellen, ob sich Mouse auf dem Rand befindet AWT, Swing, JavaFX & SWT 3
Dit_ Buttons Mouse-Over Effekt AWT, Swing, JavaFX & SWT 8
R Key und Mouse Events AWT, Swing, JavaFX & SWT 2
D Mouse Koordinaten AWT, Swing, JavaFX & SWT 2
P Mouse Listener beenden AWT, Swing, JavaFX & SWT 14
raptorrs JFrame nur anzeigen, solange die Mouse gedrückt ist AWT, Swing, JavaFX & SWT 3
G JButton Mouse Over Text AWT, Swing, JavaFX & SWT 2
T Mouse Popup AWT, Swing, JavaFX & SWT 2
M Bug; Swing-Worker, Progressbar und Mouse AWT, Swing, JavaFX & SWT 22
R Mouse Wheel funktioniert nicht im JDialog ! AWT, Swing, JavaFX & SWT 4
M eine zeichnen beim mouse ziehen AWT, Swing, JavaFX & SWT 8
K Mouse Events der Scrollbar/pane AWT, Swing, JavaFX & SWT 2
V JPopupMenu Problem und Tipp zu mouse/key AWT, Swing, JavaFX & SWT 3
S Rechteck per Mouse aufziehen AWT, Swing, JavaFX & SWT 7
K Mouse Position nach Drag und Drop? AWT, Swing, JavaFX & SWT 4
M Grafikobjekte mit Mouse auswählen und verschieben AWT, Swing, JavaFX & SWT 2
D JLabel aus einem Mouse- bzw. KeyListener aendern AWT, Swing, JavaFX & SWT 2
Juelin in javafx Event auslösen AWT, Swing, JavaFX & SWT 4
schoel27 Mehrere JButtons sollen das gleiche Event auslösen AWT, Swing, JavaFX & SWT 2
K Warum genau hat man einen Listener, dann ein Event und was ist ein Adapter AWT, Swing, JavaFX & SWT 2
izoards Java FX Window Event SHOWING AWT, Swing, JavaFX & SWT 17
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
B JavaFX Von welcher Klasse und zu welchem Zeitpunkt werden Event-Objekte erstellt? AWT, Swing, JavaFX & SWT 3
L JavaFX Ich suche das passende Textfield Event AWT, Swing, JavaFX & SWT 1
J CheckBoxListCell auf click event in listView reagieren AWT, Swing, JavaFX & SWT 1
W JavaFX Etwas Tabellenartiges + Cell-Content-Changed-Event (o.ä.) AWT, Swing, JavaFX & SWT 30
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
B Swing Windowbuilder Rückgabewert im Event AWT, Swing, JavaFX & SWT 3
Z Befehl Action Event Verlassen AWT, Swing, JavaFX & SWT 4
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
M JavaFX Absoluter Fokus während drag Event AWT, Swing, JavaFX & SWT 10
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
K Event Handling ComboBox Event Handler AWT, Swing, JavaFX & SWT 7
Sugan Swipe Event? AWT, Swing, JavaFX & SWT 8
Tausendsassa Text changed event handler jTextField AWT, Swing, JavaFX & SWT 3
H Event Handling JavaFx - auf Event warten AWT, Swing, JavaFX & SWT 4
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
L JDialog - Event wenn Parent größe ändert AWT, Swing, JavaFX & SWT 2
T Internes Event-handling in TextField/JTextField AWT, Swing, JavaFX & SWT 2
M Swing OnLoad-Event o. Ä. AWT, Swing, JavaFX & SWT 3
D Event Handling in Komplexen Anwendungen AWT, Swing, JavaFX & SWT 9
D Event Handling "Plötzlich" kein mouseMoved-Event AWT, Swing, JavaFX & SWT 2
A Minimalestopuhr: JLabel.setText() durch eigenes Event ändern AWT, Swing, JavaFX & SWT 6
J Swing JMenuItem-Event?? AWT, Swing, JavaFX & SWT 3
J Swing JTable-Event für einen Select?? AWT, Swing, JavaFX & SWT 3
V Swing Custom JToggleButton in JTable - Click-Event geht erst beim zweiten Mal AWT, Swing, JavaFX & SWT 7
F Event Handling AWT, Swing, JavaFX & SWT 7
J Button Event nur einmal ausführen AWT, Swing, JavaFX & SWT 3
S SWT Shell durch Event in der Größe verändern AWT, Swing, JavaFX & SWT 7
J Speichern, Event, Hintergrund getAppletContext AWT, Swing, JavaFX & SWT 2
T Callback vs. Event listener AWT, Swing, JavaFX & SWT 7
F Frage zu Event KeyTyped bei jPanel AWT, Swing, JavaFX & SWT 4
S MenuBar ActionListener Event ... AWT, Swing, JavaFX & SWT 6
T Anzahl Event Listeners AWT, Swing, JavaFX & SWT 4
A Swing JButton int im Event AWT, Swing, JavaFX & SWT 9
G Swing Onkeyup Event AWT, Swing, JavaFX & SWT 3
P Action Event abfangen etwas anders? AWT, Swing, JavaFX & SWT 2
3 Swing NullPointerException in AW Event-0? AWT, Swing, JavaFX & SWT 5
F Swing Auf JComboBox-Event erst NACH Auswahl reagieren AWT, Swing, JavaFX & SWT 8
P Swing Event das ausgelöst wird, sobald Änderung der Größe Abgeschlossen ist AWT, Swing, JavaFX & SWT 4
A Shift-Tab-Event auslösen AWT, Swing, JavaFX & SWT 5
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
W Swing Event bei Schließen des Fensters AWT, Swing, JavaFX & SWT 6
A Probleme mit dem KeyReleased-event AWT, Swing, JavaFX & SWT 3
J Doppelklick Event AWT, Swing, JavaFX & SWT 32
jueki Event bei Änderung der Spaltenbreite in einem JTable AWT, Swing, JavaFX & SWT 15
D jtabbedpane Event VOR tab-Wechsel AWT, Swing, JavaFX & SWT 3
N Swing JComboBox Event Problem AWT, Swing, JavaFX & SWT 5
M JTree => Event Dispatching Error AWT, Swing, JavaFX & SWT 2
D Event in Fenster ausgeben + Observer + kein Plan AWT, Swing, JavaFX & SWT 2
H warum kann ich das focus event nicht abfangen ? AWT, Swing, JavaFX & SWT 5
X Den Wert von JSpinner setzen ohne Event AWT, Swing, JavaFX & SWT 3
H KeyUp-Event/Ereignis AWT, Swing, JavaFX & SWT 6
C Event Frage AWT, Swing, JavaFX & SWT 7
M Swing WindowListener -> Event abbrechen? AWT, Swing, JavaFX & SWT 2
K JToggleButton deaktivieren (komplettes event nehmen) AWT, Swing, JavaFX & SWT 2
R JTextField - Event bei jedem Buchstaben AWT, Swing, JavaFX & SWT 2
R WindowClosing Event - Schließen rückgängig machen? AWT, Swing, JavaFX & SWT 2
M Actionlistener ohne Event -.-?! AWT, Swing, JavaFX & SWT 2
O Probleme beim Zeichnen und AWT-Event-Queue-0 Exception AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben