Advertisement
JoshuaStrutt

JPaint Main Mit Cursor

Jun 12th, 2015
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 19.30 KB | None | 0 0
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.util.List;
  4. import java.util.ArrayList;
  5. import javax.swing.JOptionPane;
  6. import java.io.*;
  7. import javax.swing.JFileChooser;
  8.  
  9. public class JPaint extends Frame {
  10.   public JPaint(String title) {
  11.     super(title);
  12.     addWindowListener(new WindowAdapter() {
  13.       public void windowClosing(WindowEvent evt) { dispose(); }
  14.     });
  15.     MyMouseListener myml = new MyMouseListener();
  16.     addMouseListener(myml);
  17.     addMouseMotionListener(myml);
  18.     int frameWidth = 620;
  19.     int frameHeight = 570;
  20.     setSize(frameWidth, frameHeight);
  21.     Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
  22.     int x = (d.width - getSize().width) / 2;
  23.     int y = (d.height - getSize().height) / 2;
  24.     setLocation(x, y);
  25.     setResizable(false);
  26.     setVisible(true);
  27.    
  28.     addMalWerkzeug(new MalWerkzeug(){
  29.          public String getName(){
  30.            return "Linie";
  31.          }
  32.          public int getKoordinatenAnzahl(){
  33.            return 2;
  34.          }
  35.          public void malen(Graphics g, MalObjekt mo){
  36.            List<Vector2> koordinaten   = mo.getKoordinaten();
  37.            g.drawLine(koordinaten.get(0).getX(),koordinaten.get(0).getY(),koordinaten.get(1).getX(),koordinaten.get(1).getY());
  38.          }
  39.          public void auswahlStart(MalObjekt mo){}
  40.          public void auswahlEnde(MalObjekt mo){}
  41.     });
  42.    
  43.     addMalWerkzeug(new MalWerkzeug(){
  44.          public String getName(){
  45.            return "Dreieck";
  46.          }
  47.          public int getKoordinatenAnzahl(){
  48.            return 3;
  49.          }
  50.          public void malen(Graphics g, MalObjekt mo){
  51.            List<Vector2> koordinaten   = mo.getKoordinaten();
  52.            g.drawLine(koordinaten.get(0).getX(),koordinaten.get(0).getY(),koordinaten.get(1).getX(),koordinaten.get(1).getY());
  53.            g.drawLine(koordinaten.get(1).getX(),koordinaten.get(1).getY(),koordinaten.get(2).getX(),koordinaten.get(2).getY());
  54.            g.drawLine(koordinaten.get(2).getX(),koordinaten.get(2).getY(),koordinaten.get(0).getX(),koordinaten.get(0).getY());
  55.          }
  56.          public void auswahlStart(MalObjekt mo){}
  57.          public void auswahlEnde(MalObjekt mo){}
  58.     });
  59.    
  60.     addMalWerkzeug(new MalWerkzeug(){
  61.          public String getName(){
  62.            return "Rechteck";
  63.          }
  64.          public int getKoordinatenAnzahl(){
  65.            return 2;
  66.          }
  67.          public void malen(Graphics g, MalObjekt mo){
  68.            List<Vector2> koordinaten   = mo.getKoordinaten();
  69.            int x = 0;
  70.            int y = 0;
  71.            int width = 0;
  72.            int height = 0;
  73.            if (koordinaten.get(0).getX() < koordinaten.get(1).getX()){
  74.               x = koordinaten.get(0).getX();
  75.               width = koordinaten.get(1).getX() - koordinaten.get(0).getX();
  76.            }
  77.            else{
  78.               x = koordinaten.get(1).getX();
  79.               width = koordinaten.get(0).getX() - koordinaten.get(1).getX();
  80.            }
  81.            if (koordinaten.get(0).getY() < koordinaten.get(1).getY()){
  82.               y = koordinaten.get(0).getY();
  83.               height = koordinaten.get(1).getY() - koordinaten.get(0).getY();
  84.            }
  85.            else{
  86.               y = koordinaten.get(1).getY();
  87.               height = koordinaten.get(0).getY() - koordinaten.get(1).getY();
  88.            }
  89.            g.drawRect(x,y,width,height);
  90.          }
  91.          public void auswahlStart(MalObjekt mo){}
  92.          public void auswahlEnde(MalObjekt mo){}
  93.     });
  94.    
  95.     addMalWerkzeug(new MalWerkzeug(){
  96.          public String getName(){
  97.            return "Oval";
  98.          }
  99.          public int getKoordinatenAnzahl(){
  100.            return 2;
  101.          }
  102.          public void malen(Graphics g, MalObjekt mo){
  103.            List<Vector2> koordinaten   = mo.getKoordinaten();
  104.            int x = 0;
  105.            int y = 0;
  106.            int width = 0;
  107.            int height = 0;
  108.            if (koordinaten.get(0).getX() < koordinaten.get(1).getX()){
  109.               x = koordinaten.get(0).getX();
  110.               width = koordinaten.get(1).getX() - koordinaten.get(0).getX();
  111.            }
  112.            else{
  113.               x = koordinaten.get(1).getX();
  114.               width = koordinaten.get(0).getX() - koordinaten.get(1).getX();
  115.            }
  116.            if (koordinaten.get(0).getY() < koordinaten.get(1).getY()){
  117.               y = koordinaten.get(0).getY();
  118.               height = koordinaten.get(1).getY() - koordinaten.get(0).getY();
  119.            }
  120.            else{
  121.               y = koordinaten.get(1).getY();
  122.               height = koordinaten.get(0).getY() - koordinaten.get(1).getY();
  123.            }
  124.            g.drawOval(x,y,width,height);
  125.          }
  126.          public void auswahlStart(MalObjekt mo){}
  127.          public void auswahlEnde(MalObjekt mo){}
  128.     });
  129.    
  130.     addMalWerkzeug(new MalWerkzeug(){
  131.          public String getName(){
  132.            return "Kreis";
  133.          }
  134.          public int getKoordinatenAnzahl(){
  135.            return 2;
  136.          }
  137.          public void malen(Graphics g, MalObjekt mo){
  138.            List<Vector2> koordinaten   = mo.getKoordinaten();
  139.            int r =  koordinaten.get(0).distanceTo(koordinaten.get(1));
  140.            g.drawOval(koordinaten.get(0).getX()-r,koordinaten.get(0).getY()-r,r*2,r*2);
  141.          }
  142.          public void auswahlStart(MalObjekt mo){}
  143.          public void auswahlEnde(MalObjekt mo){}
  144.     });
  145.    
  146.     addMalWerkzeug(new MalWerkzeug(){
  147.          public String getName(){
  148.            return "Polygon endlos";
  149.          }
  150.          public int getKoordinatenAnzahl(){
  151.            return 0;
  152.          }
  153.          public void malen(Graphics g, MalObjekt mo){
  154.            List<Vector2> koordinaten   = mo.getKoordinaten();
  155.            int[] x = new int[koordinaten.size()];
  156.            int[] y = new int[koordinaten.size()];
  157.            int counter = 0;
  158.            for (Vector2 v : koordinaten){
  159.              x[counter] = v.getX();
  160.              y[counter] = v.getY();
  161.              counter++;
  162.            }
  163.            g.drawPolygon(x,y,koordinaten.size());
  164.          }
  165.          public void auswahlStart(MalObjekt mo){}
  166.          public void auswahlEnde(MalObjekt mo){}
  167.     });
  168.    
  169.    
  170.     addMalWerkzeug(new MalWerkzeug(){
  171.          public String getName(){
  172.            return "Polygon";
  173.          }
  174.          public int getKoordinatenAnzahl(){
  175.            return 0;
  176.          }
  177.          public void malen(Graphics g, MalObjekt mo){
  178.            List<Vector2> koordinaten   = mo.getKoordinaten();
  179.            int counter;
  180.            for (counter = 0;counter < mo.getKoordinaten().size() -1;counter++) {
  181.                g.drawLine(mo.getKoordinaten().get(counter).getX(),mo.getKoordinaten().get(counter).getY(),mo.getKoordinaten().get(counter+1).getX(),mo.getKoordinaten().get(counter+1).getY());
  182.            }
  183.          }
  184.          public void auswahlStart(MalObjekt mo){}
  185.          public void auswahlEnde(MalObjekt mo){}
  186.     });
  187.    
  188.     addMalWerkzeug(new MalWerkzeug(){
  189.          public String getName(){
  190.            return "Text";
  191.          }
  192.          public int getKoordinatenAnzahl(){
  193.            return 1;
  194.          }
  195.          public void malen(Graphics g, MalObjekt mo){
  196.            List<Vector2> koordinaten   = mo.getKoordinaten();
  197.            g.drawString(String.valueOf(mo.getSettings()),koordinaten.get(0).getX(),koordinaten.get(0).getY());
  198.          }
  199.          public void auswahlStart(MalObjekt mo){}
  200.          public void auswahlEnde(MalObjekt mo){
  201.              String eingabe = JOptionPane.showInputDialog(null,"Geben Sie den gewünschten Text ein","Text zeichnen",JOptionPane.PLAIN_MESSAGE);
  202.              if (eingabe == null){
  203.                mo.setDisposed(true);
  204.              }
  205.              mo.setSettings(eingabe);
  206.          }
  207.     });
  208.    
  209.     int counter = 0;
  210.     for (MalWerkzeug mw : malWerkzeuge){
  211.         buttons.add(new Button(mw.getName(),25,50+(30*counter),100,25));
  212.         counter++;
  213.     }
  214.    
  215.     buttons.add(new Button("Zurücksetzten",135,50,100,25));
  216.     buttons.add(new Button("Rückgängig",135,80,100,25));
  217.     buttons.add(new Button("Speichern",135,140,100,25));
  218.     buttons.add(new Button("Laden",135,170,100,25));
  219.    
  220.     repaint();
  221.    
  222.     // Anfang Komponenten
  223.     // Ende Komponenten
  224.   }
  225.  
  226.   public static void main(String[] args) {
  227.     new JPaint("JPaint");
  228.   }
  229.  
  230.   public void addMalWerkzeug(MalWerkzeug mw){
  231.        malWerkzeuge.add(mw);
  232.   }
  233.  
  234.   // Anfang Attribute
  235.   private Vector2 posKlick = new Vector2(); //Wo wurde als letztes geklickt
  236.   private String status = "Linie";  //Welcher Button ist angewählt
  237.   private List<MalWerkzeug> malWerkzeuge = new ArrayList<MalWerkzeug>();  //Hier werden alle möglichen Objekte zum zeichnen gespeichtert. Praktisch
  238.                                                                     //Praktisch eine Ansammlung von Werkzeugen
  239.   private Bild bild = new Bild();
  240.   private List<Button> buttons = new ArrayList<Button>(); //Hier befinden sich alle Buttons, die gezeichnet werden sollen
  241.   private boolean buttonGeklickt; //true = ein Button wurde gedrückt. false = eine andere Stelle, als ein Button wurde gedrückt
  242.   private String alterStatus; //Hiermit kann man den vorherigen Status aulesen, falls dieser verändert wurde
  243.   private boolean neuerStatus; //true = ein Button wurde gedrückt, der den aktuellen Status verändert
  244.   private MalObjekt malObjekt = new MalObjekt(); //Das immmoment zu editierende MalObjekt
  245.   public List<Vector2> klicke() {           //Alle Positionen die bis jetzt geklickt wurden
  246.     return malObjekt.getKoordinaten();
  247.   }
  248.   private Vector2 malPos = new Vector2(250,50);
  249.  
  250.   private boolean drawPreview = false;
  251.   private Vector2 posMouseDrag = new Vector2();
  252.   private int cursor = Cursor.DEFAULT_CURSOR;
  253.  
  254.   // Ende Attribute
  255.  
  256.   // Anfang Methoden
  257.  
  258.   public void paint(Graphics g){
  259.     Vector2 malSize = bild.getGroesse();
  260.     g.drawRect(malPos.getX(),malPos.getY(),malSize.getX(),malSize.getY());
  261.     for (Button b : buttons) {
  262.       Vector2 pos = b.getPosition();
  263.       Vector2 size = b.getSize();
  264.       g.setColor(Color.gray);
  265.       g.fillRect(pos.getX(),pos.getY(),size.getX(),size.getY());  //Wir zeichnen die Umrandung des Buttons
  266.       if (b.getName() == status) { //Wir zeichnen aktuell einen Button, der angewählt ist
  267.         g.setColor(Color.red); //Falls der Button angewählt ist, wird die Schriftfarbe schwarz
  268.       }
  269.       else{ //Wir zeichnen einen nicht angewählten Button
  270.         g.setColor(Color.black); //Falls nicht, wird die Schriftfarbe schwarz
  271.       }
  272.       g.drawString(b.getName(),pos.getX() + 4,pos.getY()+ size.getY()/2);  //Wir zeichnen die Beschriftung des Buttons
  273.       g.setColor(Color.black); //Wir setzten die Farbe wieder zurück
  274.     }
  275.     int counter = 0;
  276.     for (Vector2 v: klicke()){ //Wir zeichnen alle bis jetzt geklickten Punkte als Oval
  277.       if (counter == klicke().size() - 1){
  278.         g.setColor(Color.green);
  279.       }
  280.       int ovalWidth = 4;
  281.       int ovalHeight = 4;
  282.       g.fillOval(v.getX()-ovalWidth/2,v.getY()-ovalHeight/2,ovalWidth,ovalHeight);
  283.       g.setColor(Color.black);
  284.       counter++;
  285.     }
  286.     for (MalObjekt mo : bild.getMalObjekte()){
  287.       for (MalWerkzeug mw : malWerkzeuge){
  288.         if (mo.getName().compareTo(mw.getName()) == 0){
  289.           mw.malen(g,mo);
  290.         }
  291.       }
  292.     }
  293.     if (drawPreview){
  294.       boolean gefunden = false;
  295.       for (MalWerkzeug mw : malWerkzeuge){
  296.         if (mw.getKoordinatenAnzahl()  == 1){
  297.          
  298.         }
  299.         else if(mw.getName() == status && (klicke().size() == mw.getKoordinatenAnzahl() -1 || mw.getKoordinatenAnzahl() == 0) ){
  300.           List<Vector2> klickePreview = new ArrayList<Vector2>();
  301.           klickePreview.addAll(klicke());
  302.           klickePreview.add(posMouseDrag);
  303.           g.setColor(Color.red);
  304.           MalObjekt tmo = new MalObjekt("",klickePreview);
  305.           mw.malen(g,tmo);
  306.           g.setColor(Color.black);
  307.           gefunden = true;
  308.         }
  309.       }
  310.     }
  311.     this.setCursor(cursor);
  312.   }
  313.  
  314.   // Ende Methoden
  315.  
  316.   public class MyMouseListener extends MouseAdapter{
  317.    
  318.     public void mouseClicked(MouseEvent event){
  319.      
  320.       switch ( event.getButton() )
  321.       {
  322.         case MouseEvent.BUTTON1 : leftClick(event);  break ;
  323.         case MouseEvent.BUTTON3 : rightClick(event); break ;
  324.       }
  325.       repaint();
  326.     }
  327.    
  328.     private void leftClick(MouseEvent event){
  329.       posKlick.setX(event.getX());
  330.       posKlick.setY(event.getY());
  331.       buttonGeklickt = false;
  332.       for (Button b : buttons) { //Wir führen diese Routine für jeden Button ab, um zu überprüfen, ob er geklickt wurde
  333.         Vector2 pos = b.getPosition();
  334.         Vector2 size = b.getSize();
  335.         if (posKlick.getX() >= pos.getX() && posKlick.getX() <= (pos.getX()+size.getX()) && posKlick.getY() >= pos.getY() && posKlick.getY() <= (pos.getY()+size.getY())) {
  336.           alterStatus = status; //Der alte Status wird zwischengespeichert
  337.           status = b.getName();  //Der neue Status wird zugewiesen
  338.           if (alterStatus == status){
  339.             neuerStatus = false;
  340.           }
  341.           else{
  342.             neuerStatus = true;
  343.           }
  344.           buttonGeklickt = true; //Der Mouseklick befand sich auf einem Button
  345.         }
  346.       }
  347.       if (!buttonGeklickt){   //Wenn kein Button gedrückt wurde
  348.         Vector2 pos = malPos;
  349.         Vector2 size = bild.getGroesse();
  350.         if (posKlick.getX() >= pos.getX() && posKlick.getX() <= (pos.getX()+size.getX()) && posKlick.getY() >= pos.getY() && posKlick.getY() <= (pos.getY()+size.getY())) {
  351.           //Der Klick wird nur dann registriert, wenn er im Bereich des Bildes liegt
  352.           boolean gefunden = false;
  353.           for (MalWerkzeug mw : malWerkzeuge){
  354.             if (mw.getName() == status && gefunden == false){
  355.               gefunden = true;
  356.               klicke().add(new Vector2(event.getX(),event.getY()));
  357.               if (klicke().size() == 1){
  358.                 malObjekt.setName(status);
  359.                 mw.auswahlStart(malObjekt);
  360.                 if (malObjekt.getDisposed() == true){
  361.                   malObjekt = new MalObjekt();
  362.                 }
  363.                 else{
  364.                   posMouseDrag =   new Vector2(event.getX(),event.getY());
  365.                 }
  366.               }
  367.               if ( klicke().size() == mw.getKoordinatenAnzahl()){
  368.                 repaint();
  369.                 mw.auswahlEnde(malObjekt);
  370.                 if (malObjekt.getDisposed() == false){
  371.                   bild.getMalObjekte().add(malObjekt);
  372.                 }
  373.                 malObjekt = new MalObjekt();
  374.               }
  375.             }
  376.           }
  377.         }
  378.       }
  379.       else{
  380.         boolean gefunden = false;
  381.         if (neuerStatus == false){
  382.           for (MalWerkzeug mw : malWerkzeuge){
  383.             if (mw.getName() == status && gefunden == false){
  384.               gefunden = true;
  385.               if (mw.getKoordinatenAnzahl() == 0 && klicke().size() == 0 == false){
  386.                 mw.auswahlEnde(malObjekt);
  387.                 if (malObjekt.getDisposed() == false){
  388.                   bild.getMalObjekte().add(malObjekt);
  389.                 }
  390.                 malObjekt = new MalObjekt();
  391.               }
  392.             }
  393.           }
  394.         }
  395.         if (neuerStatus){
  396.           malObjekt = new MalObjekt();  //Alle bis jetzt gesetzen Koordinaten werden zurückgesetzt
  397.         }
  398.         if (status == "Zurücksetzten"){
  399.           if (bild.getMalObjekte().size() > 0){
  400.             if(JOptionPane.showConfirmDialog(null,"Wollen Sie wirklich alle hinzugefügten Objekte löschen ?","Zurücksetzen",JOptionPane.YES_NO_OPTION) == 0){
  401.               malObjekt = new MalObjekt();
  402.               bild.getMalObjekte().clear(); //Alle Objekte werden gelöscht
  403.             }
  404.           }
  405.           status = alterStatus;  //Der Status wird wieder zurück gesetzt
  406.         }
  407.         if (status == "Rückgängig"){
  408.           if (bild.getMalObjekte().size() > 0){
  409.             if(JOptionPane.showConfirmDialog(null,"Wollen Sie wirklich das zuletzt hinzugefügte Objekt löschen ?","Rückgängig",JOptionPane.YES_NO_OPTION) == 0){
  410.               malObjekt = new MalObjekt();
  411.               bild.getMalObjekte().remove(bild.getMalObjekte().size()-1); //Das letzte Objekt wird gelöscht
  412.             }
  413.           }
  414.           status = alterStatus;  //Der Status wird wieder zurück gesetzt
  415.         }
  416.         if (status == "Speichern"){
  417.           try{
  418.             JFileChooser fileChooser = new JFileChooser();
  419.             fileChooser.setDialogTitle("Speichern...");
  420.             if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
  421.               File datei = fileChooser.getSelectedFile();
  422.               FileOutputStream fos = new FileOutputStream(datei.getAbsolutePath());
  423.               ObjectOutputStream objectStream = new ObjectOutputStream (fos);
  424.               objectStream.writeObject (bild);
  425.             }
  426.           }
  427.           catch (Exception ex){
  428.             JOptionPane.showMessageDialog(null,"Fehler beim Speichern des Bildes: " + ex.toString(),"Speichern",JOptionPane.ERROR_MESSAGE);
  429.           }
  430.           status = alterStatus;
  431.         }
  432.         if (status == "Laden"){
  433.           if (bild.getMalObjekte().size() == 0 || JOptionPane.showConfirmDialog(null,"Wenn sie ein Bild laden, wird das alte unwiderruflich gelöscht, fortfahren ?","Laden",JOptionPane.YES_NO_OPTION) == 0){
  434.             try{
  435.               JFileChooser fileChooser = new JFileChooser();
  436.               fileChooser.setDialogTitle("Laden...");
  437.               if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
  438.                 File datei = fileChooser.getSelectedFile();
  439.                 FileInputStream input = new FileInputStream(datei.getAbsolutePath());
  440.                 ObjectInputStream objectInput = new ObjectInputStream (input);
  441.                 Object obj = objectInput.readObject();
  442.                 bild = (Bild) obj;
  443.               }
  444.             }
  445.             catch (Exception ex){
  446.               JOptionPane.showMessageDialog(null,"Fehler beim Laden des Bildes: " + ex.toString(),"Laden",JOptionPane.ERROR_MESSAGE);
  447.             }
  448.           }
  449.           status = alterStatus;
  450.         }
  451.       }
  452.     }
  453.    
  454.     private void rightClick(MouseEvent event){
  455.       malObjekt = new MalObjekt();
  456.     }
  457.    
  458.     public void mouseMoved(MouseEvent event){
  459.       int cursorTemp = Cursor.DEFAULT_CURSOR;
  460.       boolean bildHover = false;
  461.       posMouseDrag.setX(event.getX());
  462.       posMouseDrag.setY(event.getY());
  463.       Vector2 pos = malPos;
  464.       Vector2 size = bild.getGroesse();
  465.       boolean repaint = false;
  466.       if (posMouseDrag.getX() >= pos.getX() && posMouseDrag.getX() <= (pos.getX()+size.getX()) && posMouseDrag.getY() >= pos.getY() && posMouseDrag.getY() <= (pos.getY()+size.getY())){
  467.         bildHover = true;
  468.       }
  469.       if (bildHover) {
  470.         cursorTemp = Cursor.CROSSHAIR_CURSOR;
  471.       }
  472.       else{
  473.         cursorTemp = Cursor.DEFAULT_CURSOR;
  474.       }
  475.       if (cursorTemp > cursor | cursorTemp < cursor) {
  476.           cursor = cursorTemp;
  477.       }
  478.       if (klicke().size() > 0 ){      
  479.         boolean drawPreviewTemp = false;  
  480.         if (bildHover){
  481.           drawPreviewTemp = true;
  482.         }else{
  483.           drawPreviewTemp = false;
  484.         }
  485.         if (drawPreview = !drawPreview) {
  486.           drawPreview = drawPreviewTemp;
  487.           repaint = true;
  488.         }      
  489.       }
  490.       if (repaint || drawPreview) {
  491.         repaint();
  492.       }        
  493.     }
  494.   }
  495. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement